[Kotlin] 프로퍼티 vs 필드
객체지향 프로그래밍을 해 본 사람이라면 프로퍼티와 필드가 무엇인지 모르시는 분들은 아마 없을 거라고 생각합니다. 클래스 내부에 존재하여, 객체의 상태를 나타내는 멤버 변수를 프로퍼티, 혹은 필드라고 부르게 되지요. 프로퍼티(property)라는 단어는 영어로 재산, 혹은 특성 정도의 의미를 지니고 있으니, 클래스의 멤버 변수를 프로퍼티라고 부르는 이유도 납득이 갑니다.
하지만 프로퍼티와 필드의 차이를 정확하게 알고 계시는 분은 의외로 적을 거라고 생각합니다. 두 개념이 비슷한 개념이기도 하고, 거의 동의어처럼 혼용해서 사용하시는 분들도 많은 것 같습니다. 저 또한 두 개념의 차이를 공부해도 이해가 잘 가지 않아 '뭐 거의 같은 거겠지' 하고 생각해 왔습니다.
그러다가 제가 지금 다니고 있는 우아한테크코스 6기에서 코치님이 수업 중 크루들에게 던진 질문 중 하나가 바로 이 프로퍼티와 필드의 차이는 무엇인가? 였습니다. 당시 마이크가 저에게 넘어왔었는데, 제대로 답변하지 못했습니다.
그래서 그 이후 프로퍼티와 필드의 차이에 대해서 제대로 알고 넘어가자!라는 생각을 하게 되었고, 이 글까지 쓰게 되었습니다. 서론이 길었네요. 본론으로 넘어가도록 하죠!
1. 결론부터!
결론부터 말씀드리는 것이 더 이해하기 쉬울 것 같습니다. 프로퍼티와 필드의 정확한 개념은 다음과 같습니다.
필드(field) : 멤버변수에 실제로 값이 저장되는 공간
프로퍼티(property) : 필드와 getter, setter를 포함한 개념 (단, val 변수의 경우 필드와 getter만 포함한 개념)
즉 프로퍼티는 필드를 포괄하는 상위 개념이라고 말할 수가 있겠습니다. 이해가 되시나요? 이해가 안 되시는 분들은 아래를 더 읽어보시죠!
2. 그래서 이게 무슨 말인데?
코틀린의 변수선언 키워드 val
과 var
는 단순히 '앞으로 이 변수를 사용하겠다'라는 의미가 아닙니다. 이 키워드는 변수를 선언함과 동시에 변수에 대한 getter와 setter 메서드를 자동으로 생성합니다(val은 getter만). 이 메서드들은 변수가 사용될 때마다 호출되어 수행됩니다. 외부에서 변수에 저장된 값을 읽을 때에는 getter메서드가, 변수에 저장된 값을 바꿀 때에는 setter메서드가 호출되어 수행되게 됩니다.
말로는 이해가 안 될 수도 있으니 다음의 코드를 봅시다.
class Alsong {
val name: String = "alsong"
var age: Int = 17
}
이 코드는 알송이라는 사람의 객체를 표현하는 클래스 Alsong이군요. 이 클래스는 멤버변수로 name
과 age
를 갖고 있습니다. 이름은 개명을 하지 않는 한 영원히 바뀌지 않을 것이니 val
키워드로 선언되어 있고, 나이는 매년 바뀌는 것이니 var
로 선언하였습니다.
그런데 이 코드는 사실 많은 것이 생략되어 있는 코드입니다. 아까 변수가 사용되면 getter와 setter가 호출되어 수행된다고 했죠? 이 getter, setter가 생략되어 숨어있는 것입니다. getter와 setter를 생략하지 않은 코드는 다음과 같습니다.
class Alsong {
val name: String = "alsong"
get() {
return field
}
var age: Int = 17
get() {
return field
}
set(value) {
field = value
}
}
get()
과 set()
이라는 함수가 생겨났군요. 이 함수가 각각 getter와 setter인 것입니다.
각 함수가 하는 일을 봅시다. get()
함수는 단순히 field
를 리턴하기만 하며, set()
함수는 단순히 인수를 받는 매개변수 value
를 field
에 넣어주기만 하는군요. getter가 수행된다는 것은 변수에서 값을 읽는다는 것을, setter가 수행된다는 것은 변수에 매개변수(value)를 넣어준다는 것을 의미합니다.
눈여겨볼 것은 field
입니다. 이 코드를 인텔리제이 IDEA에서 직접 입력해 보면 다음과 같이 나오게 됩니다.
보이시나요? field
에는 볼드 처리가 들어가게 됩니다. 이는 IDEA에서 field
라는 키워드를 특별취급 해주고 있다는 겁니다. 왜 특별취급 해주냐고요? field
는 변수의 값을 저장하는 특별한 장소니까요.
이렇게 풀어써보면 필드와 프로퍼티의 차이가 구분이 되실 거라고 생각합니다. 이 Alsong
이라는 클래스에서 필드는 뭐고 프로퍼티는 뭘까요? 당연히 필드는 field
이고, 프로퍼티는 name
과 age
가 되는 것이죠.
이해가 되었으면 좋겠습니다! 읽어주셔서 감사합니다~~
