null이 될 수 있는 타입

유우선·2026년 2월 11일

Kotlin Study📚

목록 보기
15/32

1. NPE를 피하고 값이 없는 경우 처리: 널 가능성

널 가능성

  • NPE(NullPointException)오류를 피할 수 있게 돕는 코틀린 타입 시스템의 특성
  • 코틀린을 포함한 최신 언어 → Null에 대한 처리를 실행 시점에서 컴파일 시점으로 넘김
    • Null이 될 수 있는지 여부를 타입 시스템에 추가
    • 컴파일러가 여러 오류를 컴파일 시 미리 감지
    • 실행 중 발생할 수 있는 예외의 가능성을 줄일 수 있음

2. Null이 될 수 있는 변수 명시 : Null이 될 수 있는 타입

  • 코틀린 → Null이 될 수 있는 타입을 타입 시스템이 명시적
  • Null이 될 수 있는 타입 → 프로퍼티나 변수 안에 Null을 허용
  • Null이 될 수 있는 타입에 대한 메서드 호출 → NPE(NullPointException)가 발생할 수 있으므로 메서드 호출을 금지

함수를 통한 이해

자바 함수 예시

int strLen(String s) {
		return s.Length();
}
  • 위 함수 → Null 입력시 NPE 발생
  • Null 검사가 필수인가? → 함수 사용 의도에 따라 다름

코틀린으로 변경

코틀린 함수 작성 시 최우선 고려 사항 → “이 함수가 Null을 인자로 받을 수 있는가?”

// null을 인자로 받을 필요 없는 경우
fun strLen(s: String) = s.Length
  • 파라미터 s → 항상 String의 인스턴스여야 함
    • Null을 받을 수 없는 타입
  • 코틀린 컴파일러는 Null이 될 수 있는 값을 인자로 넘기는 것을 방지해 NPE 발생을 막음

Null이 될 수 있는 타입 선언

  • 방법 : 타입 이름 뒤에 물음표( ? )를 명시
  • 어떤 타입이든 물음표를 붙이면 변수나 프로퍼티에 Null 참조를 저장할 수 있음
  • 모든 타입 → 기본적으로 Null이 아닌 타입

Null이 될 수 있는 타입의 연산 제한

Null이 될 수 있는 타입은 그 값에 대해 수행할 수 있는 연산의 종류가 제한됨

  1. 타입값의 메서드를 직접 호출할 수 없음

    fun strLenSafe(s: String?) = s.Length()
    // ERROR: only safe (?.) or non_null asserted (!!.) calls are allowed
    // on a nullable receiver of type kotlin.String?
  2. Null이 될 수 있는 값을 Null이 될 수 없는 값에 대입할 수 없음

    fun main() {
    		val x: String? = null
    		val y: String = x
    }
    // ERROR: Type mismatch:
    // inferred type is String? but String was expected
  3. Null이 될 수 있는 타입의 값을 Null이 아닌 타입의 파라미터를 받는 함수에 전달할 수 없음

    fun main() {
    		val x: String? = null
    		strLen(x)
    }
    // ERROR: Type mismatch:
    // inferred type is String? but String was expected

Null이 될 수 있는 타입을 사용하는 방법 → Null과 비교하기

fun strLenSafe(s: String?): Int =
		if (s != null) s.Length else 0
		
fun main() {
		val x: String? = null
		println(strLenSafe(x))
		// 0
		println(strLenSafe("abc"))
		// 3
}
  • Null과 비교하고 나면 컴파일러는 이를 기억하고 Null이 아님이 확실한 경우 Null이 아닌 값처럼 사용할 수 있음

null 가능성을 다룰 수 있는 도구가 if만 있다면 코드가 번잡해질 것임

코틀린은 이와 관련해 유용한 도구들을 제공함 (이후 다룰 예정)


3. 타입의 의미 자세히 살펴보기

타입이란 무엇이고 왜 변수에 타입을 지정해야 하는가?

  • 데이빗 파나스 → 타입을 가능한 값의 집합과 그런 값들에 대해 수행할 수 있는 연산의 집합으로 정의

타입의 정의를 자바 타입에 적용해보기

  1. Double
    • 64비트 부동소수점 수
    • 일반 수학 연산 수행 가능
    • 그 변수에 대한 연산이 컴파일러를 통과하면 실행 가능
  2. String
    • String이나 Null 2가지 종류의 값을 저장할 수 있음
      • String이 저장된 경우 String 클래스에 정의된 모든 메서드를 호출 할 수 있음
      • null이 저장된 경우 사용할 수 있는 연산이 적음
    • null 가능성에 대해 완전히 검증하지 않으면 NPE가 발생할 수 있음

📌 자바에서 Null을 다루는 도구
1. 어노테이션 (@Nullable, @NotNull)
2. Null값 대신 Null을 감싸는 Wrapper 타입 활용


코틀린에서의 null

  • null이 될 수 있는 타입에 대한 종합적인 해법을 제공
  • null이 될 수 있는 타입과 없는 타입을 명시적으로 구분
    • 실행 가능한 연산을 명확히 함
    • 실행 시점에 예외를 발생시킬 수 있는 연산을 판단할 수 있음

0개의 댓글