long number1 = 10L;
final long number2 = 10L;
Java에서 long과 final long의 차이는 이 변수가 가변인지, 불변인지(read-only)에 있다.
이것을 코틀린 문법으로 바꾼다면..!
var number1 = 10L
val number1 = 10L
자바스크립트 문법하고 비슷한데, 자바스크립트에서는 가변한 변수면 그냥 변수, 불변한 변수이면 상수로 구분하며, 가변변수는 var(최근에는 let으로 변경), 상수는 const로 구분한다.
또한, Java의 경우는 변수 선언시, 타입 (int, long, String… etc)을 반드시 작성해줘야 하는데, JavaScript는 Kotlin과 마찬가지로 타입을 선언해주지 않아도 된다.
어떤 값이 초기화 되느냐에 따라서 그 변수의 타입이 결정되기 때문에 매우 간편하다.
코틀린에서 변수 선언시 타입을 작성해주지 않아도 되지만, 굳이 타입을 작성해주고 싶다면
var number1: Long = 10L
val number2: Long = 10L
이런식으로 작성할 수 있다.
변수 타입이 var일 경우 : 변수 선언시 초기값을 지정해주지 않으면 타입을 추론하지 못하기 때문에, 반드시 타입을 선언해줘야 한다.
var number1: Long
만약에 초기화되지 않은 변수를 바로 사용하려고 한다면, 당연히 에러가 난다. 이럴 경우에는 값을 넣어주면 에러가 나지 않고 사용 가능하다.
var number1: Long
number1 = 5 // 변수 선언시 값을 초기화 하지 않았다면, 변수를 사용하기 전에 반드시 값을 넣어줘야 함.
println(number1)
변수 타입이 val일 경우 : val 역시 var과 마찬가지로 변수 선언시 초기값을 지정해주지 않으면 타입을 추론하지 못하기 때문에, 반드시 타입을 선언해줘야 한다.
val number2: Long
값이 초기화되지 않은 불변변수 val을 사용하기 위해서는, var과 마찬가지로 변수 사용 전에 값을 넣어줘야 한다.
val은 불변 변수이지만, 값이 아직 초기화되지 않은 변수에 한해서 최초 한 번은 값을 할당할 수 있다.
val number2: Long
number2 = 10L
println(number2)
자바에서도 final 리스트 선언 시, 컬렉션 자체는 못바꾸지만, 컬렉션 안에 .add()로 값을 추가할 수 있듯이,
final List<Integer> numbers = Arrays.asList(1,2);
numbers.add(3);
코틀린에서도 마찬가지이다.
모든 변수는 우선 val로 만들고, 꼭 필요한 경우 var로 변경한다. => 자바스크립트에서도 마찬가지임. 완전 판박이인데..?
자바스크립트에서도 변수 선언시 const를 우선적으로 쓰고, 그 다음으로 필요하다면 let을 사용하는데(var는 거의 사용 안 하는 추세임.) , 이와 비슷한 개념이라고 보면 될 것 같다.
var number1 = 10L
var number3 = 1_000L
위의 코드에서 두 변수인 number1 과 number3는 동일하다는 것을 알 수 있다.
하지만, 자바에서는
long number1 = 10L;
Long number3 = 1_000L;
long은 primitive type, Long은 reference type으로 다르게 구분되고 있다는 것을 알 수 있다.
(reference 타입은 boxing과 unboxing이 일어나면서 불필요한 객체생성이 이뤄지기 때문에 쓰지 않는 것을 권장하고 있는 추세이다.)
하지만 코틀린에서는 모두 타입이 모두 Long으로,
코틀린 공식문서에서는 다음과 같이 얘기하고 있다.
“숫자, 문자, 불리언과 같은 몇몇 타입은 내부적으로 특별한 표현을 갖는다. 이 타입들은 실행시에 Primitive Value로 표현되지만, 코드에서는 평범한 클래스 처럼 보인다.”
이것은 코틀린에서는 Long 타입 하나로 합쳐져 있지만, 연산하게 될 경우에는 알아서, 필요에 따라 똑똑하게(?) 내부적으로 primitive type으로 바꿔서 적절하게 처리해준다는 뜻이다.
즉, 프로그래머가 boxing / unboxing을 고려하지 않아도 되도록 Kotlin이 알아서 처리해준다.
자바에서 대문자 Long이 갖는 의미는 reference 타입이기 때문에 null이 들어갈 수 있다는 뜻도 있다.
하지만, 코틀린에서는 null이 들어갈 수 없는데, 이것은 Kotlin에서 기본적으로 null이 값으로 들어갈 수 없게 설계해놔서이다.
만약에 null이 들어가게 해주고 싶다면,
var number3: Long? = 1_000L
이런식으로 타입을 작성 후 오른쪽에 '?'를 붙여줘야 한다.
=> 코틀린에서 null이 변수에 들어갈 수 있다면 “타입?”를 사용해야 한다.
Kotlin에서 객체 인스턴스화를 할 때에는 new를 붙이지 않아야 한다.
Person person = new Person("전하윤");
var person = Person("전하윤");
위의 두 코드는 동일한 의미이다.