용어 정리
용어 정리
함수 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()packageval tripledReference = IntWrapper::tripled
멤버 vs 확장
-
멤버(member) 는 클래스 내부에 정의된 요소를 의미한다
예시 코드
class User(val name: String,val surname: String) {val fullName: Stringget() = "$name $surname"val withSurname(surname: String) =User(this.name, surname)} -
확장 (extension) 은 이미 존재하는 클래스에 추가하는 가짜 멤버 같은것이다
- 확장은 클래스 외부에서 정의하지만, 일반적인 멤버처럼 사용할 수 있다
예시 코드
val User.officialFullName: Stringget() = "$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")}}