📑 목차
접근 제어자(Access Modifier) 는 클래스의 특정 필드나 메서드에 접근할 수 있는 범위를 설정하는 기능이다. 자바스크립트(ES6) 클래스에는 없는 타입스크립트만의 고유 기능으로, 객체 지향 프로그래밍의 특징인 은닉화(Encapsulation) 를 돕는다.
타입스크립트에는 다음 3가지의 접근 제어자가 존재한다.
public: 모든 범위에서 접근 가능protected: 클래스 내부 + 파생(자식) 클래스 내부에서만 접근 가능private: 오직 클래스 내부에서만 접근 가능
1. public (공공의)
public은 말 그대로 '공공의'라는 뜻으로, 어디서든 자유롭게 접근할 수 있다.
접근 제어자를 별도로 명시하지 않으면 기본적으로 public으로 설정된다.
class Employee {
// 필드 (기본적으로 public)
name: string;
public age: number; // 명시적으로 작성해도 됨
public position: string;
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
work() {
console.log("일함");
}
}
const employee = new Employee("조태민", 25, "developer");
// ✅ 외부에서 자유롭게 접근 및 수정 가능
employee.name = "강두칠";
employee.age = 21;
employee.position = "디자이너";
2. private (사적인)
private은 오직 해당 클래스 내부에서만 접근할 수 있다. 외부에서는 물론이고, 상속받은 자식 클래스에서도 접근할 수 없다. 가장 엄격한 제어자다.
class Employee {
private name: string; // 🔒 private 설정
public age: number;
public position: string;
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
work() {
// ✅ 클래스 내부에서는 접근 가능
console.log(`${this.name}이 일함`);
}
}
const employee = new Employee("조태민", 25, "developer");
// ❌ 오류 발생: 외부에서 접근 불가
// employee.name = "강두칠";
3. protected (보호된)
protected는 public과 private의 중간 단계다.
외부에서는 접근할 수 없지만, 클래스 내부와 이를 상속받은 파생 클래스(자식) 에서는 접근할 수 있다.
class Employee {
private name: string; // 나만 쓸 거야
protected age: number; // 자식한테는 물려줄 거야
public position: string; // 다 써도 돼
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
}
// Employee를 상속받은 자식 클래스
class ExecutiveOfficer extends Employee {
func() {
// this.name; // ❌ 오류 (private은 자식도 접근 불가)
this.age; // ✅ 가능 (protected는 자식 접근 허용)
}
}
const employee = new Employee("조태민", 25, "developer");
// ❌ 오류: 외부에서는 protected도 접근 불가
// employee.age = 30;
🔍 접근 범위 한눈에 보기
| 제어자 | 클래스 내부 | 자식 클래스 | 클래스 외부 |
|---|---|---|---|
| public | ⭕️ | ⭕️ | ⭕️ |
| protected | ⭕️ | ⭕️ | ❌ |
| private | ⭕️ | ❌ | ❌ |
4. 꿀팁: 생성자 매개변수로 필드 생략하기
타입스크립트에서는 생성자(constructor)의 매개변수에 접근 제어자를 붙여주면, 필드 선언과 초기화 코드를 한 번에 생략할 수 있다.
Before: 일반적인 작성법
필드 선언하고, 생성자에서 매개변수 받고, this로 할당하고... 코드가 길다.
class Employee {
private name: string;
protected age: number;
public position: string;
constructor(name: string, age: number, position: string) {
this.name = name;
this.age = age;
this.position = position;
}
}
After: 접근 제어자 활용 (추천 👍)
생성자 매개변수 앞에 public, private, protected 중 하나만 붙이면, 타입스크립트가 알아서 "아, 이거 필드로 만들고 값도 자동으로 넣으라는 거구나" 라고 이해한다.
class Employee {
// 필드 선언 제거!
// 초기화 코드(this.xxx = xxx) 제거!
constructor(
private name: string,
protected age: number,
public position: string
) {} // 생성자 본문이 비어있어도 됨
work() {
console.log(`${this.name} 일함`);
}
}
코드가 훨씬 간결해지므로 실무에서 매우 자주 사용하는 패턴이다.
요약
public: 기본값. 어디서든 접근 가능.private: 내 클래스 안에서만 접근 가능. (가장 엄격)protected: 내 클래스 + 상속받은 자식 클래스에서 접근 가능.- 필드 생략: 생성자 매개변수에 접근 제어자를 붙이면 필드 선언과 초기화를 자동으로 처리해 준다.
