ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java-11]타입추론 var
    Java 2020. 11. 20. 17:49

    Java var type-inference

     

    자바에서도 타입추론을 지원한다는걸 오늘 처음 알았다. 그도 그럴만도 한게, 평소 jdk8만 사용을 하던지라, 타입추론이 가능한지 몰랐다. 결론은 자바 10 부터 type - inference(타입 추론)이 된다는 것이다.

     

    1. 타입추론 이란?

     

    타입추론은 말그대로 개발자가 변수의 타입을 명시적으로 적어주지 않고도, 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것이다. 

    대표적인 타입추론 언어는 자바스크립트, 코틀린, 스위프트 등이 있다. 

    지금 까지 자바9 에서는 우리가 지역변수를 선언할 때, 명시적인 타입을 적고, 선언하였으며, 그 변수에다가 초기화를 시켜도 되고, 나중에 변수에다가 값을 집어 넣어도 무방하였다.

    이런식으로 지역변수를 선언할 수 있었다. 

    여기서 ‘str2’ 변수의 타입을 따로 명시하지 않았다. 대신 str2 변수 앞에 var라고 키워드를 선언 해주었다. 그리고 컴파일 시점에, 컴파일러가 오른쪽에 있는 초기화값 리터럴로 타입을 추론한다. 

    그리고 Str2의 타입은 ‘String’으로 선언되고, 런타임시 “str2 변수의 타입은 String 입니다.”가 출력 될 것이다.

     

    Var는 초기화값이 있는 지역변수 (Local Vairable)로만 선언이 가능하다.

    This feature is available only for local variables with the initializer.

     

    var는 멤버변수, 또는 메소드의 파라미터, 리턴 타입으로 사용이 불가능하다. 또한, 무조건 선언할 때 초기화 값이 있어야 하는데, 이 조건을 만족하지 못하면 용하지 못한다.

    그럼에도 var를 써야하는 이유가 있을 까? 

    위에 Map을 보자, 변수 앞에 정확하게 명시를 해줘서 타입을 바로 알 수 있긴 하지만, 사실 String, Integer의 값은 뒤에 new HashMap <> 다이아몬드 연산자에서 추가 할 수도 있고, 

    var를 사용하면, 정확히 변수의 이름에 집중할 수 있다는 장점이 있다고 한다. 사실 이 말은 개인적으로 공감이 되지않는다. 변수의 이름에 집중할 수 있어야 한다면,  var를 사용한 변수는 변수이름의 가독성이 높아야만 한다. 

     

    Var는 키워드(KeyWord)가 아니다.

    Var is not keyword

     

    이게 무슨 말이냐면, var는 키워드가 아니다. 즉, 어떠한 타입도 아니고, 클래스에서 사용할 수 있는 예약어가 아니라는 것이다. 그래서 우리가 int를 변수 이름으로 만들 수는 없지만, var 라는 문자를 변수로 사용할 수 있다.

    왜 이런 메커니즘을 두었냐면, 컴파일러가 바이트 코드로 변경할 때, var 에는 타입이 명시되어진다. 간단한 코드로 예시를 보면

    다음과 같이 변수 i 에다가 3을 집어 넣은뒤 컴파일 후에 바이트코드를 까보면 var타입이 int로 된다. 이 말이 무슨 말인지 어렵다면, 컴파일 하는 과정 글을 보고 오면 이해하기 쉽다. 

     

    Var는 런타임 오버헤드가 없다. 

    There is no runtime overhead in using var.

     

     

    컴파일 시점에 var를 초기화된 값을 보고 추론에서 바이트코드에 명시적으로 int는 int다, string 은 string이다. 결정이 되있는 상태라, 타입추론 변수를 읽을 때 마다 타입을 알아내기위한 연산을 하지 않는다는 것이다. 그래서 var로 선언된 변수는 중간에 타입이 절대 변경되지 않는다.

    자바스크립트같은 언어들은 선언된 변수를 중간에 다른값으로 변경할 수 있다. 예를들어

    var intvariable = 10;

    variable = “Hello Number ! , I’m String~”;

    이 가능한데, 자바는 불가능해서, 컴파일단에서 바로 에러를 뱉는다.

    심지어 여긴 int가 들어갈 자리라고 얘기까지 해준다. 

     

    Var의 잘못된 사용법

    Legal use of var

    • Var는 초기화없이 사용할 수 없다.

    • Var타입 변수에는 null 값이 들어갈 수 없다.

    • Var 타입은 로컬 변수에만 선언이 가능하다.

    • Lambda Expression에는 명시적인 타입을 지정해줘야 한다.

    • 배열을 선언할 때, var 대신 타입을 명시해줘야 한다.

     

    생각보다 'var'는 할 수 있는게 많이 없구나?

     

    이렇게 생각할 수 있다. 하지만  

    이런식으로 구성된 람다 익스프레션이 있다. 자 여기서 타입추론이 꽤나 유용하게 사용할 수 있는데, 

    이렇게 변수 앞에 var를 넣을 수 있다. 

    아그러면 뭐가 다른건데? 똑같은거 아니야? 걍 ‘s’ 만 쓰는게 더 가독성 좋지않아/

    하지만 이렇게 키워드 앞에만 사용할 수 있는 어노테이션을 사용할 수 있다는 장점이 있다. 이 내용은 유튜브 람다에서 var를 람다에서 사용하기 라는 백기선님의 영상에서 확인한 팁이다. 위의 람다 익스프레션은 사용할 수 있다의 정보이지, 뭔가 획기적인 예는 아니다. 좀 더 고민해서 사용해보도록 하자 

     

    > [Java-12] 자바 배열에 관하여  

    'Java' 카테고리의 다른 글

    [Java-13] 자바 산술 연산자  (0) 2020.11.27
    [Java-12] 자바 배열  (0) 2020.11.20
    [Java-10]변수의 스코프&라이프타임  (0) 2020.11.20
    [Java-9] 타입변환, 형변환  (0) 2020.11.18
    [Java-8] 자바 변수 선언과 초기화  (0) 2020.11.18

    댓글

Designed by Tistory.