Back to feed
ASH avatar
ASH

2026. 4. 24.·base·

Kotlin은 초기화없는 변수 선언이 불가능하다.

코틀린 기초

kotlin

코틀린을 처음 배우면 JS/TS와 비교해서 낯선 점이 하나 있다.
바로 초기값 없이 변수를 선언하는 것이 엄격하게 제한된다는 점이다.

예를 들어 코틀린에서는 아래 코드는 사용이 불가능하다.

kotlin
class User {
	var name: String
}

코틀린은 객체가 생성된 시점에 프로퍼티가 유효한 상태여야한다고 보기 때문에 컴파일 에러가 발생한다.

왜 초기화 없는 선언이 안될까?

핵심 이유는 안정성 때문이다.
name: String이라는 선언은 단순히 문자열 타입이라는 뜻이 아니라 코틀린에서 null이 될 수 없는 타입이라는 뜻 또한 가지고 있다.

즉 아래 선언은 이런 의미를 갖는다.

kotlin
var name: string
  • name은 문자열
  • null이면 안됨
  • 객체가 만들어진 뒤 언제든 접근할 수 있어야함

그런데 초기값이 없으면 객체가 생성된 직후 name에 무슨 값이 들어 있는지 알 수 없다.

예를 들어 만약 이런 코드가 허용된다고 하면

kotlin
class User {
	var name: String
}

var user = User()
println(user.name.length)

user.name이 실제로 어떤 값인지 보장할 수 없게 된다.
그래서 코틀린은 아예 컴파일 단계에서 초기화가 보장되지 않은 non-null 프로퍼티는 선언할 수 없도록 막아둔다.

그래서 코틀린에선 어떻게 변수를 선언함?

초기화가 필요한 클래스 프로퍼티는 반드시 다음 중 하나로 처리해야한다.

선언과 동시에 초기값 주기
kotlin
class User {
	var name: String = "박기태"
}
생성자에서 값 받기
kotlin
class User (
	var name: String
)

이 경우 객체를 만들 떄 반드시 생성자로 파라미터를 넘겨줘야한다.

kotlin
var user = User("박기태")
nullable로 선언하고 null로 초기화하기
kotlin
class User {
	var name: String? = null
}
lateinit 사용하기
kotlin
class User {
	lateinit var name: String
}

이건 예외적인 도구인데 지금은 초기화하지 않지만 나중에 반드시 넣겠다는 뜻을 갖는다. 초기화 전에 접근하면 런타임 에러가 나고, 사용할 수 있는 타입에도 제한이 있다.

클래스 프로퍼티뿐만 아니라 지역변수도 비슷하게 적용된다.

kotlin
fun test() {
	val name: string
	println(name)
}

왜냐하면 name이 초기화되지 않았기 때문이다.

하지만 이런 코드는 가능하다.

kotlin
fun test() {
	val name: String
	name = "alice"
	println(name)
}

즉 포인트는 선언과 동시에 초기화하는게 중요한게 아니라 사용되기 전에 반드시 초기화가 되었다는 것이 보장되어야한다.

0
Comments

Join the thread

Leave feedback, ask for clarification, or keep a focused discussion attached to this article.

0 comments
No comments yet. Start the first thread for this article.
Current user avatar
Styling with Markdown is supported