객체 지향 프로그래밍(OOP)을 하다 보면, 클래스의 속성(프로퍼티)을 직접 접근하지 않고 안전하게 읽거나 수정해야 하는 상황이 자주 발생합니다.
이때 사용하는 방법이 바로 Getter와 Setter입니다.
Getter, Setter
- Getter: 객체의 속성 값을 가져올 때(get) 사용하는 메서드
- Setter: 객체의 속성 값을 설정할 때(set) 사용하는 메서드
즉, Getter/Setter는 단순히 값을 읽고 쓰는 기능을 넘어서, 데이터 접근 제어와 검증 로직을 포함할 수 있습니다.
예제
class User {
private _name: string;
constructor(name: string) {
this._name = name;
}
// Getter
get name(): string {
return this._name;
}
// Setter
set name(newName: string) {
if (newName.length < 2) {
throw new Error("이름은 최소 2글자 이상이어야 합니다.");
}
this._name = newName;
}
}
const user = new User("지민");
// Getter 사용 → 내부적으로 get name() 호출
console.log(user.name); // "지민"
// Setter 사용 → 내부적으로 set name() 호출
user.name = "윤지";
console.log(user.name); // "윤지"
// 잘못된 값
// user.name = "ㅋ"; // ❌ Error 발생
- 여기서 주목해야 할 점은 user.name이 단순히 속성 접근처럼 보이지만, 실제로는 get/set 메서드가 실행된다는 것입니다.
- 속성처럼 접근 가능
obj.getName() 같은 함수 호출이 아니라, obj.name처럼 단순한 속성 접근 방식으로 사용할 수 있습니다. - 캡슐화(Encapsulation)
private 필드(_name)를 외부에서 직접 수정하지 못하게 하고, Setter에서 검증 로직을 넣어 안정성을 확보합니다. - 읽기 전용 속성
Setter 없이 Getter만 만들면 해당 속성은 읽기 전용이 됩니다.
class Product {
private _price: number;
constructor(price: number) {
this._price = price;
}
// 읽기 전용 Getter
get price(): number {
return this._price;
}
}
const p = new Product(1000);
console.log(p.price); // ✅ 가능
p.price = 2000; // ❌ Error: setter가 없음
Angular에서 @Input() 데코레이터를 사용할 때, Getter/Setter를 응용하면 부모 컴포넌트로부터 전달된 데이터를 검증하거나 가공해서 쓸 수 있습니다.
@Component({
selector: 'app-user-card',
template: `<div>{{ userName }}</div>`
})
export class UserCardComponent {
private _userName = '';
@Input()
set userName(value: string) {
this._userName = value.trim(); // 앞뒤 공백 제거
}
get userName(): string {
return this._userName.toUpperCase(); // 항상 대문자로 표시
}
}
<!-- 부모 컴포넌트에서 전달 -->
<app-user-card [userName]="'jimin'"></app-user-card>
- 위 코드에서 userName은 단순히 문자열을 받는 것이 아니라, Setter에서 가공(trim) 후, Getter에서 변환(toUpperCase) 해서 UI에 보여주고 있습니다.
- Getter/Setter는 단순히 값을 읽고 쓰는 기능 이상으로, 검증, 가공, 보안을 위한 중요한 역할을 합니다.
- et/set 키워드를 이용해 속성처럼 접근 가능하게 만들 수 있습니다.
'개발 공부' 카테고리의 다른 글
| Prop Drilling (0) | 2025.10.24 |
|---|---|
| DFS, BFS (0) | 2025.10.08 |
| onAnimationStart, onShow (0) | 2025.09.28 |
| Navigation State (0) | 2025.09.27 |
| bind (0) | 2025.09.24 |