-
5-2. 고급 함수와 함수형 프로그래밍 활용하기 : 확장Study(종료)/Kotlin 22.09.13 ~ 12.18 2022. 10. 8. 23:20
5장
5-1. 고급 함수와 함수형 프로그래밍 활용하기 : 코틀린을 활용한 함수형 프로그래밍5-2. 고급 함수와 함수형 프로그래밍 활용하기 : 확장
5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티
5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장
5-5. 고급 함수와 함수형 프로그래밍 활용하기: 수신 객체가 있는 호출 가능 참조
5-2. 확장
실무에서 기존 클래스를 확장해야 하는 경우가 자주 있다.
한 클래스 안에 속한 메서드를 모두 사용하지 않지만, 모든 메서드를 다 import할 경우 실용적이지 않다.
이 경우 여러 프로그램 모듈에 함께 사용되는 메서드를 서로 분리해 유지하는 방법이 있다.
자바의 경우 이런 추가 메서드를 별도의 유틸리티 클래스로 묶어 사용하지만,
코틀린은 마치 멤버인 것 처럼 쓸 수 있는 함수나 프로퍼티를 클래스 밖에서 선언할 수 있게 해주는
확장이라는 기능을 재공한다. 확장을 사용하면 기존 클래스를 변경하지 않아도 새로운 기능으로 기존 클래스를
확장할 수 있어서 개방/폐쇠 디자인 원칙(OCP)를 지원할 수 있다.
1) 확장 함수
확장 함수는 어떤 클래스의 멤버인 것 처럼 호출할 수 있는(실제로는 멤버 x) 함수를 뜻한다.
이런 함수를 정의할 때는 함수를 호출할 때 사용할 수신 객체의 클래스 이름을 먼저 표시하고,점을 추가한 다음에 함수 이름을 표시한다. 예를들어 String 타입에 문자열의 길이를 특정 길이 이하로 제한하는함수를 추가해 확장하고 싶다면, 아래와 같이 구현하면 된다.
fun String.truncate(maxLength: Int): String{ return if(length <= maxLength) this else substring(0, maxLength) } fun main() { println("ByeBye".truncate(10)) // ByeBye println("ByeBye".truncate(3)) // Bye }
정의한 이후에는 다른 String 클래스 멤버와 마찬가지로 사용하면 된다.
일반 멤버와 비슷하게, 수신 객체에 this로 접근 가능하다. 하지만 확장 함수 자체는 수신 객체가 속한 클래스의
private 멤버에 접근할 수 없다.
class Person(var firstName: String, private var lastName: String) fun Person.showInfo() = println("$firstName $lastName") // ERROR // Cannot access 'lastName': it is private in 'Person'
클래스 본문 안에서 확장 함수를 정의할 수 있으며, 이 경우 확장 함수가 수신 객체의 멤버인 동시에 확장 함수가 된다.
이 경우 클래스의 비공개 멤버에 접근 가능하다.
class Person(var firstName: String, private var lastName: String){ fun Person.showInfo() = println("$firstName $lastName") // OK }
확장 함수는 바인딩된 호출 가능 참조 위치에도 사용할 수 있다.
class Person(var name: String, var age: Int) fun Person.hasName(name: String) = name.equals(this.name, ignoreCase = true) fun main() { var f = Person("유재석", 30)::hasName println(f("유재석")) println(f("유퀴즈")) }
다음글
반응형'Study(종료) > Kotlin 22.09.13 ~ 12.18' 카테고리의 다른 글
5-4. 고급 함수와 함수형 프로그래밍 활용하기 : 동반 확장 (0) 2022.10.09 5-3. 고급 함수와 함수형 프로그래밍 활용하기 : 확장 프로퍼티 (0) 2022.10.08 5-1. 고급 함수와 함수형 프로그래밍 활용하기 : 코틀린을 활용한 함수형 프로그래밍 (0) 2022.10.08 4-4. 클래스와 객체 다루기 : 객체 (0) 2022.10.01 4-3. 클래스와 객체 다루기 : 단순한 변수 이상의 프로퍼티 (2) 2022.10.01