[TIL] 2023. 12. 12

Gahyeon Lee·2023년 12월 12일
0

TIL

목록 보기
24/47
post-thumbnail

🤷‍♀️ 확장함수

기존 클래스에 쉽게 메소드를 추가할 수 있는 확장함수

  • 코틀린에서는 자바와 달리 외부에서 클래스의 필요한 메소드를 추가할 수 있다.
  • 과도하게 사용하면 코드의 가독성을 해칠 수 있지만 장점도 존재한다.
  • 원하는 메소드가 있지만 내가 설계한 클래스가 아닐때 외부에서 메소드를 관리한다.
  • 내 목적을 위해 외부에서 관리하기 때문에 원본 클래스의 일관성을 유지할 수 있다.

[주의사항]

  • 확장함수는 public 멤버에만 접근할 수 있고 private, protected는 접근할 수 없다.
  • private 또는 protected 멤버에 접근하려면 클래스 내부의 멤버함수 형태가 적합하다.
  • 클래스의 멤버함수처럼 상속할 수 없다.
  • 즉, 하위 클래스에서 확장함수를 재정의(오버라이드)할 수 없다.

[예시 코드]

  • 다른 개발자가 만든 Student 클래스는 이름 나이만 출력하는 displayInfo 메소드가 있는데 추가로 등급까지 조회하고 싶다. 이때 멋대로 수정하면 안 되니까(클래스를 변경하지 못하는 상황) 내 코드에서만 확장함수로 메소드를 추가해서 사용할 수 있다.
    • X개발자가 클래스를 만들어서 전달해줬는데 나는 다른 기능도 추가되었으면 한다.
    • A개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 하다.
    • B개발자도 본인이 사용할 메소드가 추가적으로 필요하다고 한다.
    • X개발자는 나름대로 확장성을 고려해서 클래스를 만들었는데.. 모든 요구를 들어주다가는 고려한 내용들을 지키지 못할 것 같다.
    • 이때, 확장함수를 이용해서 필요한 기능들을 본인들이 추가해서 사용할 수 있다.
// Student 클래스의 displayInfo() 말고 getGrade() 메소드도 쓰고 싶다. class를 해치지 않고 확장함수 만들기
fun main() {
    fun Student.getGrade() = println("학생의 등급은 ${this.grade} 입니다")    // 변수 만들듯이 만들면 됨
    var student = Student("참새", 10, "A+")        // student 인스턴스화 
    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} 입니다")
    }
}

/* 결과
이름은 참새 입니다
나이는 10 입니다
학생의 등급은 A+ 입니다
*/
profile
코린이 강아지 집사🐶

0개의 댓글