20231214 / 확장함수
by jeongminy확장함수
특정 클래스에 새로운 메서드를 추가할 수 있는 기능
- 확장함수는 해당 클래스의 멤버 메서드인 것처럼 호출할 수 있지만, 실제로는 해당 클래스의 외부에 선언된 함수입니다.
- 상속이나 복잡한 디자인 패턴 없이 간단하게 확장 기능을 만들 수 있습니다.
- 함수를 호출할 때 해당 클래스의 인스턴스가 필요하지 않습니다.
- Kotlin 공식문서 - 확장함수 https://kotlinlang.org/docs/extensions.html
주의사항
- 확장함수는 public 멤버에만 접근할 수 있고 private, protected는 접근할 수 없어요
- private 또는 protected 멤버에 접근하려면 클래스 내부의 멤버함수 형태가 적합해요
- 클래스의 멤버함수처럼 상속할 수 없어요
- 즉, 하위 클래스에서 확장함수를 재정의(오버라이드)할 수 없어요
예시
- 이름 나이만 출력하는 displayInfo 메소드가 있는데 추가로 등급까지 조회 하고 싶어요
- 클래스를 변경하지 못하는 상황에서 확장함수로 메소드를 추가해서 사용할 수 있어요
- X개발자가 클래스를 만들어서 전달해줬는데 나는 다른 기능도 추가되었으면 해요
- A개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 해요
- B개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 해요
- X개발자는 나름대로 확장성을 고려해서 클래스를 만들었는데.. 모든 요구를 들어주다가는 고려한 내용들을 지키지 못할것같아요
- 이때, 확장함수를 이용해서 필요한 기능들을 본인들이 추가해서 사용해요
fun main() { // 아래 Student클래스를 해치지 않고! 이용한 메소드를 생성할수 있어 !!
fun Student.getGrade() = println("학생의 등급은 ${this.grade} 입니다")
var student = Student("참새", 10, "A+")
student.displayInfo()
student.getGrade() // 새로 생성한 확장함수를 이용한 예!^^
}
class Student(name: String, age: Int, grade: String) {
var name: String
var age: Int
var grade: String
init {
this.name = name
this.age = age
this.grade = grade
}
fun displayInfo() {
println("이름은 ${name} 입니다")
println("나이는 ${age} 입니다")
}
}
확장함수의 다양한 활용
- 숫자 클래스에 sqrt(), pow() 등의 함수를 추가하여 수학적 계산을 수행할 수 있습니다.
- 문자열 클래스에 trim(), split() 등의 함수를 추가하여 문자열을 처리할 수 있습니다.
- 컬렉션 클래스에 sort(), filter() 등의 함수를 추가하여 컬렉션을 조작할 수 있습니다.
'📒 TIL - Today I Learned' 카테고리의 다른 글
20231214 / 배열 ( Array ) (0) | 2023.12.14 |
---|---|
20231214 / 비동기 프로그래밍 (0) | 2023.12.14 |
20231213 / Scope Functions / let, with, also, apply, run (0) | 2023.12.13 |
20231213 / 타입확인 / Pair, Triple (0) | 2023.12.13 |
20231212 / 업 캐스팅과 다운 캐스팅 (0) | 2023.12.12 |
블로그의 정보
꿈틀꿈틀 개발일기
jeongminy