변화해야 하는 요소와 동일하게 유지해야 하는 요소를 분리해
가시성을 제어하자
코틀린에서 가시성을 제어하기 위해 어떤 것을 제공하는지 알아보는 아톰이다.
[ 접근 변경자 ]
- 가시성 제어를 위해 코틀린에서 제공
- public, private, protected, internal 등의 변경자가 존재하며, 해당 변경자를 통해 접근 여부 결정이 가능
- 접근 변경자는 클래스, 함수, 프로퍼티 정의 앞에 위치
[ public / private]
public
- 클라이언트 프로그래머 접근 가능
- 클라이언트 코드에 직접적으로 영향을 미침
- 변경자가 지정되어 있지 않은 경우의 디폴트 값으로 public 변경자는 기술적으로 불필요한 중복
private
- 숨겨져 있으며, 같은 클래스에 속한 다른 멤버만 접근 가능
- 정의를 변경하거나 삭제하더라도 클라이언트 프로그래머에게 직접적인 영향 없음
- 클래스, 최상위 함수, 최상위 프로퍼티에 붙은 경우 해당 파일 내부에서만 접근 가능
- 같은 클래스에 속한 멤버 외에는 아무도 이 멤버에 접근 불가능하며, 자신과 협력자들을 외부로부터 단절시킬 수 있음
* 클래스 내 멤버함수의 경우 같은 클래스 내부에서만 해당 함수를 참조하여 함수를 마음대로 변경하거나 제거 가능
* 클래스 내 프로퍼티에 private을 붙인 경우 참조를 private으로 정의하더라도 해당 참조가 가리키는 객체가 public 참조가 없다는 사실을 보장하지는 않음
[ RecordAnimals.kt ]
private var index = 0 // 최상위 프로퍼티
private class Animal(val name:String) // 클래스
private fun recordAnimal(animal:Animal){ // 최상위 함수
println("Animal #$index : ${animal.name}")
index++
}
fun recordAnimals(){
recordAnimal(Animal("Tiger")) // 최상위 프로퍼티, 클래스, 함수는 같은 파일 내 접근 가능
}
fun recordAmimalsCount(){
println("$index animals are here!")
}
[ ObserveAnimals.kt ]
fun main(){
// private이 붙은 최상위 프로퍼티, 클래스, 최상위 함수 접근 불가 (같은 파일이 아니기 때문)
// val rabbit = Animal("Rabbit")
// recoardAnimal(rabbit)
// index++
// private이 아니라면 접근 가능
recordAnimals()
recordAnimalsCount()
}
[ internal ]
- 정의가 포함된 모듈 내부에서만 접근 가능
- private ~ public 사이에 위치하며, private은 제약이 심하고 public으로 공개하기 애매한 경우 사용
- 라이브러리 내부에서 사용 가능하지만, 라이브러리를 소비하는 쪽에서 접근 불가능
* 모듈 : 코드 기반상에서 논리적으로 독립적인 각 부분을 의미
* 라이브러리 : 다양한 패키지가 들어있는 단일 모듈로 구성
[ 오늘의 학습 소감 ]
오늘은 접근 변경자인 private / public / internal에 대해서 알아보았는데, 자바와 크게 다르지는 않았다. 하지만, 접근 변경자는 중요한 개념이기도 하고 파고 들어가면 어렵기도 한 부분이라서 그런지 설명을 읽고 이해를 해서 받아들이는 시간이 짧지는 않았던 것 같다. 또한, 자바로만 보던 코드가 코틀린으로 변경되었을 뿐인데 아직은 조금 어색하게 느끼기도 했고, 이제 본격적인 코틀린 학습을 시작한 느낌을 받아서 그런지 어떤 내용들이 나올지 조금은 기대가 되는 아톰이었다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 22] 테스트 (0) | 2024.01.22 |
---|---|
[Atomic 21] 패키지 (0) | 2024.01.22 |
[Atomic 19] 생성자 (0) | 2024.01.18 |
[Atomic 18] 프로퍼티 (val & var) (0) | 2024.01.17 |
[Atomic 17] 클래스 만들기 (0) | 2024.01.16 |