Java 코드를 확인하고 그와 관련해서 Kotlin에서는 어떻게 표현하는 지 확인하는 방법으로 Kotlin에 대해 정리하고자 한다.
var vs val
Java
1
2
3
4
5
long number1 = 10L;
final long number2 = 10L;
Long number3 = 1_000L; //객체 타입 변수
Person person = new Person("Lee"); //클래스 변수
- long vs final long
- 불변성에서 차이가 있다.
- long vs Long
- long: primitive type
- Long: reference type
- 단순 연산에서는 불필요한 객체 생성이 일어날 수 있음.
Kotlin
1
2
var number1 = 10L
val number2 = 10L
- var (variable) (발)
- 가변 변수일 때 작성
- val (value) (밸)
- 불변 변수일 때 작성
코틀린에서는 모든 변수에 수정 가능 여부를 넣어주어야 한다. (var or val)
타입 명시
코틀린에서는 타입을 추론해주기 때문에 타입을 명시적으로 반드시 표기할 필요는 없지만, 표기하고 싶다면 위와 같이 할 수 있다.
1
2
var number1: Long = 10L
val number2: Long = 10L
변수 초기값 지정
1
var number: Int
변수 선언 시 초기화를 하지 않을 때는 타입을 추론할 수 없으므로 명시적으로 표기해주어야 한다.
1
2
3
4
5
var number: Int
number = 3
val number2: Int
number2 = 7
val 변수에서는 최초 한 번 초기화되지 않은 변수에 값을 넣을 수 있도록 허용해준다.
팁
모든 변수를 우선 val로 만들고 필요한 경우 var로 변경하는 방식으로 코딩한다면 코드가 비교적 안전해지는 효과를 얻을 수 있다.
val 컬렉션
val 컬렉션에는 element를 추가할 수 있다. (자바와 마찬가지)
1
2
3
4
final List<Integer> list = Arrays.asList(1, 2);
list = Arrays.asList(2, 3); (X)
list.add(3); (O)
위와 같은 자바코드 처럼 컬렉션 자체의 변경은 불가능하지만 컬렉션의 element는 추가 가능하다.
1
2
val list1 = arrayListOf(1,2)
list1.add(3);
Kotlin에서의 Primitive Type
코틀린은 기본적으로 타입을 추론할 때 long 타입일 경우 Long으로 나타내게 된다.
그런데 연산을 할 때는 long과 같은 primitive type을 권장한다. 성능상으로 이점이 있기 때문이다.
코틀린은 이러한 부분을 자동으로 지원해준다.
프로그래머가 boxing/unboxing을 고려하지 않아도 되도록 코틀린이 알아서 처리해준다.
kotlin에서의 nullable 변수
1
2
3
4
5
var number3 = 1_000L
number3 = null (X)
var number3: Long? = 1_000L
number3 = null (O)
코틀린은 변수를 만들 때 null 값이 들어갈 수 있는지 없는지를 표기해주어야 한다.
타입을 표기해주고 그 옆에 ?를 붙여주면 된다.
kotlin 객체 인스턴스화
1
Person person = new Person("Lee");
자바에서는 보통 위와 같이 객체를 인스턴스화 하게 된다.
1
val person = Person("Lee")
코틀린에서 객체를 인스턴스화 할 때는 new 키워드를 붙이지 않는다.
정리
- 모든 변수는 var / val을 붙여주어야 한다.
- var: 가변 / val: 불변
- 타입을 명시적으로 작성하지 않아도 된다.
- 타입 추론
- Primitive Type과 Reference Type을 구분하지 않아도 된다.
- Null이 들어갈 수 있는 변수는 타입 뒤에 ?를 붙여주어야 한다.
- 아예 다른 타입으로 간주된다.
- 객체를 인스턴스화 할 때 new 키워드를 붙이지 않는다.