Option과 Nullable: 각각 언제 사용할까요
Arrow의 Option 형식과 Kotlin의 nullable 형식을 비교하고 적절한 것을 선택합니다.
Option과 Nullable: 각각 언제 사용할까요은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
부재를 나타내는 두 가지 방법
Kotlin null 허용 타입
Kotlin의 T?는 대부분의 Kotlin 코드에서 값이 없음을 나타내는 관용적인 선택입니다. 컴파일러가 null 확인을 강제하고, 안전 호출 연산자 ?.를 사용하면 호출을 자연스럽게 연결할 수 있으며, ?: "default"로 대체 값을 간결하게 제공할 수 있습니다:
val name: String? = findUser(id)?.name
val display = name ?: "Anonymous"Arrow의 Option<A>
Option은 null 허용 개념을 map, flatMap, filter, fold 등을 갖춘 적절한 대수적 타입으로 감쌉니다. Arrow의 함수형 처리 흐름 스타일과 자연스럽게 통합됩니다:
import arrow.core.Option
import arrow.core.Some
import arrow.core.None
import arrow.core.toOption
val opt: Option<String> = "hello".toOption() // Some("hello")
val absent: Option<String> = NoneOption과 null 허용 타입 간 변환
두 타입은 자유롭게 변환할 수 있습니다. value?.toOption()은 null 허용 값을 Option으로 감싸고, option.getOrNull()은 값 또는 null을 추출하며, option.getOrElse { default }은 대체 값을 제공합니다:
val opt: Option<String> = nullableString.toOption()
val back: String? = opt.getOrNull()Option에서 map과 flatMap 사용하기
map { }은 Some 값을 변환하고(None은 그대로 반환), flatMap { }은 자체적으로 Option을 반환하는 작업을 연결합니다:
val length: Option<Int> = "hello".toOption().map { it.length } // Some(5)
val noneLength: Option<Int> = (null as String?).toOption().map { it.length } // NoneOption에서 filter 사용하기
filter { predicate }는 술어가 거짓이면 Some을 None으로 변환합니다:
val positiveAge: Option<Int> = 25.toOption().filter { it > 0 } // Some(25)
val rejectedAge: Option<Int> = (-1).toOption().filter { it > 0 } // Nonefold: Option 사용하기
fold(ifEmpty, ifSome)은 패턴 매칭 없이 하나의 표현식에서 두 경우를 모두 처리합니다:
val result: String = someOption.fold(
ifEmpty = { "Nothing here" },
ifSome = { value -> "Got: $value" }
)Nullable T?를 선호할 때
다음과 같은 경우에는 Kotlin의 null 허용 타입(T?)을 선호합니다:
- 다른 개발자가 읽을 관용적인 Kotlin 코드를 작성할 때
- null에 안전한 연산자 연결(
?.,?:)이 필요할 때 - Arrow를 사용하지 않는 API에서 타입을 사용할 때
- 성능이 중요할 때(박싱 오버헤드가 없음)
Option<A>를 선호할 때
다음과 같은 경우에는 Option을 선호합니다:
- 이미 Arrow의 함수형 처리 흐름(
map,flatMap)을 사용하고 있을 때 Either또는Raise와 선택적 값을 조합하고 싶을 때- 일반적인 함수형 컨텍스트에서 값이 없음을 명시적으로 나타내고 싶을 때
- 호출자가 Kotlin을 사용하지 않을 수도 있는 라이브러리를 만들 때
either { } 내부의 Option
Arrow의 either { } 블록 내부에서는 먼저 Option을 Either로 변환한 뒤 .bind()를 호출할 수 있습니다:
fun findUserOpt(id: Long): Option<User> = TODO()
fun getUser(id: Long): Either<UserError, User> = either {
findUserOpt(id)
.toEither { UserError.NotFound }
.bind()
}옵션 안티패턴
존재한다는 이유만으로 모든 곳에서 Option을 사용하지 마십시오. Kotlin에서는 대부분의 애플리케이션 코드에서 Option보다 String?이 더 명확합니다. 함수형 연산자가 진정한 가치를 더해 주는 경우에만 Option을 사용하십시오.
빠른 확인
Arrow의 옵션에서 None.map { it.length }은 무엇을 반환합니까?
정리: 옵션과 null 허용 타입
자주 묻는 질문
“Option과 Nullable: 각각 언제 사용할까요” 강의는 무료인가요?
네 — “Option과 Nullable: 각각 언제 사용할까요” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Option과 Nullable: 각각 언제 사용할까요”에서 뭘 배우나요?
Arrow의 Option 형식과 Kotlin의 nullable 형식을 비교하고 적절한 것을 선택합니다. 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“Option과 Nullable: 각각 언제 사용할까요” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Either : 예외 없이 타입이 지정된 오류 처리
- Arrow Raise DSL: 형식이 지정된 오류 조합하기
- Option과 Nullable: 각각 언제 사용할까요
- Arrow 핵심 형식으로 함수형 도메인 모델링하기