본문으로 건너뛰기

용어 정리

용어 정리​

함수 vs 메서드​

  • 코틀린의 기본적인 함수(function) 은 fun 키워드를 사용한다

    • 톱레벨 함수
    • 클래스의 멤버 함수
    • 함수 내부의 지역 함수
    예시 코드
    • 기본적인 예시

      fun double(i: Int) = i * 2 // 톱레벨 함수

      class A {
      fun triple(i: Int) = i * 3 // 멤버 함수

      fun twelveTimes(i: Int): Int { // 멤버 함수
      fun fourTimes() = double(double(i)) // 지역 함수
      return triple(fourTimes())
      }
      }
    • 익명 함수

      val double = fun(i: Int) = i * 2 // 익명 함수
      val triple = { i: int -> i * 3 } // 람다 표현식
      // 람다 표현식은 익명 함수를 더 짧게 표현한것
  • 메서드(method) 는 클래스와 연결된 함수이다

    • 멤버 함수는 해당 클래스와 연결되어 있으므로, 메서드이다
    • 메서드를 호출하려면 클래스 인스턴스가 있어야 하며, 이를 활용해서 참조해야 한다
    • 모든 메서드는 함수이다
    예시 코드
    class IntWrapper(val i: Int) {
    fun doubled(): IntWrapper = IntWrapper(i * 2) // 멤버 이면서 메서드
    }

    val wrapper = IntWrapper(10)
    val doubledWrapper = wrapper.doubled()
    val doubledReference = IntWrapper::doubled
  • 확장 함수를 메서드로 불러도 되는지에 대해서는 논란의 여지가 있지만, 확장 함수도 호출을 할 때 인스턴스가 필요하므로 이 책에서는 메서드로 본다.

    예시 코드
    fun IntWrapper.tripled() = IntWrapper(i * 3)

    val wrapper = IntWrapper(10)
    val tripledWrapper = wrapper.tripled()package
    val tripledReference = IntWrapper::tripled

멤버 vs 확장​

  • 멤버(member) 는 클래스 내부에 정의된 요소를 의미한다

    예시 코드
    class User(
    val name: String,
    val surname: String
    ) {
    val fullName: String
    get() = "$name $surname"

    val withSurname(surname: String) =
    User(this.name, surname)
    }
  • 확장 (extension) 은 이미 존재하는 클래스에 추가하는 가짜 멤버 같은것이다

    • 확장은 클래스 외부에서 정의하지만, 일반적인 멤버처럼 사용할 수 있다
    예시 코드
    val User.officialFullName: String
    get() = "$surname, $name"

    fun User.withName(name: String) =
    User(name, this.surname)

파라미터와 와규먼트​

  • 파라미터 (parameter) 는 함수 선언에 정의되어 있는 변수를 의미한다
  • 아규먼트(argument) 는 함수로 전달되는 실질적인 값을 의미한다
  • 제네릭으로 선언된 변할 수 있는 부분이 타입 파라미터 이다
    • 그리고 실질적인 타입이 타입 아규먼트 이다
예시 코드
fun randomString(length: Int): String { // 파라미터

}

randomString(10) // 아규먼트

inline fun <reified T> printName() { // 타입 파라미터
print(T::class.simpleName)
}

fun main() {
printName<String>() // 타입 아규먼트
}

기본 생성자와 추가적인 생성자​

  • 생성자는 객체를 만들 때 호출되는 특별한 타입의 함수이다.

    • 코틀린이 생성자를 함수처럼 다루고, 생성자 레퍼런스도 함수 타입이지만, 공식적으로는 서브루틴이다
  • 생성자는 일반적으로 객체를 설정할 때 사용되는데, 이러한 생성자를 기본 생성자 (primary constructor) 라고 한다

    예시 코드
    class SomeObject(val text: String) {
    init {
    print("Creating Object")
    }
    }
  • 추가로 다른 생성자를 만들어야 하는 경우가 있는데, 이를 추가적인 생성자 (secondary constructor) 라고 한다

    • 추가적인 생성자는 일반적으로 this 키워드를 활용해서 기본 생성자를 호출한다\
    예시 코드
    class SomeObject(val text: String) {
    constructor(date: Date): this(date.toString())

    init {
    print("Creating Object")
    }
    }
  • 일반적으로 코틀린에서는 추가적인 생성자를 사욯알 일이 거의 없다

    • 기본 생성자 아규먼트의 다른 서브셋을 만들 때는 디폴트 아규먼트를 활용할 수 있다
    • 다른 종류의 객체를 만들어야 할 때는 팩토리 메서드를 사용한다
  • 자바에서 사용하기 위해서 기본 생성자 아규먼트의 여러 서브셋을 만들어야 한다면, @JvmOverloads 와 같은 어노테이션을 활용해서 함수에 대한 오버로드를 간단하게 만들 수 있다

    예시 코드
    class SomeObject @JvmOverloads constructor(
    val text: String = ""
    ) {
    init {
    print("Creating Object")
    }
    }