30장 Java 7에서 달라진 것들에는 ?

so2·2021년 8월 11일
0

달라진 숫자 표현법

  • 0b : 2진수로 나타내기 위해 숫자 앞에 추가

    ex) 0b100011010

  • _ : 숫자 사이에 구분 표시

    ex) int million = 1_000_000

switch문 확장

  • switch-case 문장에 String을 사용할 수 있다

    만약 문자열이 null일 경우 NullPointerException 발생하니 주의

    switch(employLevel){ 
    	case "CEO":
    		return 10;
    	case "MANAGER":
    		return 12;
    }

제네릭

  • 생성자에 타입들을 명시해 줄 필요가 없다
    HashMap<String, Integer> map = new HashMap<>();
  • <> 사용시 유의 사항
    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 class TypeInference {
    	public static void main(String args[]){
    		TypeInference type = new TypeInference();
    		type.makeObject1();
    		//type.makeObject2();
    	}
    }

    public void makeObject1(){
    	GenericClass<Integer> generic1 = 
        	new <String> GenericClass<Integer>("String");
    	generic1.setValue(999);
    }
    // 에러 발생
    public void makeObject2(){
    	// 명시적으로 타입 T에 대해서 선언한 상태에서, 
        // 타입 X에 대해서는 <>로 선언하면 컴파일 에러가 발생한다.
    	// 생성자에 있는 new와 클래스 이름 사이에 타입 이름을 
        // 명시적으로 두려면, <>를 사용하면 안 된다 
    	GenericClass<Integer> generic1 = 
        	new <String> GenericClass<>("String");
    	generic1.setValue(999);
    }

    //출력값 
    T type = java.lang.String
    X type = java.lang.Integer

Non reifiable varargs 타입

  • reifiable : 실행시에도 타입 정보가 남아있는 타입

    non reifiable : 컴파일시 타입 정보가 손실되는 타입

  • 자바의 제네릭을 사용하면서 발생 가능한 문제 중 하나가 "reifiable 하지 않은 varargs 타입" 이다

  • Collections 클래스에 addAll() 메소드는 API 문서에
    public static boolean addAll(Collection<? super T> c, T... elements) 라고 선언되어 있다.
    하지만 가변 매개 변수를 사용할 경우 실제 내부는 Object의 배열로 처리된다. 이렇게 Object 배열로 처리되면 잠재적으로 문제가 발생할 수 있다.

    public static <T> boolean 
       addAll(java.util.Collection c, java.lang.Object[] elements)

    EX))
    ArrayList<ArrayList<String>> list = new ArrayList<>();
    ArrayList<String> newDataList = new ArrayList<>();
    newDataList.add("a);
    Collections.addAll(list, newDataList);
    // warning 발생 !!! 
    System.out.println(list);
  • 경고를 없애기 위해 @SafeVarargs 어노테이션을 메소드 선언부에 추가하면 된다. @SafeVarargs 어노테이션은 가변 매개 변수를 사용하고 final이나 static으로 선언되어 있어야 한다.
    만약 @SafeVarargs 어노테이션이 가변 매개 변수가 reifiable 타입이고, 메소드 내에서 매개 변수를 다른 변수에 대입하는 작업을 수행하는 경우 컴파일러에서 경고가 발생한다.

예외

  • 여러개의 Exception을 조건식에서 | 로 연결하여 처리할 수 있다
    try{
    	....
    }catch(IllegalArgumentException | FileNotFoundException | 
			NullPointerException exception){
      ...
    }
  • try-with-resource
    • 리소스와 함께 처리하는 try문장
    • try의 소괄호에 close()를 이용해 닫아야 할 필요가 있는 객체를 적어준다. 여러개일 때 ; 으로 구분한다
    • 별도로 close를 호출할 필요가 없다
 // scanner를 finally에서 호출할 필요가 없다 
 try(Scanner scanner = new Scanner(new File(fineName), encoding)){
    	....
 }catch(IllegalArgumentException | FileNotFoundException | 
		NullPointerException exception){
      ...
 }

clse() 메소드로 닫아주지 않아도 되는 클래스들

0개의 댓글