Java 7
- Java 7의 대표적인 변경 사항
- 숫자 표시 방법 보완
- switch 문에서 String 사용
- 제네릭을 쉽게 사용할 수 있는 Diamond
- 예외 처리시 다중 처리 가능
숫자 표시 방법
- 정수형 숫자 표현 시 숫자 앞에 접두사가 없으면 10진수로 인식한다.
- 숫자 앞에 0을 넣으면 8진수로 인식한다.
- 숫자 앞에 0x를 넣으면 16진수로 인식한다.
- Java 7 부터 2진수 표현이 추가됐다.
- 2진수는 숫자 앞에 0b를 넣으면 2진수로 인식한다.
int decVal = 1106; //1106의 10진수
int binaryVal = 0b10001010010; //1106의 2진수
int octVal = 02122; //1106의 8진수
int hexVal = 0x452; //1106의 16진수
// 모두 값이 1106으로 나온다.
- Java 7 부터 돈, 숫자 단위를 표시할 때 사용하는 ,와 같이 _를 사용해 가독성 좋은 코드를 작성할 수 있다.
- 출력시 결과 상으로는 _가 없는 것으로 표현되어 출력된다.
- 보통 2진수는 4자리 단위로 잘라서 표시한다.
- _는 숫자 사이에만 넣을 수 있다.
int million = 1_000_000; // 출력 시 1000000으로 출력된다.
int binaryVal = 0b01100_0000_1010;
switch 문장
- switch 문 사용 시 정수형만 사용 가능했기에 상수를 사용하거나 enum을 사용했다.
- Java 7 부터 switch 문장에 String을 사용할 수 있게 됐다.
switch(employee) {
case "CEO":
return 10;
case "Engineer"
return 5;
default:
return 0;
}
- Switch 문에서 String 사용 시 문자열이 null 인 경우 NPE 예외가 발생하므로 null 확인 필수!!
제네릭 <>
- Java 7 부터는 제네릭 사용 시 생성자에 해당 타입을 명시해 줄 필요가 없다.
HashMap<String, Integer> map = new HashMap<String, Integer>(); //Java 6 이하
HashMap<String, Integer> map2 = new HashMap<>(); //Java 7
public class GenericClass<X> {
private X x;
private Object o;
public <T> GenericClass(T t) {
this.o = t;
System.out.println("T type=" + t.getClass().getName());
}
public void setValue(X x) {
this.x = x;
System.out.println("X type=" + x.getClass().getName());
}
}
public void makeObjects1() {
GenericClass<Integer> generic1 = new GenericClass<Integer>("String");
generic1.setValue(999);
}
public void makeObject2() {
GenericClass<Integer> generic1 = new GenericClass("String");
generic1.setValue(999);
}
public void makeObject3() {
GenericClass<Integer> generic1 = new <String>GenericClass<Integer>("String");
generic1.setValue(999);
}
public void makeObject4() {
GenericClass<Integer> generic1 = new <String>GenericClass<>("String");
generic1.setValue(999);
}
- 1, 3번 경우는 정상적으로 처리가 된다.
- 2번의 경우는 생성자에 <>가 없어서 경고가 발생하며 실행에는 이상이 없다.
- 생성자에서 아무런 타입에 대한 명시가 없기 때문에 경고 발생
- 4번의 경우는 타입 T에 대해서는 명시적으로 선언한 상태에서 타입 X에 대해서 다이아몬드<>로 선언해 컴파일러에게 맡겨 버려서 컴파일이 정상적으로 되지 않는다.
- 생성자에 있는 new와 클래스 이름 사이에 타입 이름을 명시적으로 두려면 <>를 사용해서는 안된다.
- new <String> GenericClass("String"); 은 가능하다.
Non reifiable varargs 타입
- 제네릭 사용 시 발생가능한 문제중 하나로 reifiable 하지 않은 varargs 타입이다.
- 제네릭을 사용하지 않는 버전과의 호환성을 위해서 제공했던 기능 때문에 발생한다.
reifiable은 실행 시에도 타입 정보가 남아있는 타입을 의미한다.
non reifiable은 컴파일 시 타입 정보가 손실되는 타입을 말한다.
ArrayList<ArrayLIst<String>> list = new ArrayList<>();
ArrayList<String> newDataList = new ArrayList<>();
newDataList.add("a");
Collections.addAll(list,newDataList);
- 실행 시 문제가 발생하지는 않지만 컴파일 시 경고가 발생한다.
- 경고가 발생하는 이유가 뭘까?
- Collections 클래스의 addAll() 메소드
public static <T> boolean addAll(Collection < ? super T > c, T...elements)로 선언되어 있다. - 가변 매개 변수를 사용할 경우 실제로는 내부적으로 Object 배열로 처리된다.
public static boolean addAll(java.util.Colletcion c, java.lang.Object[] elements)
- Collections 클래스의 addAll() 메소드
- 큰 문제는 없지만 잠재적으로 문제가 발생할 수 있다.
- 경고를 없애기 위해서 @SafeVarargs 어노테이션을 메소드 선언부에 추가해서 사용할 수 있다.
- 해당 어노테이션을 사용하기 위해서 가변 매개 변수를 사용해야하며, final / static으로 선언되어 있어야 한다.
예외 처리
- Java 7 부터는 catch 블록에서 처리하는 방식이 동일한 경우 간단하게 처리할 수 있도록 변경됐다.
// Java 6 버전 이하
try {
Scanner scanner = new Scanner(new File(fileName), encoding);
System.out.println(scanner.nextLine());
} catch (IllegalArgumentException iae) {
iae.printStackTrace();
} catch (FileNotFoundException ffe) {
ffe.printStackTrace();
} finally {
if (scanner != null) scanner.close();
}
// Java 7 버전
try {
Scanner scanner = new Scanner(new File(fileName), encoding);
System.out.println(scanner.nextLine());
} catch (IllegalArgumentException iae | FileNotFoundException exception) {
exception.printStackTrace();
} finally {
if (scanner != null) scanner.close();
}
- 각 Exception을 조건식에서 or 표현으로 연결해 처리할 수 있다.
AutoCloseable 인터페이스
- Java 5부터 java.io.Closeable 인터페이스는 추가된 인터페이스지만 Java 7 부터 AutoCloseable 인터페이스를 상속받음으로 Closeable 인터페이스를 구현한 클래스는 try-with-resource 문장에서 사용할 수 있다.
- try-with-resource를 사용하면 별도로 close()를 호출해 줄 필요가 없어진다.
try (Scanner scanner = new Scanner(new File(fileName), encoding)) {
System.out.println(scanner.nextLine());
} catch (IllegalArgumentException iae | FileNotFoundException exception) {
exception.printStackTrace();
}
- try 블록 시작 부분에 소괄호 안에 필요한 문장을 포함하는 방식이다.
- 소괄호 내에 예외가 발생할 수 있는 객체는 finally에서 별도로 close()를 처리해 줄 필요가 없다.
- 두 개 이상의 객체를 생성할 필요가 있는 경우 ;으로 객체를 구분해 생성해준다.
간단 내용 정리
1. JDK 7 이상에서 2진 숫자를 나타내기 위해서 숫자 앞에 추가해 주어야 하는 것은 무엇인가요?
0b
2. JDK7 이상에서 숫자의 가독성을 좋게 하기 위해서 숫자 사이에만 적어 놓을 수 있는 특수문자는 무엇인가요?
_
3. JDK 7이상에서 switch 문에 사용할 수 타입에는 어떤 것들이 있나요?
JDK 7 이상에서 String이 추가 됐고 기존에 있던 enum, 정수형 타입 (byte, short, int, long, char)을 사용 가능하다.
4. JDK7에서 추가된 제공하는 다이아몬드는 어떤 상황에서 사용할 수 있나요?
제네릭을 선언할 때 변수 선언부에 제네릭 타입을 사용했다면, 객체를 생성하는 부분에는 <>를 사용할 수 있다
5. JDK7 이상에서 사용할 수 있는 catch 문장은 어떤 것이 달라졌으며, 그 달라진 부분을 적용하기 위해서 사용되는 특수문자는 무엇인가요?
같은 처리를 하는 경우 여러 개의 예외를 |를 사용해 나열하면 여러 예외를 한번에 처리가 가능하다.
6. try 블록 시작 전에 소괄호로 필요한 객체를 생성하는 것을 전문 용어로 무엇이라고 하나요?
try-with-resource
7. 자바에서 리소스를 닫기 위해서 close() 메소드를 호출해야하는 클래스에 대한 자동 처리를 해준다는 것을 보장하는 인터페이스 이름은 무엇인가요?
AutoCloseable
출처: 이상민, <자바의 신 VOL.2> 로드북
'Java > 자바의 신 VOL.2' 카테고리의 다른 글
14. Java 8에 추가된 것들은? (0) | 2024.07.08 |
---|---|
13. Java 7에 추가된 것들에는? (1) | 2024.07.08 |
기말 점검 및 실습 문제 풀이 (1) | 2024.07.06 |
11. 이제 주요 API도 알아봤으니 정리해봅시다 (2) | 2024.07.05 |
10. 다른 서버로 데이터를 보내려면 어떻게 하면 되나요? (1) | 2024.07.05 |