O
OpenLog
Search
Log in
Back to Suggestions
New Suggest
Suggest edit for "Kotlin은 초기화없는 변수 선언이 불가능하다."
Suggestion title
Description
</>
Edit
Preview
## Summary ## Reason
</>
Edit
Preview
코틀린을 처음 배우면 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) } ``` 즉 포인트는 선언과 동시에 초기화하는게 중요한게 아니라 사용되기 전에 반드시 초기화가 되었다는 것이 보장되어야한다.
Files changed
No changes yet.
Cancel
Submit suggestion