키워드와 연산자(Keywords and operators)

키워드와 연산자(Keywords and operators)

Kotlin에는 여러 종류의 키워드가 있어요. 각각이 어느 상황에서 키워드로 동작하고, 어떤 때는 식별자로도 쓸 수 있는지 정리해 볼게요.

출처: Kotlin 공식 문서

본문

하드 키워드(Hard keywords)

다음 토큰들은 항상 키워드로 해석되며 식별자로 사용할 수 없어요:

  • as — 타입 캐스팅에 사용됩니다. import에 대한 별칭(alias)을 지정하기도 해요.
  • as? — 안전한 타입 캐스팅에 사용됩니다.
  • break — 루프의 실행을 종료합니다.
  • class — 클래스를 선언합니다.
  • continue — 가장 가까운 바깥 루프의 다음 단계로 진행합니다.
  • do — do/while 루프(사후 조건을 가진 루프)를 시작합니다.
  • else — 조건이 false일 때 실행되는 if 표현식의 분기를 정의합니다.
  • falseBoolean 타입의 '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 — 예외를 던집니다.
  • trueBoolean 타입의 '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 대상으로 사용됩니다.
  • valueclass 키워드와 함께 인라인 클래스를 선언합니다.
  • 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() 호출로 변환).
  • [, ] — 인덱스 접근 연산자(getset 호출로 변환).
  • !! — 표현식이 널이 아님을 단언합니다.
  • ?. — 안전 호출(수신자가 널이 아닐 때만 메서드 호출 또는 속성 접근).
  • ?: — 왼쪽 값이 null이면 오른쪽 값을 취합니다(엘비스 연산자).
  • :: — 멤버 참조나 클래스 참조를 만듭니다.
  • . — 중첩 클래스와 enum 항목을 포함한 멤버에 접근합니다. 확장을 정의하고 호출하기도 하며, 이름과 패키지를 구분하고, 부동소수점 리터럴의 정수부와 소수부를 구분합니다.
  • .., ..< — 범위를 만듭니다.
  • : — 선언에서 이름과 타입을 구분합니다.
  • ? — 타입을 널 가능으로 표시합니다.
  • -> — 람다 표현식의 파라미터와 본문을 구분합니다. 함수 타입에서 파라미터와 반환 타입 선언을 구분합니다. when 표현식 분기에서 조건과 본문을 구분합니다.
  • @ — 애너테이션을 도입합니다. 루프 레이블을 도입하거나 참조합니다. 람다 레이블을 도입하거나 참조합니다. 바깥 범위의 'this' 표현식을 참조합니다. 바깥 슈퍼클래스를 참조합니다.
  • ; — 같은 줄의 여러 문장을 구분합니다.
  • $ — 문자열 템플릿에서 변수나 표현식을 참조합니다.
  • _ — 람다 표현식에서 사용되지 않는 파라미터를 대체합니다. 구조 분해 선언에서 사용되지 않는 파라미터를 대체합니다.

연산자 우선순위는 Kotlin 문법의 이 참조를 보세요.

더 알아보기