언어 기능 용어집

언어 기능 분야의 개념 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 으로 가를 때 모든 경우를 다뤘는지 컴파일러가 확인한다. 하위 타입을 하나 더하면 빠진 분기가 컴파일 오류로 드러난다

다른 분류