원시타입과 참조타입
- 원시타입: boolean, char, byte, short, int, long, float, double
- Java에서 단 8개 밖에 존재하지 않는 타입니다. 나머지는 모두 참조타입이라고 볼 수 있고, Object 클래스이거나 이를 상속하는 클래스들로 이루어져 있다.
- 원시타입은 항상 값이 존재한다. 반면, Object 타입은 null포인터를 가질 수 있다. 그리고 멤버변수가 초기화될 때, 원시타입은 기본값을 가지지만, 참조타입은 null 포인터를 가지는 차이도 있다.
String, StringBuilder, StringBuffer 차이
- String은 불변이다. StringBuilder와 StringBuffer는 이런 String의 특징때문에 사용하는 가변타입이라고 볼 수 있다.
- StringBuilder와 StringBuffer는 Thread-safe 여부의 차이가 있다. StringBuilder는 Thread-safe 하지 않는다. 따라서 Multi-Thread 환경에서 사용할 때는 StringBuffer를 사용한다.
- Thread-safe란 멀티 스레드 프로그래밍에서 일반적으로 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에 문제가 없는 것이다.
Java8에서 추가된 기능
- Lambda식, String API, Optional, 날짜 시간 API, StringJoiner 등이 추가되었다.
- lambda는 함수형 프로그래밍을 지원하기 위한 기능이고, Stream API는 고차함수를 지원한다. Optional은 Null-safety를 제공하며, Stream과 사용법이 유사하다. 날짜 시간 API는 Joda-time등의 라이브러리에서 영향을 받아 괜찮은 API가 되었으며, StringJoiner는 문자열을 간단하게 구분자로 합칠 수 있는 기능을 제공한다.
try-with-resource
- Java 버전 7에 도입된 문법이다.
- Java 7버전 이전에서 하나 이상의 리소스 (java.lang.AutoCloseable을 구현한 객체 혹은 java.io.Closeable를 구현한 객체)를 사용할 경우 개발자가 임의로 finally 문에서 ~~.close()를 사용하여 자원 해제를 시켜줘야 했다.
- 만약 개발자가 사용한 자원을 finally 문에서 해제시켜주지 않고 누락시켰다면 자원이 해제되지 않은 채로 프로그램이 오작동하게 되고, finally 문에서 자원을 해제 시켜주더라도 자원 해제를 위한 중복 코드가 발생하기 때문에 소스 코드의 가독성을 해치는 단점이 있었다.
- 이를 해결하기 위해 try() 안에 사용할 리소스 객체를 명시적으로 선언하여 사용하면, try 블록 안에서 로직이 정상적으로 완료되었는지, 갑작스럽게 완료되었는지 여부와 관계 없이 JVM에서 자동으로 자원을 반납해주는 기능을 하도록 도입하였습니다.
- 추가로, 자바 9 버전에서는 try()문 안에 명시적으로 객체 선언을 하기 보다는 try문 바깥에서 객체 선언을 하고 생성된 인스턴스의 변수를 넣어줄 수 있도록 바뀌웠다.
- Java 7 : try(BufferedReader br = new BufferedReader())
Java 9 : try(br)