11. Kotlin In Action 을 읽으며 남기는 기록들
현재까지의 감상
- 코틀린의 타입과 관련한 멘탈모델은 타입스크립트와 너무 닮아있다. 그래서 이해하는데 별 어려움이 없음. 아마 자바와 같은 강타입 언어만 사용하던 사람들은 어색할 수도 있겠다. 타입스크립트만 사용하던 나는 그냥 어어 그렇지 그게맞지 이렇게 된다.
- 내가 느낀 코틀린의 핵심 두가지는, null safety과 함수형 프로그래밍인데, 이 두 가지 모두 타입스크립트를 사용하다보면 자연스럽게 익히는 것들이어서 수월하게 넘어간다. 다만, 많은 것들이 식이 되어 값을 반환할 수 있는건 좀 신기한데, 이건 함수형 프로그래밍을 극대화 시키기 위한 목적인 것 같다. 문법적으로 어색할 뿐이어서 괜찮다.
- 그리고 진짜 자바가 너무너무 불편해서 만들어진 것 처럼 보인다. 즉, 자바때문에 고통받던 이들을 위해 많은걸 알아서 해준다.
- 인스턴스 생성 시 받은 인자들을 멤버변수에 할당해주는 것 조차 알아서 해준다. 자바는 모든걸 class로 작성해야하는 것도 코틀린에서는 글로벌 함수/변수를 따로 작성할 수도 있고 (이게 안되는게 좀 신기하긴하다..내가 자바를 잘몰라서 그럴지도.), 1class-1file 매핑도 필요없어서 좋다.
- 어쨌거나 코틀린은 자바로 작성된 프로그램의 하위호환을 지켜줘야한다. 그것들을 문법적으로 (ex.확장함수) 나름 잘 풀어낸 것 같아서 신기하다.
- 자바로 서버개발 해야한다고하면 많이 힘들었을듯 .. 자바는 언어 자체가 너무나 빡세다.써야할게 너무 많다...
코틀린 기초
- 문과 식의 구분
- 코틀린에서 if 는 식이지 문이 아니다.
- 식은 값을 만들어내며, 다른 식의 하위요소로서 계산에 참여할 수 있다.
- 반면, 문은 자신을 둘러싸는 가장 안쪽 블록의 최상위 요소로 존재하여, 아무런 값을 만들어내지 않는다.
- 코틀린에서는 루프 (for,while,do/while)를 제외한 대부분의 제어구조가 식이다.
- getter / setter 도 알잘딱 만들어준다.
- 게터 세터를 만들어준다는게 무엇이냐...메서드를 따로 만들어준다는 것은 아니고, 프로퍼티를 직접 사용하면 내부적으로 게터&세터를 호출하는거다.
class Persion {
val name: String, // 읽기 전용 프로퍼티, 코틀린은 필드, 게터만 만들어줌
var isStudent: Boolean // 쓸 수 있는 프로퍼티, 필드, 게터,세터 만들어줌
}
-
커스텀 접근자
- 어떤 프로퍼티가 같은 객체 안의 다른 프로퍼티에서 계산된 직접적인 결과인 경우
- 정보를 별도의 필드에 저장 할 필요가 없다.
- 대신, 커스텀 게터를 제공할 수 있고, 이 커스텀 게터 구현은 프로퍼티에 접근할 때 마다 계산한다.
class Rectangle(val height: Int, val width; Int){ val isSquare: Boolean get() { return height == width } }- 물론 클래스안에 파라미터가 없은 함수를 구현하는 방식도 괜찮다. 별 차이 없음.
-
디렉터리와 패키지
- 코틀린은 클래스를 조직화하기 위해 패키지라는 개념을 사용한다.
- 모든 코틀린 파일에는 맨 앞에 package문이 올 수 있다.
- 같은 패키지에 속해있다면, 다른 파일에서 정의한 선언일지라도 직접 사용 가능하다.
- 반면, 다른 패키지에 정의한 선언을 사용하려면 해당 선언을 불러와야한다. (import)
-
이넘 클래스와 이넘 상수 정의
- 코틀린에서는 enum class 를 사용한다.
- 일반적인 클래스와 마찬가지로 생성자와 프로퍼티 선언 문법을 사용 가능하다.
enum class Color(
val r:Int,
val g: Int,
val b: Int
){
RED(255, 0, 0),
ORGANGE(255,165);
fun rgb() = (r*256+g) * 256 + b
}
- 스마트 캐스트
- 타입을 검사한 변수를 마치 검사한 그 타입의 변수 인 것마냥 사용가능하게 해줌.
if(e is Num){
return e.value;
}
- 코틀린은 삼항연산자가 없다.
- 왜냐? if 가 식으로서 값을 만들어내는게 가능하므로.
- 코틀린에서는 함수가 던질 수 있는 예외를 선언하지 않아도 됨
- 자바는 선언이 필요했었나봄.
함수 정의와 호출
- 디폴트 파라미터 값
- 함수 선언에서 파라미터의 기본값을 지정 가능하다. (이것도 자바에선 안되었나봄;)
- 함수의 디폴트 파라미터 값은, 함수를 호출하는 쪽이 아니라 함수 선언쪽에 인코딩된다.
- 정적인 유틸리티 클래스 없애기 - 최상위 함수와 프로퍼티
- 함수를 직접 소스파일의 최상위 수준 (클래스 밖에)에 위치시킬 수 있어서, 상태나 인스턴스 메서드가 없는 클래스를 만들 필요가 없다.
- 확장함수
- 어뜬 클래스의 멤버 메서드인 것 처럼 호출할 수 있지만, 그 클래스 밖에 선언된 함수.
- 이건...기존 API 수정안하기 위해서 고안된 기능인듯
fun String.lastChar(): Char = this.get(this.length - 1)
```
- 확장 함수의 내부에서는 일반적인 인스턴스 메서드의 내부와 마찬가지로, 수신 객체의 메서드나 프로퍼티 사용 가능.
- 다만, 확장함수는 캡슐화를 깨지 않는다.즉, private/protected 멤버에는 접근 불가능.
- 확장함수를 쓰러며 임포트해야한다.
- 확장 함수는 단지 정적 메서드 호출에 신태틱 슈가다. 따라서, 클래스가 아닌 더 구체적인 타입을 수신객체 타입으로 지정 가능하기도 함.
- 확장함수는 오버라이드 불가능하다.
- 왜? 확장함수는 클래스의 일부가 아니므로.
- 만약 오버라이드해도..실제 호출될 함수는 확장 함수를 호출 할 때 수신객체로 지정한 변수의 컴파일 시점의 타입에 결정되지, 실행 시간에 그 변수에 저장된 객체 타입에 의해 결정되지 않는다.
- 즉, 코틀린은 확장함수를 정적으로 결정한다.