키워드와 연산자(Keywords and operators)
키워드와 연산자(Keywords and operators)
Kotlin에는 여러 종류의 키워드가 있어요. 각각이 어느 상황에서 키워드로 동작하고, 어떤 때는 식별자로도 쓸 수 있는지 정리해 볼게요.
출처: Kotlin 공식 문서
본문
하드 키워드(Hard keywords)
다음 토큰들은 항상 키워드로 해석되며 식별자로 사용할 수 없어요:
as— 타입 캐스팅에 사용됩니다. import에 대한 별칭(alias)을 지정하기도 해요.as?— 안전한 타입 캐스팅에 사용됩니다.break— 루프의 실행을 종료합니다.class— 클래스를 선언합니다.continue— 가장 가까운 바깥 루프의 다음 단계로 진행합니다.do— do/while 루프(사후 조건을 가진 루프)를 시작합니다.else— 조건이 false일 때 실행되는 if 표현식의 분기를 정의합니다.false—Boolean타입의 'false' 값을 지정합니다.for— for 루프를 시작합니다.fun— 함수를 선언합니다.if— if 표현식을 시작합니다.in— for 루프에서 반복되는 객체를 지정합니다. 값이 범위, 컬렉션, 또는 'contains' 메서드를 정의한 다른 개체에 속하는지 확인하는 infix 연산자로도 쓰이고, when 표현식에서도 같은 목적으로 쓰입니다. 타입 파라미터를 공변(contravariant)으로 표시하기도 해요.!in— 값이 범위, 컬렉션, 또는 'contains' 메서드를 정의한 다른 개체에 속하지 않는지 확인하는 연산자로 쓰입니다. when 표현식에서도 같은 목적으로 쓰여요.interface— 인터페이스를 선언합니다.is— 값이 특정 타입을 갖는지 확인합니다. when 표현식에서도 같은 목적으로 쓰여요.!is— 값이 특정 타입을 갖지 않는지 확인합니다. when 표현식에서도 같은 목적으로 쓰여요.null— 어떤 객체도 가리키지 않는 객체 참조를 나타내는 상수입니다.object— 클래스와 그 인스턴스를 동시에 선언합니다.package— 현재 파일의 패키지를 지정합니다.return— 가장 가까운 바깥 함수나 익명 함수에서 반환합니다.super— 메서드나 속성의 슈퍼클래스 구현을 참조합니다. 이차 생성자에서 슈퍼클래스 생성자를 호출하기도 해요.this— 현재 수신자를 참조합니다. 이차 생성자에서 같은 클래스의 다른 생성자를 호출하기도 합니다.throw— 예외를 던집니다.true—Boolean타입의 'true' 값을 지정합니다.try— 예외 처리 블록을 시작합니다.typealias— 타입 별칭을 선언합니다.typeof— 향후 사용을 위해 예약되어 있습니다.val— 읽기 전용 속성이나 로컬 변수를 선언합니다.var— 가변 속성이나 로컬 변수를 선언합니다.when— when 표현식(주어진 분기 중 하나를 실행)을 시작합니다.while— while 루프(사전 조건을 가진 루프)를 시작합니다.
소프트 키워드(Soft keywords)
다음 토큰들은 적용되는 문맥에서 키워드로 동작하고, 다른 문맥에서는 식별자로 사용할 수 있어요:
by— 인터페이스의 구현을 다른 객체에 위임합니다. 속성의 접근자 구현을 다른 객체에 위임하기도 해요.catch— 특정 예외 타입을 처리하는 블록을 시작합니다.constructor— 일차 또는 이차 생성자를 선언합니다.delegate— 애너테이션 use-site 대상으로 사용됩니다.dynamic— Kotlin/JS 코드에서 동적 타입을 참조합니다.field— 명시적 backing field를 선언합니다. 애너테이션 use-site 대상으로도 쓰여요.file— 애너테이션 use-site 대상으로 사용됩니다.finally— try 블록이 종료될 때 항상 실행되는 블록을 시작합니다.get— 속성의 getter를 선언합니다. 애너테이션 use-site 대상으로도 쓰여요.import— 다른 패키지의 선언을 현재 파일로 가져옵니다.init— 초기화 블록을 시작합니다.param— 애너테이션 use-site 대상으로 사용됩니다.property— 애너테이션 use-site 대상으로 사용됩니다.receiver— 애너테이션 use-site 대상으로 사용됩니다.set— 속성의 setter를 선언합니다. 애너테이션 use-site 대상으로도 쓰여요.setparam— 애너테이션 use-site 대상으로 사용됩니다.value—class키워드와 함께 인라인 클래스를 선언합니다.where— 제네릭 타입 파라미터의 제약을 지정합니다.
수정자 키워드(Modifier keywords)
다음 토큰들은 선언의 수정자 목록에서 키워드로 동작하고, 다른 문맥에서는 식별자로 사용할 수 있어요:
abstract— 클래스나 멤버를 추상으로 표시합니다.actual— 멀티플랫폼 프로젝트에서 플랫폼별 구현을 나타냅니다.annotation— 애너테이션 클래스를 선언합니다.companion— companion object를 선언합니다.const— 속성을 컴파일 타임 상수로 표시합니다.crossinline— 인라인 함수에 전달된 람다에서 비로컬(non-local) 반환을 금지합니다.data— 클래스에 대해 정식 멤버를 생성하도록 컴파일러에 지시합니다.enum— 열거형을 선언합니다.expect— 선언을 플랫폼별로 표시하며, 플랫폼 모듈에서 구현을 기대합니다.external— 선언을 Kotlin 외부에서 구현된 것으로 표시합니다(JNI 또는 JavaScript를 통해 접근).final— 멤버의 오버라이드를 금지합니다.infix— 중위 표기로 함수를 호출할 수 있게 합니다.inline— 호출 지점에서 함수와 전달된 람다를 인라인하도록 컴파일러에 지시합니다.inner— 중첩 클래스에서 바깥 클래스 인스턴스를 참조할 수 있게 합니다.internal— 선언을 현재 모듈에서 보이게 표시합니다.lateinit— 널이 아닌 속성을 생성자 밖에서 초기화할 수 있게 합니다.noinline— 인라인 함수에 전달된 람다의 인라인을 끕니다.open— 클래스의 서브클래싱이나 멤버 오버라이드를 허용합니다.operator— 함수를 연산자 오버로딩 또는 관례 구현으로 표시합니다.out— 타입 파라미터를 공변(covariant)으로 표시합니다.override— 멤버를 슈퍼클래스 멤버의 오버라이드로 표시합니다.private— 선언을 현재 클래스나 파일에서 보이게 표시합니다.protected— 선언을 현재 클래스와 그 서브클래스에서 보이게 표시합니다.public— 선언을 어디서나 보이게 표시합니다.reified— 인라인 함수의 타입 파라미터를 런타임에 접근할 수 있게 표시합니다.sealed— sealed 클래스(서브클래싱이 제한된 클래스)를 선언합니다.suspend— 함수나 람다를 일시 중단(코루틴으로 사용 가능)으로 표시합니다.tailrec— 함수를 꼬리 재귀(컴파일러가 재귀를 반복으로 대체할 수 있게 함)로 표시합니다.vararg— 파라미터에 가변 개수의 인자를 전달할 수 있게 합니다.
특별 식별자(Special identifiers)
다음 식별자들은 특정 문맥에서 컴파일러가 정의하며, 다른 문맥에서는 일반 식별자로 사용할 수 있어요:
field— 속성 접근자 안에서 속성의 backing field를 참조하는 데 사용됩니다.it— 람다 안에서 그 파라미터를 암시적으로 참조하는 데 사용됩니다.
연산자와 기호(Operators and special symbols)
Kotlin은 다음 연산자와 기호를 지원해요:
+,-,*,/,%— 수학 연산자.*는 배열을 vararg 파라미터에 전달할 때도 쓰여요.=— 할당 연산자. 파라미터의 기본값을 지정할 때도 쓰입니다.+=,-=,*=,/=,%=— 확장 할당 연산자.++,--— 증가 및 감소 연산자.&&,||,!— 논리 'and', 'or', 'not' 연산자(비트 연산에는 대응하는 infix 함수를 사용하세요).==,!=— 동등성 연산자(기본 타입이 아닌 경우equals()호출로 변환).===,!==— 참조 동등성 연산자.<,>,<=,>=— 비교 연산자(기본 타입이 아닌 경우compareTo()호출로 변환).[,]— 인덱스 접근 연산자(get과set호출로 변환).!!— 표현식이 널이 아님을 단언합니다.?.— 안전 호출(수신자가 널이 아닐 때만 메서드 호출 또는 속성 접근).?:— 왼쪽 값이 null이면 오른쪽 값을 취합니다(엘비스 연산자).::— 멤버 참조나 클래스 참조를 만듭니다..— 중첩 클래스와 enum 항목을 포함한 멤버에 접근합니다. 확장을 정의하고 호출하기도 하며, 이름과 패키지를 구분하고, 부동소수점 리터럴의 정수부와 소수부를 구분합니다...,..<— 범위를 만듭니다.:— 선언에서 이름과 타입을 구분합니다.?— 타입을 널 가능으로 표시합니다.->— 람다 표현식의 파라미터와 본문을 구분합니다. 함수 타입에서 파라미터와 반환 타입 선언을 구분합니다. when 표현식 분기에서 조건과 본문을 구분합니다.@— 애너테이션을 도입합니다. 루프 레이블을 도입하거나 참조합니다. 람다 레이블을 도입하거나 참조합니다. 바깥 범위의 'this' 표현식을 참조합니다. 바깥 슈퍼클래스를 참조합니다.;— 같은 줄의 여러 문장을 구분합니다.$— 문자열 템플릿에서 변수나 표현식을 참조합니다._— 람다 표현식에서 사용되지 않는 파라미터를 대체합니다. 구조 분해 선언에서 사용되지 않는 파라미터를 대체합니다.
연산자 우선순위는 Kotlin 문법의 이 참조를 보세요.
더 알아보기
- 기본 문법 개요(Basic syntax overview) — Kotlin 문법의 기초
- 패키지와 import(Packages and imports)