[TypeScript] Set/Get, Protected, Private/Public/Static Members

이번 글에서는 set/get, protected, private/public, static 멤버의 복잡한 기능에 대해 살펴보겠습니다. 이러한 기능은 타입스크립트 클래스 내에서 접근과 가시성을 제어하는 데 중요한 역할을 합니다. 멤버 가시성 및 접근 제어의 미묘한 차이를 살펴보고 강력하고 캡슐화된 코드 구조를 만드는 데 필요한 도구를 함께 살펴보세요.

1. Public, Private, and Protected Members

  • Public: public으로 표시된 멤버는 클래스 외부에서 액세스할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
class Car {
public model: string;

constructor(model: string) {
this.model = model;
}
}

const myCar = new Car('Kia');
console.log(myCar.model); // 접근 가능
  • Private: private로 표시된 멤버는 클래스 내에서만 접근할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Car {
private model: string;

constructor(model: string) {
this.model = model;
}

getModel(): string {
return this.model; // 클래스 내에서 접근 가능
}
}

const myCar = new Car('Toyota');

// console.log(myCar.model); // Error: 속성 'model'은 비공개이며 'Car' 클래스 내에서만 액세스할 수 있습니다.

console.log(myCar.getModel()); // 메서드를 통해 접근할 수 있습니다.
  • Protected: protected으로 표시된 멤버는 클래스와 그 하위 클래스(파생 클래스) 내에서 액세스할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Vehicle {
protected wheels: number;

constructor(wheels: number) {
this.wheels = wheels;
}
}

class Car extends Vehicle {
constructor(wheels: number) {
super(wheels);
}

getWheels(): number {
return this.wheels; // 파생 클래스에서 접근 가능
}
}

const myCar = new Car(4);

// console.log(myCar.wheels); // Error: 'wheels' 속성은 보호되어 있으며 'Vehicle' 클래스와 그 하위 클래스 내에서만 접근할 수 있습니다.

console.log(myCar.getWheels()); // 메서드를 통해 액세스할 수 있습니다.

2. Getter and Setter

  • Getter: private 속성의 값을 검색하는 데 사용됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Circle {
private _radius: number;

constructor(radius: number) {
this._radius = radius;
}

get radius(): number {
return this._radius;
}
}

const myCircle = new Circle(5);

console.log(myCircle.radius); // getter를 통해 접근 가능
  • Setter: private 프로퍼티의 값을 업데이트하는 데 사용됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Circle {
private _radius: number;

constructor(radius: number) {
this._radius = radius;
}

get radius(): number {
return this._radius;
}

set radius(newRadius: number) {
if (newRadius > 0) {
this._radius = newRadius;
}
}
}

const myCircle = new Circle(5);

console.log(myCircle.radius); // 5

myCircle.radius = 7; // setter를 통해 설정합니다.

console.log(myCircle.radius); // 7

myCircle.radius = -3; // setter에 의해 무시됨

console.log(myCircle.radius); // 7

3. Static Members

정적 멤버는 클래스의 인스턴스가 아닌 클래스 자체에 속합니다.

1
2
3
4
5
6
7
8
9
10
11
class MathOperations {
static PI: number = 3.14159;

static calculateCircumference(radius: number): number {
return 2 * this.PI * radius;
}
}

console.log(MathOperations.PI); // 정적 속성 접근하기

console.log(MathOperations.calculateCircumference(5)); // 정적 메서드 호출하기

정적 멤버는 인스턴스를 생성하지 않고 클래스에서 직접 액세스할 수 있습니다.

결론

이러한 기능은 클래스의 내부 상태에 대한 액세스를 캡슐화하고 제어할 수 있는 방법을 제공하여 코드 구성과 유지보수성을 향상시킵니다. 각 멤버에 대해 원하는 캡슐화 수준과 가시성에 따라 적절한 접근 제어자를 선택하세요.

Share