반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Real Vectorism. 훨씬 더 입체적으로...

자바 10 이상의 버전에서 사용이 가능한 var에 대한 학습 본문

Java (based by 1.8, Lambda)

자바 10 이상의 버전에서 사용이 가능한 var에 대한 학습

grast 2020. 4. 20. 13:56
반응형

자바 9 이상의 버전은 아직가지 한국 내 프로젝트에서 사용되지 않는걸로 예상되지만 실제로 사용될 것 같기도 한데 지금 업무가 없어서 몰래 자바13 깔아서 코딩 확인 해보고 있음.

 

일부 특징만 간략하게 정리함. 회사라서 정밀한 분석은 어려움. 현재까지는 10분 고작 만져본게 전부.

 

 

 

01. var는 키워드가 아니다.

(타입) (변수명) = (초기화 값);

의 한 줄 입력이 완전하게 끝나고 소스코드 스캔이 끝나기 전까지 var는 키워드를 상징하는 볼드체 보라색 폰트로 바뀌지 않는다. 입력시점에서 키워드로 바로 빼버리는것이 아니라 스캔을 한 다음에서야 빼버린다는걸 보면 꽤 특이한 방식이다.

 

 

 

02. 변수할당이 스캔 된 다음 var가 키워드 표식으로 바뀌고 타입추론이 되면 레퍼런스 메소드 확인이 가능하다

var 키워드를 사용해서 선언하면 Object고 int고 String이고 뭐든 다 들어간다. 단, Object로 선언한 변수에 값을 넣으면 자동완성에서 표시되는 사용가능한 메소드가 Object 기준의 레퍼런스 메소드만 나오는 것에 비해 var로 변수 선언 후 초기화까지 스캔이 완료되면 해당 타입을 추론해 얼마든지 유동적인 레퍼런스 메소드를 출력해준다.

var test = "아 치킨튀기고싶다";

라고 했다면 test가 String 타입으로 추론되어 String 타입에서 사용이 가능한 모든 메소드들이 나온다. 얼마든지 값의 타입이 실시간으로 바뀐다고 하더라도 스캔만 끝나면 그 타입별로 메소드가 즉각 바뀌어 추천된다.

 

 

 

03. 전역변수에서 var를 사용할 수 없다. 

사용 시 참고해야하는 부분이다. 반드시 지역변수 레벨에서만 사용이 가능하며 생성자 혹은 메소드에 포함되어있지 않는 영역에서의 사용은 철저하게 금지된다. 'var' is not allowed here 메세지가 나타난다. 이는 4번과 마찬가지이다. var 키워드를 사용한 변수는 절대로 타입이 달라지는 재사용을 금지하는듯한 방향성 때문에 추가된 듯 하다. 실제로 한번 함수형 인터페이스로 선언된 변수에 int 타입으로 바뀌나 확인하려고 1을 넣었더니 타입 미스매치가 발생했다.

 

 

 

04. 타입패러미터 위치에 들어갈 수 없다.

이 역시 마찬가지로, 'var' is not allowed here 메세지가 나타나 컴파일 에러가 나타난다. <var>는 애초에 생각하지도 말자. 말하면 입만 아프지만 아규먼트(매개변수) 에서도 타입정의를 var로 선언하면 안된다.

 

 

 

05. 람다 익스프레션은 사용할 수 없지만 함수형 인터페이스는 들어간다

var test1 = () -> System.out.println("test");

와 같이 작성한 경우 Lambda expression needs an explicit target-type 컴파일 에러가 뜬다. 그런데 람다표현식의 명시형인 익명함수, java.util 패키지의 람다식을 위해 사용된 함수형 인터페이스의 선언은 가능하다. 알고보니 <T> 혹은 <T, R> 타입에 var가 들어가는 것을 회피할 수가 없게 때문에 막은것으로 추정된다.

var test1 = new Consumer<String>() {
    @Override
    public void accept(String arg0) {
        System.out.println("var test");
    }
};

Optional.of("1")
        .ifPresent(test1);

와 같은 사용은 자유롭게 넣을 수 있지만 타입패러미터와 아규먼트(매개변수) 타입정의를 var로 넣지 못한다면 함수형 인터페이스의 유연성을 아예 버리는것과도 같기 때문에 사실상 var 추론타입에 선언을 하는 의미가 전혀 없어진다.

반응형
Comments