[JAVA] 빠르게 정리하는 자바 문법 (1)
해당 글은 아래 링크를 참고하여 작성되었습니다.
1. 자바 시작
1. 자바 개요
Java는 C++과는 달리 처음부터 객체 지향 언어로 개발된 프로그래밍 언어다.
Java는 JVM을 사용하여 어느 OS에서나 같은 형태로 실행될 수 있다.
2. 자바 역사
처음에 자바는 가전제품 내에서 동작하는 임베디드 프로그램을 위한 언어로 썬 마이크로시스템즈사의 제임스 고슬링 팀에 의해 개발되었다.
1991년에 오크라는 이름으로 시작하여 1996년에 발표된 1.0.2 버전부터 자바라는 이름을 사용하였다.
1998년 발표된 J2SE 1.2에서는 웹에서도 자바를 돌릴 수 있게 해 주는 자바 애플릿이 추가되며 자바의 인기가 증가하게 된다.
이후 2009년에 썬 마이크로시스템즈사가 오라클과 인수 합병됨에 따라 자바 또한 오라클로 소유권이 넘어갔다.
3. 자바 특징
1. 자바는 운영체제와는 독립적으로 실행할 수 있다.
2. 자바는 자동 메모리 관리 등을 지원하여 다른 언어에 비해 안정성이 높다
3. 자바는 연산자 오버로딩을 금지하고 제네릭을 도입함으로써 코드의 가독성을 높였다
4. 자바는 실행을 위해 자바 가상 머신을 거쳐야 해서 다른 언어에 비해 실행 속도가 느리다
5. 자바는 예외 처리가 잘 되어 있지만 개발자가 일일이 처리를 지정해 줘야 한다는 불편함이 있다
4. 자바 실행 과정
1) 자바 컴파일러
자바 컴파일러는 Java로 작성한 Java 소스 코드를 JVM이 이해할 수 있는 Java Byte Code로 변환한다.
2) 자바 바이트 코드
Java ByteCode는 JVM이 이해할 수 있는 언어로 변환된 자바 소스 코드로 자바 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라 자바 바이트 코드라 불린다.
자바 바이트 코드의 확장자는 .class이고 JVM만 설치되어 있다면 어떤 OS에서도 실행될 수 있다.
3) 자바 가상 머신(JVM)
JVM은 자바 바이트 코드를 실행시키기 위한 가상의 기계이다.
자바 프로그램은 OS에 독립적이지만 JVM은 OS에 종속적이므로 각 OS에 맞는 JVM을 설치해야 한다.
JVM은 자바 인터프리터, 클래스 로더, JIT 컴파일러, 가비지 컬렉터로 구성되어 있다.
자바 인터프리터 : 자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석하는 역할을 한다
클래스 로더 : 자바는 동적으로 클래스를 읽어와서 프로그램이 실행 중인 런타임에 모든 코드가 JVM과 연결되는데 동적으로 클래스를 로딩해주는 역할을 한다
JIT 컴파일러 : 프로그램이 실행 중인 런타임에 실제 기계어로 변환해 주는 컴파일러다, 동적 번역으로도 불리는 기법은 프로그램의 실행 속도를 향상 시키기 위해 개발되었다. JIT 컴파일러는 자바 컴파일러가 생성한 자바 바이트 코드를 런타임에 바로 기계어로 변환하는 데 사용한다
가비지 컬렉터 : 사용하지 않는 메모리를 자동으로 회수한다
5. 자바 프로그램
자바 프로그램은 한 개 이상의 클래스로 구성되고 클래스는 한 개 이상의 필드나 메서드로 구성된다.
자바 프로그램이 실행되면 main() 메서드를 찾아 그 안의 모든 명령문을 차례대로 실행한다.
따라서 하나의 자바 프로그램에는 main() 메서드를 가지는 클래스가 하나는 반드시 존재한다.
public static void main(String[] args){
...
}
6. 자바 표준 입출력 클래스
Java에서도 C언어의 printf()나 scanf() 함수처럼 표준 입출력 클래스를 정의하여 제공하고 있다.
System 클래스는 java.lang 패키지에 포함되어 제공된다.
System 클래스에는 표준 입출력을 위해 다음과 같은 클래스 변수(static variable)가 정의되어 있다.
1) System.in
2) System.out
3) Ststem.err
7. JAVA8 변경 사항
1) 람다 표현식 = 함수형 프로그래밍
메서드를 하나의 식으로 표현하는 방식으로 식별자 없이 실행할 수 있는 함수 표현식이다.
람다 표현식으로 메서드를 표현하면 클래스를 만들고 객체를 생성하지 않아도 메서드를 사용할 수 있다.
람다 표현식은 메서드의 매개변수로 전달될 수도 있고 결과값으로 반환될 수도 있다.
불필요한 코드를 줄여주고 작성된 코드의 가독성을 높이는 데 목적이 있다.
new Thread(new Runnable() {
public void run() {
System.out.println("전통적인 방식의 일회용 스레드 생성");
}
}).start();
new Thread(()->{
System.out.println("람다 표현식을 사용한 일회용 스레드 생성");
}).start();
2) 스트림 API = 데이터의 추상화
자바에서 많은 양의 데이터를 저장하기 위해서 배열이나 컬렉션을 사용하는데 반복문이나 반복자를 이용해서 매번 코드를 작성해야 했다.
코드 길이도 길고 가독성이 덜어지고 재사용이 힘들어서 stream 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 + " "));
3) java.time 패키지 = Joda-Time을 이용한 새로운 날짜와 시간 API
JDK 1.0에서는 Date 클래스를 사용해서 날짜에 관한 처리를 수행하였다.
하지만 Date 클래스는 현재 대부분 메서드가 deprecated가 되었다.
JDK 1.1에서 제공된 Calendar 클래스는 날짜와 시간에 대한 정보를 얻을 수 있지만 아래의 문제점이 있다.
- Calendar 인스턴스는 불변 객체가 아니라 값 수정이 될 수 있음
- 윤초와 같은 특정 상황 고려 X
- 0-based 월 표시의 불편함
그래서 많은 개발자들이 Joda-Time이라는 라이브러리를 함께 써왔는데 Java8부터는 이를 발전시킨 새로운 날짜와 API인 java.time 패키지를 제공한다.
4) 나즈혼 = JS의 새로운 엔진
지금까지 자바스크립트의 기본 엔진으로는 모질라의 리노가 사용되어 왔다.
세월이 흐르면서 자바의 최신 개선 사항 등을 제대로 활용하지 못하는 등 노후화된 모습을 보여주게 되었는데 이번 Java SE 8 버전부터는 자바스크립트의 새로운 엔진으로 오라클의 나즈혼을 도입한다.
나즈혼은 기존에 사용되어 온 리노에 비해 성능과 메모리 관리 면에서 크게 개선된 스크립트 엔진이다.