반응형

코틀린 언어가 가지고 있는 다른 언어와 다른 특징

 

#1 코틀린은 기본적으로 상속이 불가능하다.

 

 

코틀린 공식 홈페이지에 가보면 코틀린 클래스는 final 클래스이며 상속이 불가능하다고 명시되어 있다.

상속을 허용하려면 open 이라는 지시어를 써야 한다. 이와 관련해서 Github 에서 코틀린 스프링에 관련한 예제를 서치하다가 아래와 같은 내용을 발견했다.

 

출처 : https://github.com/arawn/kotlin-spring-example

 

지금은 공식 홈페이지에 설계 원칙에 대한 내용은 찾아 볼 수 없지만 위 github 작성 당시에는 설계 원칙이 있었던 것 같다. 코틀린은 이펙티브 자바 Item 17 "상속을 허용하지 말라" 를 철저히 지킬 수 있도록 설계된 것 같다.

 

상속 시 주의할 점은 다음과 같다.

- 서브 클래스는 수퍼 클래스에 존재하는 속성과 같은 이름의 속성을 가질 없다. 그래서 변수들을 var 이나 val 선언하지 말고 파라미터 넘겨서 클래스 생성자에 직접 넣어주어야 한다.

- 서브 클래스는 수퍼 클래스의 생성자까지 호출되어야 한다. 기본 생성자이던 보조 생성자이던 반드시 수퍼 클래스의 생성자가 불려야 한다.

 

#2 코틀린은 기본적으로 메서드 오버라이딩, 속성 재정의가 불가능하다.

 

1번과 마찬가지로 변경을 최소화하기 위해 클래스 내에 선언되어 있는 메서드들도 오버라이딩이 불가능하다.

수퍼 클래스에서 open 이라는 키워드로 오버라이딩이 가능하게 만들어 주어야 서브 클래스에서 override 라는 지시자를 통해 오버라이딩이 가능하다. 속성도 마찬가지이다.

 

 

#3 코틀린은 암시적 형변환은 지원하지 않는다.

 

// 컴파일 에러 Type Mismatch

var a: Int = 123
var b: Long = a

암시적 형변환으로 인한 오류를 줄이고자 명시적 형변환만 허용하고 있다. to자료형 메서드를 사용해서 명시적으로 변환해야한다.

 

#4 코틀린은 타입 추론이 가능하다.

 

코틀린은 변수나 함수를 선언할 때나 연산이 이루어질 때 자료형을 코드에 명시하지 않아도 자동으로 자료형을 추론해준다. 기본 자료형들은 값을 선언시 할당만 해주면 알아서 추론이 가능하다. 단일 표현식 함수에서도 반환형의 타입추론이 가능하다.

 

fun add(a: Int, b: Int, c: Int) = a + b + c

 

#5 코틀린은 기본 변수에서 null 절대 허용하지 않는다.

 

Null pointer Exception Error 를 원천적으로 차단하기 위해서 Null 을 할당할 수도 사용할 수도 없다.

보통 다른 언어에서는 변수 선언 시 초기화를 하지 않으면 기본값으로 초기화되거나 값이 할당되지 않았다는 표시로 null 값을 가지게 되는데 코틀린은 문법 에러를 표시하고 컴파일이 불가능하다.

그렇다고 꼭 선언 시에 초기화할 필요는 없다. lateinit 이나 lazy 변수를 활용하여 지연 초기화를 사용해도 된다.

lateinit 변수는 초기화 할당 전까지 변수를 사용할 수 없고 클래스 내부에서만 사용이 가능하다. 초기화를 하였는지 여부는 ::var.isInitialized 키워드를 사용해서 확인한다.

lazy 변수는 변수를 사용하는 시점까지 초기화를 자동으로 늦춰주는 기능이다. val a: Int by lazy {람다함수} 구문을 통해 설정할 수 있다.

 

그런데 정말 null 이 필요한 경우가 생길 수 있으므로 자료형 뒤에 var a:Int? 물음표를 붙이면 null 을 허용하는 nullable 변수로 선언해줄 수도 있다. null 상태로 속성이나 함수를 사용하려고 하면 null pointer exception 이 발생할 우려가 있기 때문에 null 체크 없이는 코드가 컴파일 되지 않는다. 이 때 null 체크를 위해 일일히 if 문으로 조건을 체크하는 대신 아래 연산자를 통해 간단히 체크할 수 있다.

 

 

null safe operator 의 경우에는 참조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터하고 null 이라면 뒤 따라오는 구문을 실행하지 않는다.

elvis operator 는 객체가 null 이 아니라면 그대로 사용하지만 null 이라면 우측 피연산자 값으로 대체된다.

non-null assertion operator 라면 참조연산자를 사용할 때 null 여부를 컴파일 시 확인하지 않도록 하여 런타임 시 null pointer exception 이 발생하도록 의도적으로 방치하는 연산자이다.

 

보통 위 연산자들과 스코프 함수를 같이 실행한다.

 

var a: String? = null

a?.run{
	println(toUpperCase())
    println(toLowerCase())
}

 

#6 코틀린은 읽기만 가능하고 수정이 불가능한 컬렉션과 수정 및 삭제까지 가능한 Mutable 컬렉션을 제공한다.

반응형

'언어 > Kotlin' 카테고리의 다른 글

[코프링] 코틀린과 스프링 (1)  (0) 2022.04.16
[Kotlin] 코틀린의 코루틴 동작 원리  (0) 2022.04.12

+ Recent posts