사실 프로퍼티에 대한 개념은 어느정도 알고있다.
하지만 사용법과 개념만 알고있지 이 기능이 무엇이며 왜 사용하는지 깊게 생각해본적이 없다.
그렇기에 누군가에게 프로퍼티를 설명해보라고 하면 어중간한 답변을 할 수 밖에 없을 것 같다.
그래서 프로퍼티를 공부하며 생긴 질문들을 적고 답하며 자세히 알아보려고한다.
1. 프로퍼티가 뭐야?
프로퍼티는 getter와 setter을 이용하여 전용 필드의 값을 읽고 쓰거나 계산하는 등
유연한 방법들을 제공하는 클래스의 멤버다.
프로퍼티는 위 사진과 같이 변수의 값을 얻어낼 수 있는 get과 설정할 수 있는 set으로 선언된다.
2. 프로퍼티를 왜 쓰는거야?
일반적인 변수는 public과 private 등을 이용하여 접근제한을 하는데
public은 어디에서든 접근이 가능하여 편의성이 높아지지만 반대로 생각하면 굉장히 취약할 수 있다는
단점이 있다.
private는 자신의 클래스에서만 접근이 가능하여 정보가 유출될 일은 없지만 어느 클래스에서도
접근을 할 수 없기 때문에 편의성이 현저히 떨어진다.
그래서 이 두 가지 문제를 해결해주는 방법이 프로퍼티다.
이런 식으로 set부분에서 접근제한자를 자유롭게 설정할 수 있고
get으로 데이터를 얻어낼 수 있다.
그리고 프로퍼티를 사용하는 가장 큰 이유는 객체지향의 특징인 캡슐화를 지킬 수 있기 때문이다.
Property 클래스에서 data3에 다른 곳에 절대로 알려져서는 안될 중요한 계산 정보인
10 * value 메서드가 있다고 가정하자.
현재 Solution 클래스는 Property 클래스의 절대로 알려져서는 안될 정보를 갖고 싶다.
property의 data3값에 10을 set하고 값을 출력하여 100을 얻어냈다.
Property 클래스는 100이란 값이 10 * 10 을 해서 나왔다는 것을 알지만
Solution 클래스는 100이 어떤 방식으로 나왔는지 알 수 없다.
그렇기 때문에 Property 클래스는 구현 세부 정보를 숨기고 액세스를 제어할 수 있는
캡슐화를 지킬 수 있었다.
결론
프로퍼티는 정보의 읽기 쓰기와 로직의 추가에 있어서 굉장한 유연성
을 가졌고 캡슐화를 지키며 가독성도 챙길 수 있기 때문에 사용한다.
3. 그럼 모든 변수를 프로퍼티로 선언하면 안되나?
물론 프로퍼티는 캡슐화, 유효성 검사, 액세스 제어 등 이러한 측면에서 굉장한 이점을
제공하지만 굳이 모든 변수를 프로퍼티로 선언할 필요가 없다.
변수가 이미 내부 구현에 의해 설정되고 외부 코드에서 접근이 필요하지 않다면
간단한 변수선언으로 마무리하면 된다.
프로퍼티는 유용한만큼 많은 기능들이 있기 때문에 일반적인 변수 선언보다
성능적인 측면에서 약간의 오버헤드가 높아질 수 있다.
외부 코드에서 변수 데이터를 불러오고 싶은데 설정은 할 수 없게
즉, get은 자유롭고 set은 제한되게 하고 싶을 때 프로퍼티를 사용하는게 맞고
외부 코드에서 값의 읽기 쓰기를 모두 가능하게 해줄 때는 로직을 추가하거나 유효성 검사를 구현해야
한다면 프로퍼티, 아니라면 간단한 변수 선언으로 해결한다.
결론
읽기 쓰기에 있어서 제한이나 로직을 추가해야 한다면 프로퍼티를 사용하고
아니라면 간단한 변수를 선언하여 해결한다.
4. Get과 Set에서 로직을 추가할 수 있다면 함수형 프로그래밍 아니야?
물론 그렇게 생각할 수 있지만 OOP(객체지향 프로그래밍) 측면에서 메서드와 함수는 엄연히 다른 개념이다.
물론 메서드와 함수는 같은 의미의 단어로 사용되기도 하는데 프로퍼티의 Get과 Set은
OOP의 속성과 함께 일반적으로 사용되는 메서드고 함수는 특정 작업을 수행하는 재사용 가능한 코드
블럭을 말한다. 그래서 OOP 에서는 클래스나 객체와 연관되지 않은 것들을 함수 또는 프로시저라고 한다.
추가적으로 함수형 프로그래밍은 선언적이고 표현적인 스타일을 가지고
다양한 조건에서 기능이나 시스템에 적용되는 속성을 정의하는 속성 기반 테스트의 개념을 가진다.
결론
프로퍼티는 객체지향 프로그래밍과 관련이 있는 기능이다.
'TIL > Unity' 카테고리의 다른 글
[Unity] 코루틴은 비동기일까 동기일까? (0) | 2024.02.05 |
---|---|
[Unity] 델리게이트(Delegate)는 뭘까? (0) | 2024.02.02 |
[Unity] async 와 await (0) | 2023.12.14 |
[Unity] 컴포지션 패턴 (컴포지트 패턴) (0) | 2023.12.11 |
[Unity] 주의해야 할 기능 Find (0) | 2023.11.29 |