set & get을 사용하는 이유
1. 데이터 캡슐화와 정보 은닉
- 캡슐화: 외부에서 직접 접근하지 못하게 하여 객체의 데이터가 의도치 않게 변경되는 것을 방지
- 정보 은닉: 객체의 내부 구현을 숨기고, 외부에 노출되는 인터페이스를 통해서만 상호작용하도록, 이를 통해 객체의 내부 구조를 변경하더라도 외부 코드에 영향을 미치지 않게 할 수 있음
2. 데이터 검증
- 유효성 검사: set 메소드를 통해 데이터가 설정될 때 유효성을 검사할 수 있고 이를 통해 잘못된 데이터가 객체의 상태를 망치는 것을 방지
예시 코드
void setValue(int value) {
if (value >= 0) {
m_value = value;
emit valueChanged(value);
}
}
3. 로직 추가
- 부가 작업 수행: set or get 메소드에서 데이터를 설정하거나 가져올 때 추가적인 작업을 수행할 수 있음
void setValue(int value) {
if (m_value != value) {
m_value = value;
emit valueChanged(value);
}
}
int getValue() const {
// 예를 들어, 로깅 작업을 할 수 있습니다.
return m_value;
}
4. 인터페이스 일관성
- 일관된 접근 방법: 객체의 속성에 일관되게 접근할 수 있음 -> 코드의 가독성 높이고 유지보수 쉽게함
counter.setValue(10);
int currentValue = counter.getValue();
5. 나중에 확장성
- 확장 가능성: 나중에는 복잡한 로직이 필요해질 수 있음. set & get은 내부구현을 변경하면서도 외부 인터페이스는 그래로 유지할 수 있음
예를 들어, 뮤텍스를 추가할 수 있음
void setValue(int value) {
QMutexLocker locker(&m_mutex); // 뮤텍스를 사용하여 스레드 안전성 확보
if (m_value != value) {
m_value = value;
emit valueChanged(value);
}
}
int getValue() const {
QMutexLocker locker(&m_mutex); // 뮤텍스를 사용하여 스레드 안전성 확보
return m_value;
}
private:
mutable QMutex m_mutex;