본문 바로가기

Programming/JAVA

[Java10] Var 키워드의 사용 (타입 추론)

> 복기 목적으로 개인 학습 내용을 정리한 글로 굉장히 가독성이 떨어질 가능성과 문맥이 매끄럽지 않을 가능성이 높습니다.


java 10부터 지역 변수 선언시 변수의 타입 대신 var 키워드 사용 가능

 

기존 전형적인 변수 선언 예시와 비교해보겠음

변수 타입 변수명 = 초기값;

위와 같이 선언하였으나, java 10 부터는 var 키워드를 사용하여 특정 데이터 타입에만 의존하지 않고 타입 추론이 가능함.

아래와 같이 말임.

java 8로 업무를 보는 나의 입장에서 먼저 들었던 생각은 

오잉. 유지보수하고 운영하는 입장에서는 변수가 어떤 데이터 타입을 가지는지 명확하게 아는게 좋지 않나?

라고 먼저 생각이 들었으나, 활용 범위와 특징을 좀 더 공부한 뒤 생각이 바뀌었음.


var을 타입으로 사용할 경우

  1. 지역 변수에만 한정됨
  2. 정수형, 실수형, 문자형은 기본 타입, 문자열은 String, 인스턴스는 해당 데이터 레퍼런스 타입으로 자동 생성됨
  3. 한 번 지정된 타입에서 변경 불가하며, 타입간 cascading 조건은 동일함
  4. var 선언시 초깃값이 주어지지 않으면 변수의 타입을 추론할 수 없어 컴파일 오류가 발생함
  5. null로 선언 불가함
  6. 람다 표현식에서는 명시적인 타입 지정이 필요함
  7. 배열 선언시 var 대신 타입 명시 필요

그렇다면 var는 언제 사용하는 것이 좋은가?

 

1. 레퍼런스 타입이 유동적으로 변해 타입의 의존성이 낮은 코딩이 가능함. 그렇다면 interface와 어떤 차별점을 갖는가? 이게 문제임.

 > 우선 아래와 같이 Talkable 인터페이스와 이를 상속 받은 클래스 Cat과 Dog를 만들어보겠음.

 

위와 같이 class들을 생성함. 그렇다면, 여기서 본인 처럼 의문 갖는 사람 있을거임.

 

어라라. 어차피 Interface는 인스턴스 교체의 용의성을 높여주려고 사용하는건데. 그럼 굳이 굳이 var를 사용할 이유가 있나??

 

개인적인 견해이지만 맞음. 사실 기존 interface로 구현된 인스턴스만을 사용한다면~ 굳이! var를 사용할 필요 없음. 하나의 데이터 타입만 사용하는데 굳이 굳이 var를 사용하겠다! 하면서 아래 처럼 짜면? 일 두 번 하는 코드 짜는거임.

 

 

그렇다면 언제 쓰는게 좋을까 싶어서 고민해봤는데. 아래와 같은 경우가 아닐까 싶음.

 

 

위 출력문을 보면 var의 데이터 타입 추론은 생성되는 인스턴스에 따른다는 것을 알 수 있음. 왜냐? method라는 메소드를 오버로딩하여 parameter가 Object인 것과 Talkable인 것을 모두 나누었는데, Object 타입으로 Cat 인스턴스를 생성한 경우 해당 변수의 타입은 Object로 인식되어 파라미터가 Object인 메서드를 실행한다.

 

이와 다르게 var로 선언된 varObj는 new Cat()를 통해 Cat 클래스의 인스턴스가 생성되며 변수가 선언되었는데, 이때 var은 타입 추론에 의거하여 '어라? 얘 Cat이네. 근데 얘는 또 interface로 Talkable을 상속 받아서 구현했네? 그럼 얘는 Cat이고 Talkable ㅇㅇ' 하면서~ method 중 Talkable인 메서드를 실행한다~~~~~

 

참고로 자바는 생성된 인스턴스를 활용하기 위해서는 선언된 데이터 타입에서 제공하는 메서드나 변수 밖에 없음. 아래와 같이 명시적 변환과 더불어 변환된 데이터 타입으로 선언하지 않는 이상 불가능함.

 

아무튼~ 비즈니스 로직에 따라 생성되는 인스턴스가 상이할 경우 특정 타입에 대한 의존성이 약한 var 타입을 사용하여 오버로딩된 메서드를 실행할때, var가 적절히 사용된다면 생산적인 코드 작성이 가능할 것으로 보인다.

 

라는게 주니어 개발자 나름의 분석 결과 이다.. ㅎ (태클/피드백 환영ㅠㅠㅠ)

 

 2. 향상된 for문에서 활용 가능

 

var를 사용하면 굳이 HashMap<String, Object> 를 모두 작성할 필요 없이 var . 손가락 세번 타닥 해서 코드 작성이 가능하다. 사실 이게 메인 이유는 아니지만~ 특정 타입에 의존하지 않고 유연하다는 측면에서 좀 더 생산성과 활용도가 높지 않을까 생각된다.