도서/자바의 신

[도서/자바의 신] #30 Java 7에서 달라진 것들에는?

yulee_to 2023. 1. 2. 02:39

자바의 신

✔️이 글은 [자바의 신 - 이상민 지음] 도서를 바탕으로 정리한 글입니다. 


Java 7에서는 ...

JSR(Java Specification Requirement) 336 문서에 Java 7의 변화가 정리되어 있다. 

 

대표적인 변경 사항에는 숫자 표시 방법 보완, switch문에서 String 사용, 제네릭을 쉽게 사용할 수 있는 Diamond, 예외 처리시 다중 처리 가능 등이 있다.

달라진 숫자 표현법!!!

자바에서 숫자를 표현할 때 아무 접두사가 없으면 10진수, 숫자 앞에 0을 넣어주면 8진수, 0x를 넣어주면 16진수로 인식한다. 

Java 7부터는 2진수 표현이 추가돼 2진수로 나타내려면 숫자 앞에 0b를 붙여 주면 된다.

또 긴 숫자를 표현할 때 가독성을 높이기 위해 _(언더바)를 이용해 숫자를 나눠줄 수도 있다. 꼭 숫자 사이에만 사용해줘야 하고 숫자 앞뒤에는 사용해서는 안된다. 다만 8진수를 나타내는 0(숫자)뒤에는 언더바가 와도 된다.

switch 문장도 좀 확장되었대요

원래는 switch의 case 문장에 정수형만 가능했는데 Java 7부터는 String도 가능해졌다.

switch-case에 사용하는 String 문자열이 null인 경우 NullPointerException이 발생하니 null 체크를 해줘야 한다.

제네릭은 다이아몬드를 쓰면 쉬워요

Java 6까지는 제네릭을 사용할 때 변수 타입과 생성자 모두에게 타입을 상세히 명시해줘야 했는데 Java 7부터는 생성자에 일일이 타입을 명시해줄 필요가 없어졌다. 이미 변수를 선언할 때 타입을 지정해놓았기 때문에 생성자는 <>(다이아몬드, 꺾쇠 두개)만 써주면 알아서 타입을 지정해준다.

 

다이아몬드 생성시 유의 사항

디이아몬드 미 지정시 컴파일 경고가 발생한다. 

메소드 내에서 객체를 생성할 때도 유의해야 한다. 

제네릭하면서도 제네릭하지 않은 객체 생성시 new와 클래스 이름 사이에 타입 이름을 명시적으로 두려면, 다이아몬드를 사용하지 않고 따로 명시를 해줘야 한다. 

Non reifiable varargs 타입

자바의 제네릭 사용시 발생 가능한 문제점 중 하나는 "reifiable 하지 않은 varargs 타입"이다. 이 문제는 자바에서 제네릭을 사용하지 않는 버전과의 호환성을 위해 제공했던 기능 때문에 발생한다.

reifiable은 실행시에도 타입 정보가 남아 있는 타입을 의미하고, non reifiable은 컴파일시 타입 정보가 손실되는 타입이다.

 

가변 매개 변수를 사용하는 경우 실제로 내부적으론 Object 배열로 처리된다. 이렇게 처리된 Object 배열이 큰 문제를 발생시키진 않지만 잠재적으로 문제가 발생할 수도 있어 경고를 띄워준다. 이런 경고를 없애려면 @SafeVarargs 어노테이션을 메소드 선언부에 추가해주면 된다. 

 

Collections 클래스의 addAll() 메소드에도 Java 7부터 @SafeVarargs 어노테이션이 추가되어 있다. 이 어노테이션은 가변 매개 변수를 사용하고, final이나 static으로 선언된 메소드에만 사용이 가능하다. 반면에, 가변 매개 변수가 reifiable 타입이고, 메소드 내에서 매개 변수를 다른 변수에 대입하는 작업을 수행하는 경우 컴파일러에서 경고가 발생한다. 

예외도 이렇게 보완되었답니다

Java 7부터는 catch문에서 수행하는 동작이 동일한 예외의 경우 |(OR) 기호를 이용해 예외를 여러개 이어주면 한 catch문으로 여러 예외를 사용해줄 수 있다.

 

Java 7에는 예외 처리를 위해 try-with-resource라는 구문도 추가되었다. AutoCloseable이라는 인터페이스가 새로 추가되었는데 try-with-resource를 사용할 때 이 인터페이스를 구현한 클래스는 별도로 close()를 호출해줄 필요가 없어 finally에서 close()처리를 따로 해주지 않아도 된다. 

try-with-resource는 try문에 catch문 처럼 소괄호 안에 필요한 문장을 포함할 수 있다. try 소괄호 안에서 AutoCloseable을 구현한 객체를 생성해 close() 처리를 finally에서 따로 해주지 않아도 된다. 여러개의 객체를 생성해주고 싶을 땐 ;(세미콜론)으로 구분해 생성해주면 된다. 

Java 7부터는 꼭 안 닫아도 되는 애들이 있어요

Java 5부터 추가된 java.io.Closeable 인터페이스를 구현한 클래스에서는 명시적으로 close() 메소드를 호출해줘야 했는데 Java 7부터는 Closeable 인터페이스가 AutoCloseable 인터페이스를 확장한다. 따라서 Closeable로 구현한 클래스도 try-with-resource 문장에서 사용할 수 있다. 


정리해 봅시다

1. Java 7 이상에서 2진 숫자를 나타내기 위해서 숫자 앞에 추가해 주어야 하는 것은 무엇인가요?

0b

2. Java 7 이상에서 숫자의 가독성을 좋게 하기 위해서 숫자 사이에만 적어 놓을 수 있는 특수 문자는 무엇인가요?

_(언더바)

3. Java 7이상에서 switch 문에 사용할 수 있는 타입에는 어떤 것들이 있나요?

String과 int와 같은 정수형

4. Java 7에서 추가된 제공하는 다이아몬드는 어떤 상황에서 사용할 수 있나요?

변수에 제네릭이 타입이 명시되어 있어 생성자에 타입을 명시해주지 않아도 되는 경우

5. Java 7 이상에서 사용할 수 있는 catch 문장은 어떤 것이 달라졌으며, 그 달라진 부분을 적용하기 위해 사용되는 특수 문자는?

|

6. try 문장에 소괄호로 필요한 객체를 생성하는 것을 전문 용어로 ?

try-with-resource

7. 자바에서 리소스를 닫기 위해 close() 메소드를 호출해야 하는 클래스에 대한 자동 처리를 해준다는 것을 보장하는 인터페이스 이름은?

AutoCloseable

 

 

728x90