Hello, Android!
프로퍼티 접근자 본문
지금까지 코틀린에서 클래스 내에 변수를 선언하면 프로퍼티 라고 불렀다
자바에서는 클래스 내에 변수를 선언하면 필드 라고 부른다
클래스의 프로퍼티(필드)에 누구든 접근하여 데이터를 쓸수있다면
데이터의 무결성이 깨질수도 있고 보안상의 문제가 있을수도 있다
그래서 필드의 접근 범위를 private으로 제한하여 사용한다
하지만 자바에서도 private로 제한하면 해당 클래스 내에서만 접근이 가능하기 때문에
필드에 접근이 가능한 getter, setter함수를 만들어 간접적으로 접근한다
이를 접근자, 접근자 메서드 라고 부르는데
그렇기 때문에 필드가 늘어나면 늘어날수록 접근자 메서드의 수도 늘어나게 된다
하지만 코틀린의 프로퍼티에서는 접근자 함수가 자동으로 생성된다
위의 Person클래스는 주 생성자에서 _country, _name, _age를 받아서 프로퍼티에 다시 할당한다
country는 val 불변 변수로 선언되었고 name, age는 var로 변경이 가능한 변수로 선언되어있다
main에서 Person의 객체를 생성하여 .프로퍼티명 으로 참조를 하고 값을 변경하였다
. 을 이용하여서 직접 프로퍼티에 접근하는것 처럼 보이지만
코플린 내부의 접근자 함수를 통해 접근하는것이다
심지어 코틀린에서는 위를 더 축약하여
주 생성자를 이용하여 더욱 간단하게 축약할수도 있다
- 기본 접근자 직접 지정하기
접근자는 기본적으로 코틀린에서 만들어져 있지만
필요하다면 기본 접근지정자를 직접 만들수도 있다
var 프로퍼티면 : 타입 = 값
get() {게터 내용}
set(value) {세어 내용}
의 형태이며, 프로퍼티를 var로 선언하는 경우에는 게터 세터 둘 다 선언 가능하지만
val로 선언하는 경우 값을 변경할수 없기 때문에 게터만 가능합니다
위의 코드에서 사용자 정의 접근함수는 기본적인 형태이다
get(), set()에서 field와 value가 보이는데
value는 set()의 매개변수이며 외부로부터 전달된 값을 받는다
main에서 name과 age에서 넘겨준 "muzi", 4 와 같은 값이 set의 매개변수 value에 할당되며
다른 이름으로 사용하는것도 가능하다
field는 프로퍼티를 참조하는 변수이며 이는 이름이 정해져 있어서 다른 이름으로 사용할수 없다
- field
field는 프로퍼티를 참조하는 변수로, 보조 필드 라고도 한다
get()=field에서 field는 각 프로퍼티의 값을 읽는 특별한 식별자이다
get()에서 field 대신 프로퍼티명을 직접 사용하여 get() = name 이라고 하면
다시 get()을 호출하여 get() = get() 과 같이 재귀호출이 되어 스택오버플로우가 발생할수 있다
set()을 할때도 프로퍼티명을 직접 사용하지 않도록 조심해야 한다
name과 age의 get, set을 수정하여 name의 get은 넘겨받은 문자열 매개변수의 길이를 출력할때
프로퍼티명을 직접 사용하지 않고 field.length 으로 사용하여 길이를 출력하였다
만약 field를 사용하지않고 프로퍼티명을 직접 사용하면 get()을 재귀호출하여 스택 오버플로우가 발생하게 된다
- 프로퍼티 오버라이딩
프로퍼티는 기본적으로 오버라이딩이 불가능한 final이다
만약 프로퍼티를 오버라이딩 할때는 open으로 프로퍼티를 선언해야한다
person2에서 person1을 상속받아 age를 오버라이딩 하면서
age의 접근자 get() 또한 오버라이딩 하였다
main에서 person2의 객체의 age를 참조할때는 오버라이딩 후의 get()이 호출되어
person2 age get이 출력되고 age의 값이 4를 곱한 값이 출력된다
하지만 name은 오버라이딩을 하지 않았고 person2에 없기때문에 부모인person1의 값이 출력된다
오버라이딩시 val 로 선언된 프로퍼티는 자식 클래스에서 var로 변경이 가능하지만
그 반대인 부모의 var 선언 변수를 자식에서 val로 바꾸는것은 불가능하다