해당 블로그는 Kotlin In Action 책의 내용을 정리한 글입니다.

1. 코틀린은?

  1. 정적 타입

    • 코틀린은 자바와 마찬가지로 정적 타입 지정 언어(컴파일러가 타임을 검증)
  2. 타입 추론

    • 코틀린에서 모든 변수타입을 개발자가 직접 명시할 필요가 없다.
  3. nullable type 지원

  4. 함수형 프로그래밍 지원

    • 일급 시민인 함수를 일반 값처럼 다룰수 있다.
    • 불변성
    • 함수형 프로그래밍의 장점을 가질수 있음
  5. 함수를 최상위 수준에 정의 할수 있다. (자바와 달리) 꼭 클래스 안에 함수를 넣어야 할 필요가 없다. 이점은 진자 편함

  6. 코틀린에서 여러 클래스를 한 파일에 넣을 수 있고, 파일의 이름을 마음대로 정할수 있다.

2. 코틀린 변수

val? var?

코틀린 변수 설명

코틀린 property

1
2
3
4
5
class House{
val address : String,
var hasYard : Boolean

}

address는 val로 선언 -> 읽기 전용, 단순 읽을수 있는 getter 생성

isMarried var로 선언 -> read, write둘다 가능.

3. Casting

  • 스마트 캐스트 ->
    코틀린에서는 개발자 대신 컴파일러가 캐스팅을 대신해준다.

  • 원하틑 타입으로 명시적으로 타입 캐스팅 하려면 as키워드 사용

1
val numValue = n as Num

4. const

원시 타입과 String 타입만 const를 추가 할수 있다.

1
2
3
4
5
6

코틀린
const val WHO_R_U = "WHO R U"

자바
public static final String WHO_R_U = "WHO R U"

5. 확장 함수 ( 진자 매력적인 부분 )

확장 함수는 어떤 클래스의 멤버 메소드인 것처럼 호출할 수 있지만 그 클래스의 밖에 선언된 함수다.

1
fun String.lastChar() : Char = this[this.length-1]

확장 함수를 만들려면 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 덧붙이기만 하면 된다.

  • 수신 객체 타입 : 클래스 이름, 위에선 String이 수식 객체 타입
  • 수신 객체 : 확장 함수가 호출되는 대상이 되는 값, 위에선 this가 수신 객체

확장 함수 내부에서 일반적인 인스턴스 메소드의 내부에서와 마찬가지로 수신 객체의 메소드나 프로퍼티를 바로 사용 할수 있다. 하지만 캡슐화를 깨지는 않는다. 클래스 안에서 정의된 메소드와 달리 확장 함수 안에는 클래스 내부에서만 사용할 수 있는 비공개 멤버나 보호된 멤버를 사용 할수 없다.

(확장 함수는 오버라이드 할수 없다.)

확장 함수를 사용하게 되면 외부 라이브러리에 정의된 클래스를 포함하여 모든 클래스의 API를 그 클래스의 소드코드를 바꿀 필요 없이 확장 할수 있다.

6. 클래스, 객체, 인터페이스

자바와 달리 코틀린 선언은 기본적으로 final이며 public이다. 클래스를 data로 선언하면 컴파일러가 일부 표준 메소드를 생성해준다.

코틀린 인터페이스

  • 추상메소드 뿐만 아니라 구현이 있는 메소드도 정의 할수 있다.

  • 인터페이스에는 아무란 상태(필드)도 들어갈 수 없다.

코틀린 data class

  • 모든 클래스가 정의해야하는 메소드를 자동 생성

  • 데이터 클래스의 프로퍼티가 꼭 val일 필요는 없음, var사용 가능. but 읽기 전용으로 만들어서 데이터 클래스를 불변으로 만들라 권장한다. 불변 객체를 사용하게 된다면 스레드가 사용 중인 데이터를 다른 스레드가 변경할수 없으므로 스레드를 동기화해야할 필요가 줄어든다.