PHpullh

TYPESCRIPT · 심층 가이드

TypeScript 객체지향 완전 정리

클래스와 생성자, 인터페이스, 캡슐화, 합성, 값 객체, 저장소·서비스 객체까지 TypeScript 객체지향 20가지 주제를 실무 기준으로 정리했습니다.

주제 20개 · 예제 코드 포함 · 최종 수정 2026-08-30 · 작성 pullh 편집팀

TypeScript의 타입 시스템은 구조적입니다. 어떤 인터페이스를 구현한다고 선언하지 않아도, 모양만 맞으면 그 자리에 들어갈 수 있습니다. 이름으로 호환을 판단하는 언어에서 넘어오면 이 점이 가장 낯설고, 동시에 가장 유용합니다. 인터페이스를 미리 상속 계층으로 설계하기보다 필요한 모양을 그때그때 기술하는 쪽이 잘 맞습니다.

기본 클래스 또는 구조체생성자와 초기화로 골격을 잡고, 인터페이스 또는 trait에서 구조적 타이핑을 확인하십시오. 상속 또는 확장합성으로 기능 묶기는 반드시 이어서 보는 편이 좋습니다. 대부분의 경우 상속보다 합성이 나은 이유가 두 항목을 비교할 때 드러납니다. 뒤쪽의 값 객체 비교불변 데이터 객체, DTO 매핑은 실무에서 가장 자주 쓰이는 조합입니다.

캡슐화에서 꼭 알아 둘 것이 있습니다. private 키워드는 컴파일 시점에만 작동하고 결과물에는 남지 않습니다. 즉 실행 중에는 외부에서 그 필드에 접근할 수 있습니다. 진짜로 숨겨야 하는 값이라면 #으로 시작하는 비공개 필드를 쓰십시오. 이쪽은 JavaScript 차원에서 강제되어 런타임에도 접근이 차단됩니다.

01기본 클래스 또는 구조체

TypeScript에서 기본 클래스 또는 구조체 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 기본 클래스 또는 구조체
class User {
  constructor(public name: string, public level: number) {}
  summary(): string { return `${this.name}:${this.level}`; }
}
console.log(new User("Ada", 1).summary());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

02생성자와 초기화

TypeScript에서 생성자와 초기화 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 생성자와 초기화
class Connection {
  constructor(public mode: string) {}
  static local(): Connection { return new Connection("local"); }
}
console.log(Connection.local());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

03인스턴스 메서드

TypeScript에서 인스턴스 메서드 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 인스턴스 메서드
class Logger { log(message: string): void { console.log(message); } }
class Service { constructor(private logger: Logger) {} run(): void { this.logger.log("start"); } }
new Service(new Logger()).run();
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

04정적 메서드

TypeScript에서 정적 메서드 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 정적 메서드
type Profile = Readonly<{ name: string; tags: string[] }>;
const profile: Profile = { name: "Ada", tags: ["ts"] };
console.log(profile);
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

05상속 또는 확장

TypeScript에서 상속 또는 확장 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 상속 또는 확장
class User {
  constructor(public name: string, public level: number) {}
  summary(): string { return `${this.name}:${this.level}`; }
}
console.log(new User("Ada", 5).summary());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

06인터페이스 또는 trait

TypeScript에서 인터페이스 또는 trait 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 인터페이스 또는 trait
class Connection {
  constructor(public mode: string) {}
  static local(): Connection { return new Connection("local"); }
}
console.log(Connection.local());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

07캡슐화

TypeScript에서 캡슐화 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 캡슐화
class Logger { log(message: string): void { console.log(message); } }
class Service { constructor(private logger: Logger) {} run(): void { this.logger.log("start"); } }
new Service(new Logger()).run();
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

08합성으로 기능 묶기

TypeScript에서 합성으로 기능 묶기 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 합성으로 기능 묶기
type Profile = Readonly<{ name: string; tags: string[] }>;
const profile: Profile = { name: "Ada", tags: ["ts"] };
console.log(profile);
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

09팩터리 메서드

TypeScript에서 팩터리 메서드 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 팩터리 메서드
class User {
  constructor(public name: string, public level: number) {}
  summary(): string { return `${this.name}:${this.level}`; }
}
console.log(new User("Ada", 9).summary());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

10열거형 상태 표현

TypeScript에서 열거형 상태 표현 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 열거형 상태 표현
class Connection {
  constructor(public mode: string) {}
  static local(): Connection { return new Connection("local"); }
}
console.log(Connection.local());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

11불변 데이터 객체

TypeScript에서 불변 데이터 객체 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 불변 데이터 객체
class Logger { log(message: string): void { console.log(message); } }
class Service { constructor(private logger: Logger) {} run(): void { this.logger.log("start"); } }
new Service(new Logger()).run();
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

12빌더 패턴

TypeScript에서 빌더 패턴 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 빌더 패턴
type Profile = Readonly<{ name: string; tags: string[] }>;
const profile: Profile = { name: "Ada", tags: ["ts"] };
console.log(profile);
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

13다형성

TypeScript에서 다형성 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 다형성
class User {
  constructor(public name: string, public level: number) {}
  summary(): string { return `${this.name}:${this.level}`; }
}
console.log(new User("Ada", 13).summary());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

14의존성 주입

TypeScript에서 의존성 주입 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 의존성 주입
class Connection {
  constructor(public mode: string) {}
  static local(): Connection { return new Connection("local"); }
}
console.log(Connection.local());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

15값 객체 비교

TypeScript에서 값 객체 비교 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 값 객체 비교
class Logger { log(message: string): void { console.log(message); } }
class Service { constructor(private logger: Logger) {} run(): void { this.logger.log("start"); } }
new Service(new Logger()).run();
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

16저장소 객체

TypeScript에서 저장소 객체 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 저장소 객체
type Profile = Readonly<{ name: string; tags: string[] }>;
const profile: Profile = { name: "Ada", tags: ["ts"] };
console.log(profile);
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

17서비스 객체

TypeScript에서 서비스 객체 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 서비스 객체
class User {
  constructor(public name: string, public level: number) {}
  summary(): string { return `${this.name}:${this.level}`; }
}
console.log(new User("Ada", 17).summary());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

18DTO 매핑

TypeScript에서 DTO 매핑 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// DTO 매핑
class Connection {
  constructor(public mode: string) {}
  static local(): Connection { return new Connection("local"); }
}
console.log(Connection.local());
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

19변경 불가능 업데이트

TypeScript에서 변경 불가능 업데이트 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 변경 불가능 업데이트
class Logger { log(message: string): void { console.log(message); } }
class Service { constructor(private logger: Logger) {} run(): void { this.logger.log("start"); } }
new Service(new Logger()).run();
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

20확장 스타일 동작

TypeScript에서 확장 스타일 동작 개념을 코드로 빠르게 확인하는 객체지향 예제입니다.

TypeScript code

// 확장 스타일 동작
type Profile = Readonly<{ name: string; tags: string[] }>;
const profile: Profile = { name: "Ada", tags: ["ts"] };
console.log(profile);
알아두면 좋은 점

객체 예제는 데이터와 동작이 어떻게 묶이는지에 집중하면 이해가 빨라집니다.

자주 하는 실수

객체 하나에 너무 많은 책임을 넣으면 구조가 빠르게 무거워집니다.

정리하며

  • 구조적 타이핑이라 선언 없이 모양만 맞으면 인터페이스를 만족합니다
  • 상속보다 합성을 기본값으로 두고 필요한 경우에만 계층을 만듭니다
  • private는 컴파일 시점 표시일 뿐 런타임에는 접근이 막히지 않습니다
  • 실제 은닉이 필요하면 # 접두사 비공개 필드를 사용합니다

더 깊이 들어가고 싶다면 TypeScript 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.