Java - 1 (자바 시작)

hoegon kim·2022년 11월 15일
0

JAVA

목록 보기
1/26
post-thumbnail

1. 자바 시작

1) 자바 개요

자바


자바는 C++ 과는 달리 처음부터 객체 지향 언어로 개발된 프로그래밍 언어 입니다. 또한, 자바는 가상 머신(JVM)을 사용하여 어느 운영체제에서나 같은 형태로 실행될 수 있습니다. 현재 자바는 전 세계에서 가장 많이 사용 하는 프로그래밍 언어 중 하나입니다.

class Test {

    int field1;

    String field2;

 

    public void method1() {

        System.out.println("자바 프로그래밍!!");

    }

}

2) 자바 기초

자바란?

자바는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어입니다.

자바는 자바 가상 머신을 사용하여, 운영체제와는 독립적으로 동작할 수 있습니다. 따라서 자바는 어느 운영체제에서나 같은 형태로 실행 될 수 있습니다.

바로 이러한 점이 수많은 개발자로 하여금 자바를 사용하게 하는 원동력이 되고 있습니다.

현재 자바는 전 세계에서 가장 많이 사용하는 프로그래밍 언어 중 하나 입니다.


자바의 역사

처음에 자바는 가전제품 내에서 동작하는 임베디드 프로그램을 위한 언어로 썬 마이크로 시스템즈사의 제임스 고슬링팀에 의해 개발되 었습니다.
1991년 오크라는 이름으로 시작하여, 1996년에 발표 된 1.0.2 버전부터 자바라는 이름을 사용하게 됩니다.

1998년 발표된 J2SE 1.2 에서는 웹에서도 자바를 돌릴수 있게 해 주는 자바 애플릿이 추가 되며, 자바의 인기는 급상승 하게 됩니다.

그 후 버전이 업데이트 될 때마다 다양한 기능이 지원되며 자바는 꾸준한 인기를 누리게 됩니다.

이후 2009년에 썬 마이크로시스템즈사가 오라클과 인수 합병됨에 따라 오라클로 소유권이 넘어 갑니다.


자바의 특징

자바 언어가 가지는 장점은 다음과 같습니다.

  1. 자바는 운영체제와는 독립적으로 실행할 수 있습니다.

  2. 자바는 불필요한 기능을 과감히 제거하여 다른 언어에 비해 배우기가 쉽습니다

  3. 자바는 자동 메모리 관리 등을 지원하여 다른 언어에 비해 안정성이 높습니다.

  4. 자바는 연산자 오버로딩을 금지하고 재네릭을 도입함으로써 코드의 가독성을 높였습니다.

  5. 자바에 관한 수많은 참고 자료를 찾을 수 있습니다.

자바 언어가 가지는 단점은 다음과 같습니다.

  1. 자바는 실행을 위해 자바 가상 머신을 거쳐야 하므로, 다른 언어에 비해 실행 속도가 느립니다.

  2. 자바는 예외 처리가 잘 되어 있지만, 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있습니다.

  3. 자바는 다른 언어에 비해 작성해야 하는 코드의 길이가 긴 편 입니다.


자바 표준

썬 마이크로시스템즈사는 1997년에 ISO/IEC에서 표준화 절차를 밟았으나 성사 되지 못합니다. 이후 자바는 자발적 표준으로써 자바 커뮤니티 프로세스를 통해 관리 됩니다.

2007년에 썬 마이크로시스템즈사는 자바의 코어 부분을 대부분 GPL 라이선스로 오픈합니다.

이후 2009년에 썬 마이크로시스템즈사가 오라클과 인수 합병됨에 따라 자바에 대한 권리 및 유지보수 또한 현재는 오라클에서 수행하고 있습니다.

자바의 버전은 보통 JDK 또는 Java SE 버전으로 나타냅니다.

초기 버전인 1.0/1.1 버전에서는 JDK(Java Development Kit)를 사용 했지만, JDK 1.2를 발표 하면서 J2SE로 변경합니다.

J2SE(Java2 Standard Edition)라는 명칭 또한, 2006년 JDK 1.6부터 Java SE(Java Standard Edition)로 변경됩니다.

가장 최신 버전의 자바는 2014년에 발표된 Java SE 8버전 입니다.

현재에는 2017년 제정을 목표로 하는 Java SE 9 버전 제정과 관련된 논의가 계속 진행되고 있습니다.

자바 최신 표준인 Java SE8에 대한 더 자세한 사항은 다음 페이지를 참고하면 됩니다.


3) 자바 프로그래밍

자바 프로그램의 실행 과정

자바로 작성된 프로그램은 다음과 같은 순서로 실행 됩니다.


자바 컴파일러

자바 컴파일러는 자바를 가지고 작성한 자바 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환합니다.

자바 컴파일러는 자바를 설치하면 javac.exe라는 실행 파일 형태로 설치됩니다.


자바 바이트 코드(Java bytecode)

자바 바이트 코드(Java bytecode)란 자바 가상 머신이 이해할 수 있는 언어로 변환된 자바 소스 코드를 의미합니다.

자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 자바 바이트 코드라고 불리고 있습니다.

이러한 자바 바이트 코드의 확장자는 .class 입니다.

자바 바이트 코드는 자바 가상 머신만 설치되어 있으면, 어떤 운영체제라도 실행될 수 있습니다.


자바 가상 머신(JVM)

자바 가상 머신(JVM, Java Vitual Machine)이란 자바 바이트 코드를 실행시키기 위한 가상의 기계라고 할 수 있습니다.

자바로 작성된 모든 프로그램은 자바 가상 머신에만 실행 될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 합니다.

따라서 오라클은 대부분의 주요 운영체재뿐만 아니라 웹 브라우저, 스마트 폰, 가전기기 등에서도 자바 가상 머신을 손쉽게 설치할 수 있도록 지원하고 있습니다.

위의 그림처럼 서로 다른 운영체제라도 자바 가상 머신만 설치되어 있다면, 같은 자바 프로그램이 아무런 추가 조치없이 동작할 수 있습니다.

따라서 개발자는 한 번만 프로그램을 작성하면, 모든 운영체재에서 같이 사용할 수 있는 장점이 있습니다.

단, 자바 프로그램과는 달리 자바 가상 머신(JVM)은 운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야합니다.

또한, 자바 프로그램은 일반 프로그램보다 자바 가상 머신이라는 한 단계를 더 거쳐야 하므로, 상대적으로 실행 속도가 느리다는 단점을 가지고 있습니다.


자바 가상 머신의 구성

자바 가상 머신(JVM)은 다음과 같이 구성됩니다.

  1. 자바 인터프리터(interpreter)
  2. 클래스 로더(class loader)
  3. JIT 컴파일러(Just-In-Time compiler)
  4. 가비지 컬렉터(garbage collector)

자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 하는 것이 자바 인터프리터(inter preter)입니다.

자바는 동적으로 클래스를 읽어오므로, 프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결됩니다.

이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 바로 클래스 로더 입니다.

JIT 컴파일러란 프로그램이 실행중인 런타임에 실제 기계어로 변환해 주는 컴파일러를 의미합니다.

동적 번역이라고도 불리는 이 기법은 프로그램의 실행 속도를 향상 시키기 위해 개발되었습니다.

즉, JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용 합니다.

자바 가상 머신은 가비지 컬렉터를 이용하여 더는 사용하지 않는 메모리를 자동으로 회수해 줍니다.

따라서 개발자가 따로 메모리를 관리하지 않아도 되므로, 더욱 손쉽게 프로그래밍을 할 수 있도록 도와줍니다.

4) 자바 프로그램

간단한 자바 프로그램
자바 프로그램은 한 개 이상의 클래스로 구성 됩니다.
이러한 클래스는 한 개 이상의 필드나 메소드로 구성 됩니다.

간단한 자바 프로그램의 기본 구조는 다음과 같습니다.

class 클래스이름 {

    필드의 선언

    필드의 선언

    ...

    메소드의 선언

    메소드의 선언

    ...

}
class Test {

    int field1;

    String field2;

 

    public void method1() {

        System.out.println("자바 프로그래밍!!");

    }

}

main() 메소드

자바 프로그램이 실행되면 맨 먼저 main() 메소드를 찾아 그 안의 모든 명령문을 차례대로 실행합니다.

따라서 하나의 자바 프로그램에는 main() 메소드를 가지는 클래스가 반드시 하나는 존재해야 합니다.

자바에서 main() 메소드는 다음과 같이 선언합니다.


public static void main(String[] args) {

    ...

}

위의 원형처럼 main() 메소드는 반드시 public static void로 선언 되어야 합니다.

public, static과 같은 제어자에 대한 더 자세한 사항은 자바 제어자 수업에서 확인할 수 있습니다.

자바 클래스 파일(*.java)에 해당 public 클래스의 이름과 같아야 합니다.

이러한 public 클래스는 자바 클래스 파일마다 단 한개만 가질 수 있습니다.


명령문(statement)

자바 프로그램의 동작을 명시하고, 이러한 동작을 컴퓨터에 알려주는 데 사용되는 문장을 명령문(statement)이라고 합니다.

자바의 모든 명령문은 반드시 세미콜론(;)으로 끝나야합니다.


주석(comment)

주석이란 코드에 대한 이해를 돕는 설명을 적거나 디버깅을 위해 작성하는 일종의 메모입니다.

자바 컴파일러는 주석은 무시하고 컴파일하므로, 실제 실행 결과에는 아무런 영향을 주지 않습니다.

자바에서 주석을 작성하는 문법은 다음과 같이 두가지 방법이 있으며, 그차이는 전혀 없습니다.

자바의 한 줄 주석은 시작위치에 //을 사용하고, 여러줄 주석은 /* 로 시작해서 반드시 */로 끝나야 합니다.

예제

1. // 한 줄 주석

2. /* 여러

   줄

   주석 */
   

다음 예제는 자바에서 여러 줄 주석 안에 또 다른 한 줄 주석을 중첩해서 사입하는 예제입니다.

예제

/* 여러 줄

     // 이렇게 두 줄 주석 안에 또 다른 한 줄 주석을 삽입할 수 있습니다.

주석입니다. */

위의 예제처럼 자바에서 여러 줄 주석 안에 또 다른 한 줄 주석을 삽입할 수 있습니다.

하지만 다음 예제처럼 여러 줄 주석 안에 또 다른 여러 줄 주석을 중첩해서 삽입할 수 는 없습니다.

예제


① /* 여러 줄

②     /* 또 다른 여러 줄 주석입니다. */

③ 주석입니다. */

위의 예제처럼 여러 줄 주석 안에 또 다른 여러 줄 주석을 삽입하면, ②번 라인에서 삽입한 주석의 종료 기호(/)를 ①번 라인에서 시작한 첫 번째 주석이 자신의 종료 기호(/)로 잘못 인식하게 됩니다.

따라서 위 예제의 ③번 라인은 주석으로 인식되지 못하고, 컴파일 시 오류가 발생하게 됩니다.

그러므로 자바에서 여러 줄 주석은 절대로 중첩해서 사용해서는 안 됩니다.

5) System.out.printIn()


자바 표준 입출력 클래스

사용자가 프로그램과 대화 하기 위해서는 사용자와 프로그램사이의 입출력을 담당하는 수단이 필요합니다.

자바에서는 모든 것이 객체로 표현되므로, 입출력을 담당하는 수단 또한 모두 객체입니다.

C언어의 printf() 함수나 scanf() 함수처럼 자바에서는 System이라는 표준 입출력 클래스를 정의하여 제공하고 있습니다.

이러한 System 클래스는 java.lang패키지에 포함되어 제공됩니다.

System 클래스에는 표준 입출력을 위해 다음과 같은 클래스 변수(static variae)가 정의 되어있습니다.

  1. System.in

  2. System.out

  3. System.err

자바에서는 System.in 스트림을 사용하여 표준 입력 작업을 수행합니다.

또한, System.out 스트림이나 System.err 스트림을 사용하여 표준 출력 작업을 수행합니다.

아직 클래스나 객체, 메소드, 스트림 등에 대해 자세히 배우기 전이지만, 앞으로 배우게 될 대부분의 예제를 이해하기 위해서는 표준 입출력 객체에 대해 먼저 살펴볼 필요가 있습니다.


System.out.printIn()

System.out.printIn() 메소드를 사용하면 모니터에 전달된 데이터를 출력한 후에 줄 바꿈까지 해줍니다.

printIn() 메소드를 사용하는 문법은 다음과 같습니다.

System.out.println(출력할데이터);

이렇게 표준 출력 스트림에 전달된 데이터는 스트림을 통해 출력 장치로 전달되어 출력됩니다.

System.out.print(7); // print() 메소드는 줄 바꿈을 하지 않음.

System.out.println(3); // 정수 출력

System.out.println(3.14); // 실수 출력

System.out.println("자바!"); // 문자열 출력

System.out.println("문자열끼리의 " + "연결도 가능합니다.");

System.out.println("숫자" + 3 + "과 문자열의 연결도 가능합니다.");

실행 결과

73

3.14

자바!!

문자열끼리의 연결도 가능합니다.

숫자3과 문자열의 연결도 가능합니다.

println() 메소드와는 달리 print() 메소드는 전달된 데이터를 출력한 후에 줄 바꿈을 하지 않습니다.


6) JAVA 8 변경 사항


JAVA8 에서의 변경 사항

2014년에 발표된 자바의 최신 버전인 Java SE 8 버전에서는 많은 사항이 변경되거나 새롭게 추가되었습니다.

Java SE 8에서 변경되거나 새롭게 추가된 사항 중에서 주목할 만한 특징은 다음과 같습니다.

  1. 람다 표현식(lambda expression) : 함수형 프로그래밍

  2. 스트림 API(stream API) : 데이터의 추상화

  3. java.time 패키지 : Joda-Time을 이용한 새로운 날짜와 시간 API

  4. 나즈혼(Nashorn) : 자바스크립트의 새로운 엔진


람다 표현식(Lambda Expression)

람다 표현식(lambda expression)이란 간단히 말해 메소드를 하나의 식으로 표현한 것입니다.

즉, 식별자 없이 실행할 수 있는 함수의 표현식을 의미하며, 따라서 익명함수라고도 부릅니다.

메소드를 이렇게 람다 표현식으로 표현하면 클래스르 만들고 객체를 생성하지 않아도 메소드를 사용할 수 있습니다.

또한, 람다 표현식은 메소드의 매개변수로 전달될 수도 있고, 메소드의 결과값으로 반환될 수도 있습니다.

이러한 람다 표현식은 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높이는 데 그 목적이 있습니다.

Java SE 8 버전부터는 람다 표현식을 사용하여 자바에서도 함수형 프로그래밍을 할 수 있게 되었습니다.

다음 예제는 전통적인 방식의 스레드 생성과 람다 표현식을 사용한 스레드 생성을 비교하는 예제입니다.

new Thread(new Runnable() {

    public void run() {

        System.out.println("전통적인 방식의 일회용 스레드 생성");

    }

}).start();

 

new Thread(()->{

    System.out.println("람다 표현식을 사용한 일회용 스레드 생성");

}).start();

실행 결과
전통적인 방식의 일회용 스레드 생성
람다 표현식을 사용한 일회용 스레드 생성

람다 표현식에 대한 더 자세한 사항은 자바 JAVA8 람다 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_lambda_concept


스트림 API(Stream API)

자바에서는 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용합니다.

또한, 이렇게 저장된 데이터에 접근하기 위해서는 반복문이나 반복자를 사용하여 매번 코드를 작성해야 했습니다.

하지만 이렇게 작성된 코드는 길이가 너무 길고 가독성도 떨어지며, 코드의 재사용이 거의 불가능 합니다.

또한, 데이터베이서의 쿼리와 같이 정형화된 처리 패턴을 가지지 못했기에 데이터마다 다른 방법으로 접근해야만 했습니다.

이러한 문제점을 극복하기 위해서 Java SE 8 버전부터 도입된 방법이 바로 스트림(stream) API 입니다.

스트림 API는 데이터를 추상화하여 다루므로, 다양한 방식으로 저장된 데이터를 읽고 쓰기 위한 공통된 방법을 제공합니다.

따라서 스트림 API를 이용하면 배열이난 컬렉션 뿐만 아니라 파일에 저장된 데이터도 모두 같은 방법으로 다룰 수 있습니다.


String[] arr = new String[]{"넷", "둘", "셋", "하나"};

 

// 배열에서 스트림 생성

Stream<String> stream1 = Arrays.stream(arr);

stream1.forEach(e -> System.out.print(e + " "));

System.out.println();

 

// 배열의 특정 부분만을 이용한 스트림 생성

Stream<String> stream2 = Arrays.stream(arr, 1, 3);

stream2.forEach(e -> System.out.print(e + " "));

넷 둘 셋 하나
둘 셋

스트림 API에 대한 더 자세한 사항은 자바 JAVA8 스트림 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_stream_concept


Java.time 패키지

JDK 1.0 에서는 Date 클래스를 사용하여 날짜에 관한 처리를 수행했습니다.

하지만 Date 클래스는 현재 대부분의 메소드가 사용을 권장하지 않고(deprecated)있습니다.

JDK 1.1 부터 새롭게 제공된 Calendar 클래스는 날짜와 시간에 대한 정보를 얻을 수는 있지만, 다음과 같은 문제점을 가지고 있습니다.

1.Calendar 인스턴스는 불변 객체(immutable object)가 아니라서 값이 수정될 수 있습니다.

2.윤초(leap second)와 같은 특별한 상황을 고려하지 않습니다.

  1. Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지 표현해야하는 불편함이 있습니다.

따라서 많은 자바 개발자들은 Calendar 클래스뿐만 아니라 더 나은 성능의 Joda-Time이라는 라이브러리를 함께 사용햐 왔습니다.

Java SE 8 버전에서는 이러한 Joda-Time 라이브러리를 발전시킨 새로운 날짜와 시간 API인 java.time패키지를 제공합니다.

java.time 패키지는 위와 같은 문제점을 모두 해결했으며, 다양한 기능을 지원하는 다수의 하위 패키지를 포함하고 있습니다.

LocalDate today = LocalDate.now();

System.out.println("올해는 " + today.getYear() + "년입니다.");

 

LocalDate otherDay = today.withYear(1982);

System.out.println("올해는 " + otherDay.getYear() + "년입니다.");

올해는 2017년입니다.
올해는 1982년입니다.

java.time 패키지에 대한 더 자세한 사항은 자바 JAVA8 java.time 수업에서 확인할 수 있습니다.

http://www.tcpschool.com/java/java_time_javaTime


나즈혼(Nashorn)

지금까지 자바스크립트의 기본 엔진으로는 모질라의 리노(Rhino)가 사용되어 왔습니다.

모질라의 리노(Rhino)는 그 당시에는 훌륭한 스크립트 엔진이었습니다.

하지만 세월이 흐르면서 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 등 노후화된 모습을 보여주게 됩니다.

따라서 이번 Java SE 8 버전부터는 자바스크립트의 새로운 엔진으로 오라클의 나즈혼(Nashorn)을 도입하게 됩니다.

나즈혼(Nashorn)은 기존에 사용되어 온 리노에 비해 성능과 메모리 관리면에서 크게 개선된 스크립트 엔진입니다.

0개의 댓글