🤷♀️ 확장함수
기존 클래스에 쉽게 메소드를 추가할 수 있는 확장함수
- 코틀린에서는 자바와 달리 외부에서 클래스의 필요한 메소드를 추가할 수 있다.
- 과도하게 사용하면 코드의 가독성을 해칠 수 있지만 장점도 존재한다.
- 원하는 메소드가 있지만 내가 설계한 클래스가 아닐때 외부에서 메소드를 관리한다.
- 내 목적을 위해 외부에서 관리하기 때문에 원본 클래스의 일관성을 유지할 수 있다.
[주의사항]
- 확장함수는 public 멤버에만 접근할 수 있고 private, protected는 접근할 수 없다.
- private 또는 protected 멤버에 접근하려면 클래스 내부의 멤버함수 형태가 적합하다.
- 클래스의 멤버함수처럼 상속할 수 없다.
- 즉, 하위 클래스에서 확장함수를 재정의(오버라이드)할 수 없다.
[예시 코드]
- 다른 개발자가 만든 Student 클래스는 이름 나이만 출력하는 displayInfo 메소드가 있는데 추가로 등급까지 조회하고 싶다. 이때 멋대로 수정하면 안 되니까(클래스를 변경하지 못하는 상황) 내 코드에서만 확장함수로 메소드를 추가해서 사용할 수 있다.
- X개발자가 클래스를 만들어서 전달해줬는데 나는 다른 기능도 추가되었으면 한다.
- A개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 하다.
- B개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 한다.
- X개발자는 나름대로 확장성을 고려해서 클래스를 만들었는데.. 모든 요구를 들어주다가는 고려한 내용들을 지키지 못할 것 같다.
- 이때, 확장함수를 이용해서 필요한 기능들을 본인들이 추가해서 사용할 수 있다.
fun main() {
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} 입니다")
}
}