TypeScript

[TypeScript] 클래스 접근 제어자

2025년 11월 27일
2
TypeScriptStudyClassOOPAccessModifier

📑 목차

접근 제어자(Access Modifier) 는 클래스의 특정 필드나 메서드에 접근할 수 있는 범위를 설정하는 기능이다. 자바스크립트(ES6) 클래스에는 없는 타입스크립트만의 고유 기능으로, 객체 지향 프로그래밍의 특징인 은닉화(Encapsulation) 를 돕는다.

타입스크립트에는 다음 3가지의 접근 제어자가 존재한다.

  1. public: 모든 범위에서 접근 가능
  2. protected: 클래스 내부 + 파생(자식) 클래스 내부에서만 접근 가능
  3. 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} 일함`);
  }
}

코드가 훨씬 간결해지므로 실무에서 매우 자주 사용하는 패턴이다.


요약

  1. public: 기본값. 어디서든 접근 가능.
  2. private: 내 클래스 안에서만 접근 가능. (가장 엄격)
  3. protected: 내 클래스 + 상속받은 자식 클래스에서 접근 가능.
  4. 필드 생략: 생성자 매개변수에 접근 제어자를 붙이면 필드 선언과 초기화를 자동으로 처리해 준다.
@taemni

@taemni

안녕하세요, 차근차근 성장 중인 조태민입니다.

instagram

댓글