확장함수
클래스의 멤버 함수를 외부에서 더 추가할 수 있다.
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() // 지역함수는 그 지역 내에서만 사용이 가능하다.
}
전역변수
- 최상위에 있는 변수로 프로그램이 실행되는 동안 삭제되지 않고 메모리에 유지
- 여러 요소가 동시에 접근하는 경우에 잘못된 동작을 유발할 수 있음
(어디에서든 접근할 수 있으니 의도치않게 값이 수정되거나 하는 등 에러 발생률이 높아진다.) - 자주 사용되지 않는 전역 변수는 메모리 자원을 낭비한다.
지역 변수
- 특정 코드 블록 내에서만 사용이 가능하다.
- 블록 시작 시 임시로 사용되며 주로 스택 메모리를 사용한다.