객체지향 프로그래밍이란, 컴퓨터 프로그램을 어떤 데이터를 입력받아 순서대로 처리하고 결과를 도출하는 명령어들의 목록으로 보는 시각에서 벗어나,
여러 독립적인 부품들의 조합, 즉 객체들의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미한다.
쉽게 말해, 프로그램을 객체(Object)라는 기본 단위로 구성해 설계하고 구현하는 방법론이다.
현실세계의 사물, 개념을 소프트웨어 객체로 추상화하여, 코드의 재사용성, 유지보수성, 확장성을 높이는데 중점을 둔 방법론이다.
클래스 : Class
객체 : Object
인스턴스 : Instance
TypeScript에서의 클래스 정의 예시
class Person {
// 1. 속성 정의
name : string;
age : number;
// 2. 생성자 정의
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
// 3. 메서드 정의
greet(): void {
console.log('안녕 난 ${this.name}이고, ${this.age}살이야.');
}
}
TypeScript에서의 객체와 인스턴스
const minsu: Person = new Person("조민수", 26);
const seojin: Person = new Person("이서진", 24);
minsu.greet();
// 안녕 난 조민수이고, 26살이야.
Java
, Python
) 등에서는 추상 클래스, 인터페이스 등으로 구현된다.TypeScript에서의 추상화 - Interface
, Type
, Abstract Class
로 구현
// 1. Interface
interface Animal {
name: string;
age: number;
speak(): void;
}
// 2. Type
type Vehicle = {
brand: string;
year: number;
}
// 3. Abstract class
abstact class Shape {
color: string;
constructor(color: sring){
this.color = color;
}
// 추상 메서드
abstract area(): number;
// 일반 메서드
displayColor(): void {
console.log(this.color);
}
}
// 추상 클래스를 상속받는 구체 클래스
class Circle extends Shape {
radius: number;
...
// 추상 메서드 구현
area(): number {
return Math.PI * this.radius * this.radius;
}
}
TypeScript는
extends
를 활용해 속성과 메서드를 상속한다.
- 자식 클래스는
super
를 통해 부모 클래스의 메서드, 생성자 등을 호출한다.TypeScript
는 다중 상속을 지원하지 않는다.
메서드 오버라이딩 : Method Overriding
TypeScript
경우, override
를 명시할 수 있다.메서드 오버로딩 : Method Overloading
Java
의 경우, 전통적인 메서드 오버로딩을 지원하나,TypeScript
의 경우, 함수 시그니처를 사용한다.TypeScript의 함수 시그니처
class Calculator {
// 오버로드 시그니처 정의
add(a: number, b: number): number;
add(a: string, b: string): string;
add(a: number, b: number, c: number): number;
// 실제 구현부
add(a: any, b: any, c?: any): any {
if (typeof a === "number" && typeof b === "number" && typeof c === "number") {
return a + b + c;
} else if (typeof a === "number" && typeof b === "number") {
return a + b;
} else if (typeof a === "string" && typeof b === "string") {
return a + b;
} else {
throw new Error("잘못된 인자 타입입니다.");
}
}
}
hide
), 데이터를 조작하는 메서드만 공개(open
)하는 것public
, private
, protected
)를 통해 내부 속성과 메서드에 대한 접근성을 제한할 수 있다.public
class Hello {
name: string;
// 생략가능
...
public greet(): void { ... };
}
private
class Hello {
private age: number;
...
private getAge(): number {
return this.age;
}
}
protected
class Hello {
protected sex: string;
...
protected getSex(): string { ... };
}
readonly
class Hello {
readonly school: string;
...
}
객체지향 프로그래밍 및 설계의 다섯 가지 기본 원칙
1. S : SRP(Single Responsibility Principle)
2. O : OCP(Open/Closed Principle)
3. L : LSP(Liskov's Substitution Principle)
4. I : ISP(Interface Segregation Principle)
5. D : DIP(Dependency Inversion Principle)
객체지향은 가깝고도 먼, 그런 것이다...
마치 이해했다고 하지만 구현하면서 허점이 가장 많이 발생하는 방법론이기도 하다.
특히, 설계 과정에서의 치밀함, 높은 정확성이 필수적이라 생각하는데,
이는 전체 개발 과정에서의 시간 소요를 필히 증대시키기 때문에 가장 어렵게 생각하고 있다.
[참고자료]