확장함수

황승현·2023년 12월 7일
0

코틀린 강의 정리

목록 보기
15/36

📖 확장함수

기존 클래스에 메소드를 추가하는 방법

자바와 달리 코틀린에서는 외부에서 기존 클래스에 메소드를 추가 가능

원하는 메소드가 있지만 내가 설계한 클래스가 아닐때 외부에서 메소드를 관리하는 방법

😃 기본 구조

추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 덧붙이면 된다.

fun 수신 객체 타입.추가할 함수 이름(): 함수 반환타입 = 확장 함수 내부

fun 수신 객체 타입.추가할 함수 이름(): 함수 반환타입 = 수신 객체.프로퍼티

fun 수신 객체 타입.추가할 함수 이름(): 함수 반환타입 = 수신 객체.메소드()
  • 수신 객체 타입(receiver type): 함수가 확장할 클래스 이름

  • 수신 객체(receiver type object): 확장함수가 호출되는 대상이 되는 값(객체)

🤔 확장함수가 필요한 이유

  • 외부에서 작성하고 관리하기 때문에 원본 클래스의 일관성을 유지할 수 있다.

    • 원본 클래스는 수정하지 않고, 내가 원하는 기능만 추가한다.

😱 확장함수 주의사항

확장함수는 public 멤버에만 접근할 수 있고 private, protected는 접근할 수 없기 때문에 private 또는 protected 멤버에 접근하려면 클래스 내부의 멤버함수 형태가 적합하다.

확장 함수는 클래스의 일부가 아니라, 클래스의 밖에 선언된다. 그러므로 클래스의 멤버함수처럼 상속할 수 없기 때문에 하위 클래스에서 확장함수를 재정의(오버라이드)할 수 없다.

코틀린 문법상 확장함수는 반드시 짧은 이름을 사용해야 하며, 과도하게 사용하면 코드의 가독성을 해칠 수 있다.

😁 확장함수 예시

문자열에 이메일 포맷인지 확인하는 기능 추가하기

fun main() {
    var str = "test1234@gmail.com"
    print("이메일 양식인가요? : ${str.isEmailValid()}")
}

fun String.isEmailValid(): Boolean { //String 클래스에 email 양식이 맞는지 확인하는 메소드를 추가
    val pattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+" //이메일 패턴
    return matches(pattern.toRegex()) //패턴이 맞다면 true, 아니면 false 반환
}

클래스를 변경하지 못하는 상황에서 확장함수로 메소드를 추가

fun main() {
    fun Student.getGrade() = println("학생의 등급은 ${this.grade} 입니다")//Student 클래스 객체에 getGrade 기능 추가
    
    var student = Student("참새", 10, "A+") //Student 객체 생성
    student.displayInfo() //displayInfo() 메소드 실행
    student.getGrade() //확장함수로 정의한 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} 입니다")
    }
}

문자열을 입력받았을 때, 정수인지 확인하는 확장함수

fun main() {
    var str = "123456"
    println("정수로 바꿀 수 있나요? : ${str.isNum()}")
}

fun String.isNum(): Boolean{
    return try {
        this.toInt() //Int 자료형으로 변환이 되면
        true //true 반환
    } catch (e: Exception) { //에러가 발생하면
        false //false 반환
    }
}

0개의 댓글