자바에는 정수형 부터 실수형까지 다양한 기본 자료형이 있다.

 

int salary;
long population;
double angle;

위와 같이 변수를 사용하기 위해서는 자료형을 지정해야 한다. 자바는 자료형에 엄격하기 때문에 조금이라도 자료형이 맞지 않으면 컴파일 에러를 출력한다.

 

이것은 장점이지만 언어의 사용 목적에 따라 자료형을 지정하지 않는 경우도 있다. 자바스크립트의 var 나 파이썬의 동적타입이 대표적인 예다.

 

프로그램을 작성의 처음에는 각 데이터를 정의하는데 자바같이 엄격한 데이터 구조는 처음에 신경써서 설계를 해야 차후에 프로그램에 변동이 생기더라도 유연하게 대처할 수 있다. 까다롭지만 엄격하게 검사한 만큼 런타임에서의 오류도 줄어들고 메모리를 효율적으로 이용할 수 있다는 장점이 있다. 자바는 기본적으로 JVM에서 작동하는 바이트 코드를 컴파일 하는 언어이다.

 

반면 자바스크립트 처럼 자료형을 정확하게 선언하지 않고 그냥 var 에 모든 변수들을 대입하는 언어가 있다. 파이썬은 아예 기본 자료형의 선언이 없다. 정수나 실수 문자열까지 가리지 않는다. 실행시간에 타입 오류가능성은 늘어나지만 자유도는 늘어난다. 원래 정수형을 사용하려고 했던 변수를 도중에 실수로 바꾸거나 하는 일도 가능하다. 이 두 언어는 소스코드로 존재하다가 런타임에 한줄씩 실행되는 스크립트 언어이다.

 

컴파일 언어와 스크립트 언어를 비교해 봤을 때 자료형이 잘 지켜져야 하는 쪽은 컴파일어 언어로 설계하고 런타임의 자유도가 높게 설계한 것은 스크립트 (인터프리터)언어라는 것을 봤을 때 최초 언어를 설계한 이들의 생각을 짐작할 수 있다.

 

자바10 이후에 자바에서도 자료형이 필요없는 var 형이 도입되었는데 컴파일러가 프로그램 작성자의 의도를 추측해야 하므로 타입 추론이라 한다.

 

자바의 타입 추론은 자바스크립트나 파이썬의 동적타입과는 차이가 있다.

 

초기화 후에 다른 타입의 할당은 불가능하다. 예를 들어 int 타입이 double 타입으로 바꿀 수 없다.

예제 코드를 보자.

 

//        from Java 10, 'var' is avaialbe
        var number = 7;
        var doubleNumber = 99.0;
        var stringVariable = "This is String";

        System.out.println(number);
        System.out.println(doubleNumber);
        System.out.println(stringVariable);

var를 사용해서 정수, 실수, 문자열까지 정의했다. 자바스크립트에서나 보던 모습이다.

 

허나 동적타입인 스크립트 언어와는 다르다. 정수 7로 정의한 변수에 실수 10.99를 대입하려 하니 컴파일 오류가 난다. JS, 파이썬에선 가능한데 자바는 안된다.

 

 

또한 var 키워드는 전역변수에서 사용이 안되고 지역변수에만 사용가능하다.

 

즉 지역변수에만 제한적으로 쓸 수 있는 키워드라는 말이다.

 

-> 그리고 클래스를 가리키는 참조 변수로도 사용가능하다. 이 경우에도 한번 초기화가 끝난 후 다른 클래스 형에 할당이 안된다. 어떻게 보면 상수형과도 닮은 듯 하고 혼란스러운 부분이 있다.

 

var 키워드가 도입된 것은 제너릭 프로그램에서 < > 꺽쇠를 많이 사용하는 복잡함을 덜어주는 측면도 있다고 한다.

HashMap<Integer, String> myHash = new HashMap<Integer, String>();

이것을 줄이면 아래와 같이 된다.

var simpleHash = new HashMap<Integer, String>();

 

현재까지 혼란이 있는 부분이긴 하다. 자바의 판권이 선마이크로에서 오라클사로 넘어간 후인 2018년도에 도입되었으니 그동안 var를 사용하지 않던 프로그래머들이 얼마나 사용하고 있을지는 의문이다. 추론형의 장점이 있지만 기존의 코드를 읽던 사람들에게 가독성을 떨어뜨릴 소지가 있다는 의견도 있다.

 

제한적으로 사용하도록 설계된 키워드지만 아무래도 사용하다 보면 실수가 발생할 여지가 있기 때문에 감안하고 사용해야 할 것이다.

 

자바스크립트나 파이썬 둘다 강인한 환경 적응력과 모듈 사용능력이 뛰어난 스크립트 언어라는 특성이 동적 타입을 더 돋보이게 만드는게 있다. 요즘 유행이기도 하고. 자바스크립트나 파이썬 둘다 쉽지만 방대하다는 특성을 갖고 있다.

발을 들여놓는 순간 까마득한 곳을 보게된다

군대 신병이 병장 앞에서 제대일 계산하는꼴

 

문법의 모습으로 보면 var는 자바스크립트의 그것을 연상하게 한다. 하지만 분명한 차이가 있다는 점에 주의해야 한다.

 

 

*예제 코드

package com;

import java.util.ArrayList;
import java.util.HashMap;

public class Main {

    public static void main(String[] args) {
//        from Java 10, 'var' is avaialbe
        var number = 7;
        var doubleNumber = 99.0;
        var stringVariable = "This is String";

        number = 200;

        System.out.println(number);
        System.out.println(doubleNumber);
        System.out.println(stringVariable);

        var a = new A();
        System.out.println(a.a + ", " + a.b);

        HashMap<Integer, String> myHash = new HashMap<Integer, String>();
        myHash.put(1, "Apple");
        myHash.put(2, "Orange");
        myHash.put(3, "Banana");
        System.out.println(myHash);

        var simpleHash = new HashMap<Integer, String>();
        simpleHash.put(10, "Kiwi");
        simpleHash.put(11, "Mango");
        simpleHash.put(12, "Pineapple");
        System.out.println(simpleHash);

        ArrayList<String> arrList2 = new ArrayList<String>();
        arrList2.add("Element A");
        arrList2.add("Element B");
        arrList2.add("Element C");

        System.out.println("ArrayList: " + arrList2);

        var arrList = new ArrayList<String>();
        arrList.add("Element 1");
        arrList.add("Element 2");
        arrList.add("Element 3");

        System.out.println("ArrayList: " + arrList);
    }
}
class A {
    int a = 10;
    int b = 19;
}

 

- 참고 링크 Java 10 var Keyword

Simplify Local Variable Type Definition Using the Java 10 var Keyword - Red Hat Developer

 

Simplify Local Variable Type Definition Using the Java 10 var Keyword - Red Hat Developer

The new var keyword in Java 10 can reduce boilerplate variable type definitions and increase code readability. Learn when it can and cannot be used.

developers.redhat.com

 

공유하기

facebook twitter kakaoTalk kakaostory naver band