2024-05-03 [Kotlin 코틀린 접근 제한자와 Property(프로퍼티)]
본 캠프에서 지급해주는 강의를 코드를 작성하고, 알고리즘 풀이를 진행하는데 다소 한계가 있다는 생각이 들었습니다.
(사실 모두 가능하기는 하지만 알고리즘 다른 사람들의 풀이를 보았을 때 이해하지 못하는 여러 부분들이 발생하기도 하고,
코드를 비효율적으로 작성하는 부분이 지속적으로 발생한다고 생각)
그래서 이전 매니저님이 추천해주신 강의를 추가 수강하고 있고, 수강 중 어려운 개념들이 있어 추가학습을 위해 해당 개념들을 다루게 되었습니다. (많은 부분들을 구글링을 통해 개념을 이해하는 부분이 있어 혹시 틀린 부분이 있다면 피드백 적극 환영입니당..)
접근 제한자
[접근 제한자란 ?]
- 접근 제한자는 객체가 공개 되어야 하는 범위를 정해주는 역할을 하는 것을 의미하는데, 만약 자바 언어를 학습한 경험이 있다면 접근 제한자(Access Modifier)라는 것이 어색하지 않으실 겁니다. (실제로 강의 진행 시 자바 코드와 비교하며 설명해주시는 부분이 많았습니다.)
코틀린에서는 Visibility Modifier로 사용을 하고 있고 이것이 가시성 수정자 라는 것 보다 접근 제한자가 조금 더 친숙해 접근 제한자로 표현을 하였습니다.
객체가 가지고 있는 변수는 변수명 뒤 . 연산자를 통해 자유롭게 접근이 가능한데, 접근 제한자를 활용 시 해당 변수에 접근할 수 있는 권한을 설정하여 처음 개발자가 설계한대로 흘러가지 않고 다르게 오작동하는 것을 방지하고자 접근 제한자를 활용합니다.
Kotlin 의 경우 Decompile 확인 시 Class 안 정의한 모든 멤버 변수는 기본적으로 Private 이 붙습니다.
( = 주 생성자로 변수를 정의하던 코드 내 직접 정의를 하던 Java 코드로 확인 시 모두 private 이 붙습니다.)
접근 제한자의 종류는 총 4가지가 있습니다. 그리고 클래스와 변수 / 메서드에 활용이 가능한 접근 제한자의 종류가 달라 다음과 같이 분리하여 이해하시는 것이 좋습니다.
[클래스]
private : 외부에서 객체를 생성할 수 없습니다. (접근이 불가능합니다.)
public : 외부에서 객체를 생성할 수 있습니다. (기본)
protected : 클래스에서는 다음 접근 제한자를 지정할 수 없습니다. (클래스에 지정할 경우 오류가 발생)
interal : 모듈이 동일한 경우에만 상속을 받거나 객체를 생성할 수 있습니다.
변수와 메서드
privaate : 외부에서 접근할 수 없습니다.
public : 외부에서 접근이 자유롭습니다.
protected : 상속 관계일 경우에만 접근이 가능합니다.
interal : 모듈이 같은 경우에만 접근이 가능합니다.
Property
[캡슐화]
- 객체가 가지고 있는 변수(어떤 데이터를 저장하기 위한 기억 장소)는 메서드에 구현한 코드가 정상적으로 동작하기 위한 데이터를 담고 있는데,
만약 변수에 의도하지 않은 데이터가 담긴다면(EX. 나이 관련 변수를 저장하는 곳에 양수가 아닌 데이터가 담긴다면)
구현한 코드가 정상적으로 동작한다고 하더라도 정상적인 결과가 나올 수 없게 되어 변수의 직접적인 접근을 차단하여 외부에서 값을 변경하지 못하도록 막는 것을 의미합니다.
[Property]
- 캡슐화가 적용된 변수는 외부에서의 접근이 차단되는데, 캡슐화가 적용된 변수들 중 메서드를 통해 값을 설정하거나(Setter) 가져다 사용할 수 있도록(Getter) 구성하는 것을 Property 라고 부릅니다.
(Class에 변수를 접근할 때 .을 통해 마치 코드에 직접 접근하는 것처럼 보이나 getter, setter를 호출하여 값을 반환 받거나 전달받아 동작합니다.)
코틀린에서는 프로퍼티를 정의할 때 val 또는 var 키워드를 사용하며 val은 읽기 전용 프로퍼티를, var은 읽기와 쓰기가 가능한 프로퍼티를 선언합니다.
[프로퍼티 사용하기]
- 프로퍼티는 클래스의 멤버이므로, 해당 클래스의 인스턴스를 생성한 후 접근할 수 있습니다. 프로퍼티에 값을 할당하거나 조회할 때는 도트(.) 연산자를 사용합니다.
코틀린에서는 프로퍼티에 대한 접근자(Getter)와 설정자(Setter) 메서드를 따로 정의하지 않아도 자동으로 생성되며, 접근자는 프로퍼티의 값을 반환하고, 설정자는 프로퍼티의 값을 변경합니다.
[코틀린에서 getter, setter를 인위적으로 형성하는 방법]
var a: Int = 100
get() {
println(“get 호출”)
return field
} // field 는 a라는 변수를 의미하며 a가 가지고 있는 값을 rerturn 하게 된다.
set(value) {
println(“set 호출”)
field = value
} // 매개변수 a로 들어오는 값을 field에 넣어주겠다, 즉 세팅하겠다는 것을 의미합니다.
[프로퍼티의 장점]
코틀린의 프로퍼티는 자바의 field와 getter/ setter method를 캡슐화하여 보다 간결한 코드를 작성할 수 있습니다.
val 프로퍼티는 불변성을 보장하기 때문에 안전한 프로그래밍을 할 수 있습니다.
프로퍼티의 확장을 통해 기존 클래스에 새로운 기능을 추가할 수 있습니다.
[프로퍼티의 장점]
클래스에 많은 프로퍼티가 존재할 경우 코드가 복잡해질 수 있습니다.
이를 방지하기 위해 상황에 맞게 클래스를 분리하거나 데이터 클래스를 사용할 수 있습니다.