Kotlin

확장 함수

공부처음하는사람 2023. 12. 23. 18:04

확장함수

클래스의 멤버 함수를 외부에서 더 추가할 수 있다.

fun 확장대상.함수명(매개변수, ...): 반환값 {
...
return
}

ExtensionFunction

fun main() {
    val source = "Hello World"
    val target = "Kotlin"
    println(source.getLongString(target))
}

// String을 확장해 getLongString 추가. (String은 Class인걸 생각하자)
fun String.getLongString(target: String): String =
    if (this.length > target.length) this else target
// this 키워드는 "hello world"를 지칭함
  • this는 확장 대상에 있던 자리의 문자열인 source 객체를 나타냄
  • 기존의 표준 라이브러리를 수정하지 않고도 확장이 가능

사용예시

  • 이름 나이만 출력하는 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} 입니다")
    }
}

Scope

  • 최상위 함수와 지역 함수
fun main() { // 최상위 레벨 함수 (top level function)
    ...
    fun secondFunc(a: Int) { // 지역 함수 선언 (local function)
        ...
    }
    userFunc(4) // 사용자 함수 사용 - 선언부 위치에 상관없이 사용
    secondFunc(2)   // 지역 함수 사용 - 선언부가 먼저 나와야 사용 가능
}

fun userFunc(counts: Int) { // 사용자가 만든 최상위 레벨의 함수
    ...
}
  • 최상위 레벨 함수와 사용자가 만든 최상위 레벨의 함수의 차이를 알자
  • 사용자 함수는 선언부의 위치에 관여받지 않는다.
  • 지역함수와 지역 변수는 같은개념이라고 봐두자.
fun a() = b()  // 최상위 함수이므로 b()함수 선언 위치에 상관없이 사용이 가능함.
fun b() = println("b")

fun c() {
    fun d() = e()  // d()는 지역함수이기 때문에 선언위치가 맞지않아 사용불가
    fun e() = println("e")
}

fun main() {
    a()  // 최상위 함수는 어디에서나 사용이 가능하다.
    e()  // 지역함수는 그 지역 내에서만 사용이 가능하다.
}

전역변수

  • 최상위에 있는 변수로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지
  • 여러 요소가 동시에 접근하는 경우에 잘못된 동작을 유발할 수 있음
    (어디에서든 접근할 수 있으니 의도치않게 값이 수정되거나 하는 등 에러 발생률이 높아진다.)
  • 자주 사용되지 않는 전역 변수는 메모리 자원을 낭비한다.

지역 변수

  • 특정 코드 블록 내에서만 사용이 가능하다.
  • 블록 시작 시 임시로 사용되며 주로 스택 메모리를 사용한다.

'Kotlin' 카테고리의 다른 글

다형성  (0) 2023.12.23
예외 처리  (1) 2023.12.23
고차함수와 람다식  (1) 2023.12.23
내일배움캠프 12.21 TIL  (0) 2023.12.22
스코프 함수  (0) 2023.12.22