코틀린의 타입 시스템은 어떻게 구성되어 있나요?
_____Q1: 코틀린 타입 시스템의 핵심 철학은 무엇인가요?
A1:
- 정적 타입 검사(compile-time)로 안전성 확보
- Null 안전(null-safety) 내장
- JVM/JS/Native 플랫폼 간 일관된 모델 유지
- 타입 추론(type inference)으로 가독성 향상
Q2: Any, Unit, Nothing 세 가지 최상위 타입은 어떤 역할을 하나요?
A2:
- Any: 모든 non-null 타입의 슈퍼타입
- Any? : Any에 null을 허용한 Nullable 슈퍼타입
- Unit: 반환값이 없는 함수의 반환 타입(자바의 void와 유사하나 인스턴스 Unit 객체 반환)
- Nothing: 어떤 값도 반환하지 않는 타입(항상 예외를 던지거나 무한 루프인 함수의 반환)
Q3: Null 안전은 어떻게 구현되어 있나요?
A3:
1. Non-null 타입(예: String) vs Nullable 타입(예: String?) 구분
2. “?.”, “?:”, “!!” 연산자 제공
- ?. (safe-call): null이면 연산 중단 후 null 반환
- ?: (Elvis): 왼쪽이 null이면 오른쪽 대체
- !! (non-null 단언): null이면 NPE 발생
3. 스마트 캐스트(smart cast): null 검사 뒤 자동 언박싱
Q4: 제네릭(Generic)과 분배성(variance)은 어떻게 다루나요?
A4:
- 공변성(covariant, out): Producer 역할—List
- 반공변성(contravariant, in): Consumer 역할—Comparator
- 공변/반공변이 필요 없는 경우 타입 프로젝션(*)
- 제네릭은 기본적으로 불변(invariant)
Q5: 재ified 타입 파라미터란 무엇이고 언제 쓰나요?
A5:
- inline 함수에서만 사용 가능
- 컴파일 시 제네릭 타입 정보를 유지(reified)
- 클래스 리플렉션(javaClass
Q6: 플랫폼 타입(platform type)은 무엇인가요?
- 자바 등 외부 코드와 상호 운용 시 null 안전 정보 부재로 인해 생성
- 타입이 T! 형태로 표시되며 컴파일러가 null 체크를 강제하지 않음
- 개발자가 필요 시 명시적 Nullable(?) 또는 non-null 타입으로 처리
Q7: 함수형 타입(Function types)도 타입 시스템에 포함되나요?
A7:
- (P1, P2) -> R 형태로 표현
- 고차 함수(higher-order function) 지원
- nullable 함수 타입 ((Int) -> String)? 가능
Q8: 스마트 캐스트(smart cast)는 어떻게 동작하나요?
A8:
- 로컬 변수나 val 프로퍼티에 한해 if (x is String) 검사 뒤 자동으로 String 타입으로 취급
- Mutable var 프로퍼티나 커스텀 접근자에는 적용되지 않음
Q9: 타입 별칭(type alias)의 용도는?
A9:
- 복잡한 타입에 의미 있는 별칭 부여
- 예: typealias UserMap = Map
- 컴파일 시 별칭은 제거되고 원본 타입으로 대체
Q10: 서브타이핑(subtyping) 규칙은 어떻게 되나요?
A10:
- S가 T의 서브타입이면, S를 기대하는 곳에 T 대신 사용할 수 없음(invariant)
- out T 공변일 때 S <: T이면 List
- in T 반공변일 때 T <: S이면 Comparable
Q11: 교차 타입(intersection type)과 동적 타입(dynamic type)은 있나요?
A11:
- 교차 타입 T & U: 컴파일러 내부적으로 스마트 캐스트 시 사용
- dynamic: Kotlin/JS 전용, 타입 체크를 컴파일 타임에 하지 않음
Q12: 타입 시스템에서 체크되지 않는 예외는 있나요?
A12:
- Checked Exception 개념 없음(모든 예외 unchecked)
- Null 안전은 컴파일 시 보장하지만 리플렉션, platform types, `!!` 연산자 사용 시 런타임 NPE 가능
– 끝 –
이 타입 시스템은 안전성과 표현력을 높이기 위해 설계되었으며, 다양한 기능을 통해 개발자가 보다 쉽게 오류를 예방하고, 코드의 가독성을 높일 수 있도록 돕습니다.
코틀린의 타입 시스템은 다음과 같은 주요 요소로 구성되어 있습니다.
1. 기본 타입 코틀린의 기본 타입은 다음과 같습니다: - 숫자 타입 : `Int`, `Long`, `Short`, `Byte`, `Float`, `Double` - 문자 타입 : `Char` - 불리언 타입 : `Boolean` 이 기본 타입들은 자바의 기본 타입과 밀접하게 연결되어 있으며, 코틀린에서는 이들을 객체로 다루기 때문에 null 안전성을 제공하는 등의 이점을 누릴 수 있습니다.
2. Null 안전성 코틀린의 가장 큰 특징 중 하나는 null 안전성입니다.
기본적으로 모든 타입은 non-nullable입니다.
즉, 변수를 선언할 때 null 값을 가질 수 없도록 설계되어 있습니다.
만약 null 값을 가질 수 있도록 하려면 타입 뒤에 `?`를 붙여야 합니다.
예를 들어: ```kotlin var name: String = "Kotlin" // non-nullable var nullableName: String? = null // nullable ``` 이러한 설계는 NullPointerException을 방지하는 데 큰 도움이 됩니다.
코틀린은 null을 다룰 때 안전한 호출 연산자(`?.`), 엘비스 연산자(`?:`), 그리고 강제 비null 연산자(`!!`)를 제공합니다.
3. 타입 추론 코틀린은 타입 추론 기능을 지원합니다.
변수 선언 시 타입을 명시하지 않아도 컴파일러가 자동으로 타입을 추론할 수 있습니다.
예를 들어: ```kotlin val number = 42 // Int로 추론됨 val text = "Hello" // String으로 추론됨 ``` 이러한 기능은 코드의 간결성을 높이고, 개발자가 불필요하게 타입을 명시할 필요를 줄여줍니다.
4. 컬렉션 타입 코틀린은 다양한 컬렉션 타입을 제공합니다.
리스트(`List`), 세트(`Set`), 맵(`Map`) 등과 같은 컬렉션은 immutable(변경 불가능)과 mutable(변경 가능) 두 가지 형태로 제공됩니다.
예를 들어: ```kotlin val immutableList: List
5. 제네릭 코틀린은 제네릭을 지원하여 코드의 재사용성을 높입니다.
제네릭을 사용하면 타입을 매개변수로 받아 다양한 타입에 대해 동일한 로직을 적용할 수 있습니다.
예를 들어: ```kotlin fun
6. 서브타입과 슈퍼타입 코틀린은 자바와 마찬가지로 상속을 지원합니다.
클래스는 다른 클래스를 상속받을 수 있으며, 인터페이스를 구현할 수 있습니다.
코틀린에서는 클래스와 인터페이스의 상속을 통해 다형성을 구현할 수 있습니다.
또한, 코틀린은 `out`과 `in` 키워드를 사용하여 공변성과 반공변성을 지원합니다.
7. 데이터 클래스와 sealed 클래스 코틀린은 데이터 클래스를 통해 간단하게 데이터를 저장하는 클래스를 만들 수 있습니다.
데이터 클래스는 자동으로 `equals()()`, `hashCode()()`, `toString()` 메서드를 생성해 주므로, 데이터 모델을 쉽게 정의할 수 있습니다.
Sealed 클래스는 제한된 클래스 계층 구조를 만들 수 있게 해줍니다.
이는 특정 클래스의 하위 클래스가 미리 정의된 것들로 제한되기 때문에, when 표현식에서 모든 경우를 처리할 수 있도록 보장합니다.
8. 타입 별칭 코틀린은 타입 별칭을 지원하여 기존 타입에 대해 새로운 이름을 정의할 수 있습니다.
이는 코드의 가독성을 높이고, 복잡한 타입을 간단하게 표현하는 데 유용합니다.
```kotlin typealias UserList = List
기본 타입부터 시작하여 null 안전성, 제네릭, 데이터 클래스, sealed 클래스 등 다양한 기능을 통해 개발자는 보다 안전하고 효율적인 코드를 작성할 수 있습니다.
이러한 특징들은 코틀린을 현대적인 프로그래밍 언어로 자리매김하게 하며, 개발자들이 더욱 생산적으로 작업할 수 있도록 돕습니다.
작성자:
정하율 [비회원]
| 작성일자: 1년 전
2024-09-09 09:47:13
조회수: 161 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 161 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.