꿈틀꿈틀 개발일기

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() 등의 함수를 추가하여 컬렉션을 조작할 수 있습니다.

 

 

 

 

블로그의 정보

꿈틀꿈틀 개발일기

jeongminy

활동하기