널 허용 형식과 널 불허 형식
? 형식 표식을 배워 보세요.
널 허용 형식과 널 불허 형식은(는) CoddyKit의 무료 Android Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Android Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
널 안전성이 중요한 이유
Android 앱의 많은 충돌은 실제로 없는 값을 사용해서 발생합니다. 다른 언어에서는 이러한 문제가 실행 중 두려운 NullPointerException으로 나타납니다.
Kotlin은 이 문제를 컴파일 시점에 처리합니다. 형식 시스템이 어떤 값이 null일 수 있는지와 어떤 값이 절대 그럴 수 없는지를 추적합니다. 이 강의에서는 이러한 시스템의 기초를 소개합니다.
널이 아닌 형식
기본적으로 Kotlin 형식은 null을 담을 수 없습니다. String은 항상 실제 문자열을 가리킵니다.
null을 여기에 할당하려고 하면 코드가 컴파일되지도 않습니다. 이것이 안전한 기본 동작입니다.
fun main() {
val name: String = "Ada"
println(name.length)
}널 값은 거부됩니다
널이 아닌 형식에 null을 넣으려고 하면 어떻게 되는지 살펴보세요.
컴파일러가 즉시 이를 막습니다. 숨은 버그를 가진 채 실행 시점에 도달하는 일이 없습니다.
val name: String = null // Compile error:
// Null can not be a value of a non-null type String?를 사용한 널 허용 형식
사용자의 선택적 중간 이름처럼 값이 실제로 없을 수도 있는 경우가 있습니다. 형식 뒤에 ?를 추가하여 이를 허용하세요.
String?은 실제 문자열이나 null을 담을 수 있습니다. 물음표는 해당 형식이 널을 허용한다는 뜻입니다.
fun main() {
val middleName: String? = null
println(middleName)
}서로 다른 두 형식
String과 String?은 같은 형식이 아닙니다. 두 번째 형식은 null 값까지 포함하는 더 넓은 형식입니다.
이러한 구분 덕분에 컴파일러가 코드를 보호할 수 있습니다. 컴파일러는 null이 나타날 수 있는 위치를 정확히 알고 있습니다.
val sure: String = "hello"
val maybe: String? = "hello"
// maybe could later be null; sure never can널 허용 값을 직접 사용할 수 없는 이유
컴파일러는 널 허용 값을 먼저 확인하지 않고 해당 값의 메서드를 호출하지 못하게 합니다.
middleName은 null일 수 있으므로 여기에 .length를 호출하면 컴파일 오류가 발생합니다. 널인 경우를 처리해야 합니다.
val middleName: String? = null
println(middleName.length)
// Error: only safe (?.) or non-null (!!) calls allowedif로 확인하기
널 허용 값을 사용하는 가장 간단한 방법은 if 조건으로 확인하는 것입니다.
값이 널이 아님을 확인한 분기 안에서는 Kotlin이 값을 널이 아닌 형식으로 스마트 캐스팅하므로 .length가 작동합니다.
fun main() {
val text: String? = "Kotlin"
if (text != null) {
println(text.length)
}
}스마트 캐스트
널 확인에 성공하면 컴파일러는 해당 블록의 나머지 부분에서 값이 널이 아님을 기억합니다. 이를 스마트 캐스트라고 합니다.
변환을 직접 작성하지 않아도 됩니다. Kotlin이 자동으로 추적합니다.
fun describe(s: String?) {
if (s == null) return
// s is now treated as String here
println("Length is " + s.length)
}함수 매개변수
매개변수가 널을 허용하는지는 함수 계약의 일부입니다. 널이 아닌 매개변수는 호출자에게 null을 절대 받지 않는다고 약속합니다.
널 허용 매개변수는 입력값이 없을 수 있으며 이를 처리한다는 뜻입니다.
fun greet(name: String) {
println("Hi, " + name)
}
// greet(null) would not compile반환 형식도 널을 허용할 수 있습니다
함수는 아무것도 찾지 못했다는 뜻으로 null을 반환할 수 있습니다. 반환 형식에 ?를 표시하세요.
그러면 호출자는 결과를 사용하기 전에 확인해야 한다는 것을 알 수 있습니다.
fun firstChar(s: String): Char? {
if (s.isEmpty()) return null
return s[0]
}기본값은 널이 아닌 형식으로
좋은 규칙은 널이 아닌 형식을 우선하는 것입니다. 값이 실제로 없을 수 있을 때만 ?를 추가하세요.
이렇게 하면 코드가 정직해집니다. 널 허용 형식이 적을수록 나중에 필요한 널 확인도 줄어듭니다.
// Prefer this:
val score: Int = 0
// Over this, unless null is meaningful:
val maybeScore: Int? = null빠른 확인
널 허용 형식과 널이 아닌 형식에 대한 이해도를 확인해 보세요.
복습
Kotlin 형식은 기본적으로 널이 아니며 컴파일 시점에 null을 거부합니다. 값이 없을 수도 있을 때 ?를 추가하여 형식이 널을 허용하도록 만드세요.
널 허용 값은 직접 사용할 수 없습니다. 널을 확인하면 스마트 캐스트를 통해 널이 아닌 값으로 처리할 수 있으므로 안전하게 사용할 수 있습니다. 다음에는 널 허용 값을 처리하는 더 짧은 방법을 알아보겠습니다.
자주 묻는 질문
“널 허용 형식과 널 불허 형식” 강의는 무료인가요?
네 — “널 허용 형식과 널 불허 형식” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Android Academy 강의 전체를 잠금 해제할 수 있습니다. Android Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“널 허용 형식과 널 불허 형식”에서 뭘 배우나요?
? 형식 표식을 배워 보세요. 브라우저에서 직접 실행하는 실습 코드로 Android Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Android Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Android Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“널 허용 형식과 널 불허 형식” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Android Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Android Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 널 허용 형식과 널 불허 형식
- 안전한 호출과 Elvis
- let, also와 범위 함수
- NullPointerExceptions 방지하기