JAVA 8은 이전 버전들에 비해 가장 큰 변화가 있던 버전입니다. 이전 버전과 비교한 주요 변경사항으로는 람다 표현식, 스트림 API, time 패키지가 있습니다. 또, 현업에서 가장 많이 사용하는 JAVA 버전이 8이기에 사용한 이유도 있습니다. 개발자는 대개 혼자보단 협업을 하는 경우가 많은데, 이 때 많이 사용하는 버전을 통해 공부하면, 협업에 도움이 될 거라 생각했습니다.
람다 표현식은 이름이 없는 익명의 함수를 의미합니다. 객체지향 언어인 자바에서 함수형 프로그래밍을 위해 사용됩니다. 특징으로 크게 익명, 함수, 전달, 간결성이 있습니다.
추가로, 람다의 구성으론 메서드의 파라미터를 위한 괄호, 람다의 반환값에 해당하는 바디, 파라미터와 바디를 구분하기 위한 화살표가 있습니다.
스트림은 하나의 소스로부터 제공받은 요소들의 연속체를 말합니다. 가장 큰 특징으로 집계 연산을 지원합니다. java 8 이전에는 for, while과 같은 루프문을 통해 요소를 순회하며 데이터를 다뤄 로직이 복잡해지면 코드가 복잡해지고, 불필요한 루프가 생기는 문제점이 있었습니다. 반면 스트림은 배열과 컬렉션을 함수형으로 처리할 수 있어 간결한 로직으로 데이터 활용을 가능하게 합니다. 하지만 재사용이 불가능하다는 특징이 있습니다.
이전 버전에서는 날짜 및 시간을 다루기 위해 Date 클래스를 사용해 연산을 진행했고, 개선을 위해 Joda-Time이란 라이브러리를 사용 하기도 했습니다. Java의 time 패키지는 Joda-Time 라이브러리를 발전시켜 개발자의 불편함을 해소했습니다. 해소 된 불편함으로는 캘린더 인스턴스의 불변 객체화, 윤초와 같은 특수 상황 고려가 있습니다.
인터페이스는 자바의 다형성을 극대화 하기 위한 기능입니다. 동일한 목적을 갖고 동일한 기능을 수행하도록 강제성을 갖게 하는것이 주 역할입니다. 개발 코드의 수정을 줄이고, 유지보수 효율을 극대화 하기 위해 사용합니다. 자바에서 제공하는 인터페이스의 대표적인 예시로 리스트를 들 수 있습니다.
먼저 추상 클래스는 클래스들의 공통적인 부분을 추상 메서드로 선언한 클래스를 말합니다. 추상 클래스 내부에 추상 메서드와 일반 메서드 모두 선언할 수 있습니다. 이 때문에 추상 클래스를 통해 객체를 생성할 수 없습니다. 차이점으론 인터페이스의 경우 모두 추상 메서드로 이루어진 반면, 추상 클래스는 일반 메서드를 선언할 수 있습니다. 인터페이스는 구현체를 필요로 하며, 추상 클래스는 상속 받는 클래스를 필요로 합니다. 인터페이스는 객체를 선언할 수 있지만, 추상 클래스는 상속 받는 클래스를 통해 객체를 생성해야 합니다.
주로 메타 데이터를 위해 사용됩니다. 기본적으로 인터페이스의 형태를 취하고 있으며, 참조형 및 기본형 자료형과 배열을 사용할 수 있습니다. 자바에서 지원하는 어노테이션 외 사용자가 직접 커스텀 어노테이션 선언이 가능합니다.
가비지 컬렉터를 말합니다. JVM에서 작동하며, 쓰이지 않는 메모리 혹은 쓰임이 다한 메모리를 자동으로 수집 및 처리하여 메모리 활용을 높입니다. 단점으로는 GC가 작동하는 동안 프로그램의 퍼포먼스가 저하되는 점이 있습니다.
개발자가 소스코드를 작성한 후, 자바 컴파일러를 통해 소스코드를 바이트 코드로 변환합니다. 그 후 자바 클래스로더를 통해 JVM으로 바이트코드를 적재 후 바이트 코드 베리파이어로 바이트 코드를 검증합니다. 검증이 끝난 바이트 코드는 익스큐션 엔진을 통해 해석 및 실행됩니다.
인터프리터와 JIT 컴파일러가 있습니다. 인터프리터는 자바 바이트 코드를 한 줄씩 실행하며, JIT는 인터프리터의 느린 속도를 보완하기 위해 전체 바이트 코드를 해석 후 캐시 메모리에 저장하여 실행합니다. JIT는 컴파일 속도는 느리지만, 이 후 실행은 빠른 장점이 있습니다.