언어 기능 용어집
언어 기능 분야의 개념 32개를 한 장에 모았습니다. 간결하게 표현하기 · 고차 함수 · 널 안전성 · 데이터 클래스 등 — 코드베이스에서 뽑아 뜻과 관계를 정리했습니다.
- 간결하게 표현하기
- 같은 뜻을 적은 코드로 쓴다. 컴파일러가 타입을 추론하고, 함수를 값으로 넘기고, 기존 타입에 함수·연산자를 붙이고, 그 조합으로 DSL 을 만든다
- 고차 함수 (higher-order function)
- 함수를 인자로 받거나 돌려주는 함수. 공통 절차(파싱·예외 처리)는 한 번 쓰고 달라지는 부분만 람다로 넘긴다
- 널 안전성 (null safety, nullable type, ?., ?:, !!)
- 타입에 null 가능 여부(String 과 String?)를 넣어 null 검사 없는 접근을 컴파일 오류로 만든다. ?. · ?: · let 으로 null 인 경우를 명시적으로 처리하고, !! 는 그 보장을 스스로 끈다
- 데이터 클래스 (data class, copy)
- 값을 담는 목적의 클래스. 주 생성자 프로퍼티로 equals·hashCode·toString·copy·componentN 을 자동으로 만든다. DTO·메시지·이벤트에 쓴다
- 동반 객체 (companion object)
- 클래스 안에 하나만 있는 companion object. Java 의 static 자리를 대신해 팩토리 함수·상수를 둔다. Java 에서 static 으로 보이려면 @JvmStatic 이 필요하다
- 람다 (lambda, 익명 함수, it)
- 이름 없이 값으로 쓰는 함수 식. 마지막 인자가 람다면 괄호 밖으로 빼서 쓸 수 있어 DSL 모양이 된다. 인자가 하나면 it 으로 부른다
- 리플렉션 (reflection, kotlin-reflect, KClass, ::class)
- 런타임에 클래스·메서드·애너테이션 정보를 조회하고 호출한다. Spring 의 빈 주입과 인자 해석이 이것으로 동작한다. 컴파일러 검사를 벗어나므로 느리고 이름 변경에 약하다. Kotlin 전용 정보(nullable·기본값)는 kotlin-reflect 로 읽는다
- 메타 정보 다루기
- 런타임에 타입·애너테이션 정보를 읽어 동작을 정하고, 컴파일 타임에 애너테이션으로 코드를 생성하고, 객체를 JSON 같은 바깥 형식으로 바꾼다. 프레임워크가 주로 하는 일이라 원리를 알아야 오류를 읽을 수 있다
- 봉인 클래스 (sealed class, sealed interface)
- 하위 타입을 같은 모듈·패키지 안으로 제한한 클래스·인터페이스. 하위 타입 목록이 닫혀 있어 when 에서 else 없이 모든 경우를 다룰 수 있다
- 분기 누락
- 새 상태·하위 타입을 추가했는데 그것을 가르는 분기 하나를 고치지 않아 기본값(else)으로 조용히 흘러가는 상태
- 선언 요소
- 변수·함수·클래스처럼 이름을 붙여 선언하는 기본 구성 요소와 그 수식어
- 스코프 함수 (let, apply, also, run, with)
- let·run·with·apply·also — 객체를 람다 안의 it·this 로 잡아 코드를 묶는 표준 함수 다섯. 수신 객체(this/it)와 반환값(람다 결과/객체 자신)으로 고른다
- 안전장치 걸기
- 런타임에 터질 오류를 타입 시스템과 컴파일러로 미리 막고, 막지 못한 오류는 예외·결과 타입·사전 조건 검사로 다룬다. 자원은 블록이 끝날 때 반드시 닫는다
- 애너테이션 (annotation, 어노테이션)
- 코드 요소에 붙이는 메타데이터. 그 자체로는 동작이 없고, 컴파일러·프레임워크가 리플렉션이나 코드 생성으로 읽어 동작을 붙인다
- 언어 · Kotlin (programming language, Kotlin, Java)
- 이 레포의 백엔드 언어 Kotlin 과 그 아래의 Java 플랫폼을 기준으로 타입 설계, 타입 시스템, 컴파일 타임 안전장치, 간결한 표현, 컬렉션 처리, 런타임 메타 정보, Java 상호 운용을 익힌다. 언어 구성 요소 이름은 용어 사전에 모은다
- 언어 용어 사전 (glossary, 용어집)
- 코드를 읽는 데 필요한 언어 구성 요소의 이름. 장치(하는 일)가 아니라 코드에 「있는 것」을 모은다
- 위임 (delegation, by)
- 인터페이스 구현이나 프로퍼티 접근을 다른 객체에 넘긴다. Kotlin 은 by 키워드로 클래스 위임(: Port by store)과 프로퍼티 위임(by lazy)을 언어가 만들어 준다
- 제네릭 (generics, type parameter)
- 타입을 매개변수로 받는 클래스·함수. 한 번 짠 코드를 여러 타입에 쓰면서 캐스팅 없이 타입 검사를 받는다. JVM 에서는 런타임에 타입 인자가 지워진다
- 취약한 기반 클래스 (fragile base class)
- 상위 클래스의 내부 구현을 바꿨을 뿐인데 하위 클래스가 깨지는 상태. 하위 클래스가 상위의 호출 순서 같은 세부에 기대기 때문이다
- 클로저 (closure)
- 자신이 만들어진 바깥 스코프의 변수를 붙잡아 두고 나중에 쓰는 함수. 지역 함수·람다가 바깥 값을 읽으면 클로저가 된다
- 타입 별칭 (typealias)
- 긴 타입(특히 함수 타입·제네릭)에 새 이름을 붙인다. 새 타입이 아니라 같은 타입의 다른 이름이라 섞어 써도 컴파일러가 막지 않는다 — 구별이 필요하면 value class 를 쓴다
- 타입 설계
- 무엇을 숨기고, 무엇을 공통으로 묶고, 무엇을 바꿔 끼울지 정해 타입을 짠다. 객체지향의 네 원칙에 더해 Kotlin 의 위임·불변·봉인 계층·값 타입이 여기서 쓰인다
- 타입 추론 (type inference)
- 컴파일러가 초기값·반환식에서 타입을 정해 선언을 생략하게 한다. 정적 타입은 그대로이므로 타입 검사는 약해지지 않는다. 공개 API 반환 타입은 명시하는 편이 읽기 쉽다
- 함수형 요소
- 함수를 값으로 다룰 때 나오는 구성 요소
- 확장 함수 (extension function, extension property)
- 클래스를 고치거나 상속하지 않고 바깥에서 그 타입에 함수를 붙인다. 정적으로 결정되므로 오버라이드되지 않고, 변환 함수(toXxx)를 경계 가까이 두는 데 쓴다
- DSL (domain-specific language, type-safe builder, buildList)
- 수신 객체 지정 람다와 확장 함수로 특정 목적의 문법을 Kotlin 코드 안에 만든다. Gradle Kotlin DSL 빌드 스크립트와 Kotest 의 given/when/then, buildList 같은 빌더가 그 예다
- Kotlin (코틀린)
- JVM 에서 도는 정적 타입 언어. 이 레포의 백엔드 전 서비스와 빌드 스크립트가 Kotlin 이다
- Kotlin 타입 형태
- Kotlin 이 목적별로 따로 준 타입 선언 형태
- kotlinx.coroutines (Kotlin Coroutines)
- 코틀린 코루틴 공식 라이브러리. 스코프·디스패처·Mutex·Semaphore·Flow·Channel 을 준다. reactor 어댑터로 WebFlux 의 Mono 와도 잇는다
- NullPointerException (NPE, null 참조 오류)
- null 인 참조에 접근해 런타임에 터지는 오류. Kotlin 에서도 !! · 플랫폼 타입(Java 반환값) · lateinit 을 거치면 다시 생긴다
- suspend 함수 (suspend fun, suspending function)
- 코틀린에서 실행 중 멈췄다가 이어질 수 있는 함수. 컴파일러가 이어서 실행할 지점(continuation)을 인자로 넘기는 모양으로 바꾼다
- when 완전성 검사 (exhaustive when)
- 봉인 클래스·열거형을 when 으로 가를 때 모든 경우를 다뤘는지 컴파일러가 확인한다. 하위 타입을 하나 더하면 빠진 분기가 컴파일 오류로 드러난다
다른 분류