자바를 놓은지 오래되긴 했지만,
코틀린과 비교를 했을 때 큰 차이가 많다는 것을 느낄 수 있었다.
그래도 자주 사용하고 있는 스위프트와 코틀린이 비슷하게? 느껴지는 부분이 많아서 이해하기 수월했다.
다행다행
val vs var
발과 발의 차이?는 아니고 ㅋㅋ;
val(value) : 초기값이 할당되면 이후에 변경이 불가능
var(variable) : 일반적인 가변 변수로, 재할당이 가능
val age = 93
age = 94 // 컴파일 에러 - val는 재할당 불가능
var name = "young man"
name = "old man" // 정상 - var는 재할당 가능
var만 사용하면 되는 것이 아닌가!는 아니고,
기본적으로 val를 쓰고, 필요한 경우에만 var을 사용하도록 권장하고 있다.
성능적이나 메모리 부분에서 큰 차이는 없는 것 같다.
다만,
불변 객체(val)로 선언을 해놓으면 값이 변하지 않기 때문에,
여러 곳에서 동시에 접근하더라도 값을 예측할 수 있다.
하지만 var는 어디서든 값을 바꿀 수 있기 때문에
코드가 복잡해진다면
지금 이 변수가 어떤 값을 가지고 있는지 추적하기 어려워진다.
특히 멀티스레드 환경에서는 동시에 값을 바꾸다가
의도하지 않은 값이 나와버리는 상황이 발생할 수도 있다.
그냥 "변할 필요성이 없는 값은 애초에 변하지 않도록 막아두자"라는 느낌인 것 같다.
Null Safety
코틀린은 기본적으로 변수에 null 값을 넣을 수 없다.
null을 허용하려면 타입 뒤에 물음표 키워드를 붙여야 한다.
var a: String = null // 컴파일 에러
var b: String? = null // 정상
null이 될 수 있는 변수를 다루는 방법이 몇가지 있다.
우선 이걸 Safe Call Opeator라고 부른다.
?. 키워드 (safe call)
값이 null일 경우 null을 반환하고,
null이 아닐 경우에만 뒤의 메소드나 프로퍼티에 접근한다.
var length = a?.length // a의 값이 있다면 a값의 길이를, 없다면 null을 반환
?: 키워드 (Elvis 연산자)
값이 null일 경우 대신 사용할 기본값을 지정한다.
val length = b.length ?: 0 // b가 null이라면 null값이 아닌 0 반환
!! 키워드 (Non-Null Assertion)
"이 값은 절대 null이 아니다!"라고 개발자가 단언할 때 사용한다.
null값이면 NPE가 발생한다.
되도록 쓰지 말자 ㅎㅎ...
코틀린이 Null Safety를 제공하는 이유 자체가 NPE를 막기 위함인데,
NPE가 발생하면 이상하지 않은가...
굳이굳이 쓴다면
테스트 코드에서 의도적으로 사용하는 정도인 것 같다.
명확하게 에러임을 알기 위해 일부러 터뜨리는 것 정도...
val length = c!!.length // c값이 null이면 NPE 발생
모든 변수는 객체처럼 사용됨
언어 레벨에서
예시로 자바와 비교를 해보면
int a = 1;
Integer b = 1;
a는 순수한 값으로, null이 될 수 없고 메서드 또한 없다.
b는 null이 될 수 있으며 메서드가 있다. (클래스 객체니까)
Java에서 int는 진짜 값만 있는 존재라서 메서드를 호출 할 수 없었지만,
Kotlin에서는 이 구분을 없앴다고 한다.
val a: Int = 1
a.plus(2)
a.toString()
이런 식으로 메서드 호출이 가능하다.
하지만 앞에서 언어 레벨을 언급했던 이유는
개발자의 입장에서 Int도 그냥 객체처럼 사용할 수 있다는 의미로,
컴파일러 레벨에서는 다르기 때문이다.
코틀린 컴파일러가 내부적으로 성능을 위해 int와 Integer로 변환을 해준다.
var a: Int = 1 // non-nullable로, 코틀린 컴파일러에서 Int로 변환
var b: Int? = 1 // nullable로, 코틀린 컴파일러에서 Integer로 변환
정확히는 "개발자가 신경 쓸 필요 없이 언어 레벨에서는 모두 객체로 다룰 수 있다."로 보면 될 것 같다.
JVM(Java Virtual Machine)
자바를 했던 사람이라면 알고 있을 개념일 것이다.
이런게(?) 왜 있냐면
원래 프로그램은 OS마다 다르게 컴파일을 해야 했다.
예를 들어
C 코드 > Window용 컴파일 > Window에서만 실행
C 코드 > Mac용 컴파일 > Mac에서만 실행
이런 식으로...
Java는 이 문제를 해결하기 위해 중간 계층에 계층(JVM)을 추가한다.
Java 코드 > 자바 컴파일러(javac)가 실행 > 바이트 코드(.class) 생성
> 바이트 코드를 JVM이 각 OS에 맞게 실행
여기서 자바의 슬로건이 왜 "Write once, run anywhere"인지 알 수 있다 ㅋ
그래서 지금은 코틀린 이야기 중인데 왜 이것을 언급했느냐!
코틀린은 JVM을 그대로 사용하기 때문이다.
코틀린 컴파일러도 Java 바이트 코드(.class)를 만들기 때문에
JVM 입장에서는 이 바이트 코드가 자바와 코틀린 중 어느 언어로 만들어졌는지는 알지 못한다.
그래서 코틀린에서 자바 라이브러리를 그대로 쓸 수 있는 것이다!
초기화를 미루다
우선 키워드로 lateinit과 lazy를 사용한다.
메모리 최적화를 위해
당장 사용되지 않는 것들은 사용되는 시점에 초기화를 할 수 있다.
이 키워드들을 사용하여 컴파일러에게 값을 이후에 할당할 것이라고 알려주는 것이다.
물론 자바에서도 지연 초기화를 할 수는 있다.
private String name = null;
void init() {
name = "Java";
}
문제는 값(name)이 null인지 아닌지를 개발자가 직접 체크를 해야 한다는 것이다.
여기에서 NPE 문제가 터질 수도 있다!
여튼...
코틀린은 이걸 방지하기 위해 지연 초기화 키워드를 제공하게 된다.
lateinit은 위의 자바코드처럼
외부에서 초기화를 할 때 사용하고,
lazy는 뒤에 코드블록을 붙여 초기화를 한다.
차이점이 있다면
lateinit은 반드시 var에만 사용할 수 있다.
그래야 나중에 값을 바꿀 수 있기 때문이다.
또한 원시타입(Int, Double, Boolean 등)에는 사용이 불가능하다.
코틀린에서 lateinit가 초기화되지 않은 상태를 내부적으로 null로 표현한다.
하지만 원시타입은 null이 될 수 없다.
lazy 키워드는 val에만 사용한다.
최초 접근 시 한 번만 초기화되고, 이후에는 캐싱된 값을 사용하는데,
값이 바뀔 수 있는 var과는 함께 사용할 수 없도록 막혀있다.
lateinit var name1: String // 외부에서 나중에 할당. 자바와는 다르게 null 없이 안전하게 처리
lateinit val name2: String // 컴파일 에러 - val에 사용 불가
lateinit var count: Int // 컴파일 에러 - 원시 타입에는 사용 불가
val name2: String by lazy { "value" } // 처음 사용할 때 자동으로 초기화
타입추론
변수명 뒤에 세미콜론과 타입을 적어 타입을 명확히 할 수 있지만,
어떤 타입인지 추론이 가능할 때, 생략도 가능하다.
var a: Int = 1 // 타입 명시
var x = 2 // 음... Int군 > 타입 추론 (Int)
var y = 1.0 // 타입 추론 (Double)
val z = "코틀린" // 타입 추론 (String)
데이터 클래스
오우! 이건 아주 좋아보인다.
자바에서는 equals(), hashCode(), toString() 등을 모두 직접 구현해야 했다.
public class User {
private String name;
private int age;
// 이후 equals, hashCode, toString 등 직접 작성
}
하지만 코틀린은
data class User(val name: String, val age: Int)
...?
이게 끝이다.
data class로 함께 만들어지는 것들:
- equals()
- hashCode()
- toString()
- copy()
- componentN()
간단하게 작성했을 뿐인데,
이런 많은 것들이 함께 생성이 된다.
*잘못된 정보가 있을 경우 피드백 부탁드립니다 ( _ _ )
'Android > 뽀개기' 카테고리의 다른 글
| [Android] 코틀린 뽀개기 - 함수 (0) | 2026.02.25 |
|---|---|
| [Android] 코틀린 뽀개기 - 워밍업 (0) | 2026.02.20 |