객체 지향 프로그래밍(OOP)
- OOP는 컴퓨터 프로그램을 객체(Object)의 모임으로 파악하려는 프로그래밍 패러다임이다.
- 객체(Object)들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있다.
객체 지향 프로그래밍(OOP)의 장점
- 프로그램을 유연하고 변경이 용이하게 만든다.
- 프로그램의 개발과 보수를 간편하게 만든다.
- 직관적인 코드 분석을 가능하게 한다.
- 객체 지향 프로그래밍의 중요한 특성
강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향한다.
Class의 용어 설명
- 클래스의 요소
멤버(member)
필드(field)
생성자(constructor)
메소드(method)
- 인스턴스(instance) : new 연산자에 의해서 생성된 객체
Class 생성하기
- new를 사용하여 Person 클래스의 인스턴스를 생성한다.
- Person class의 멤버는 name, constructor, say()가 있다.
- 클래스 안에서 "this."를 앞에 붙이면 클래스의 멤버를 의미한다.
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
say() {
return "Hello, My name is " + this.name;
}
}
let person = new Person("june");
접근 제어자
- 속성 또는 메소드로의 접근을 제한하기 위해 사용한다.
- TypeScript에는 3종류의 접근 제어자가 존재한다.
- public > protected > private
- Java와 다르게 package 개념이 없어 default 접근 제어자는 존재하지 않는다.
접근 제어자 (public)
- 프로그램 내에서 선언된 멤버들이 자유롭게 접근할 수 있다.
- TypeScript에서 멤버는 기본적으로 public으로 선언된다.
- 명시적으로 멤버를 public으로 표시할 수도 있다.
class Animal {
public name: string
constructor(theName: string) {
this.name = theName;
}
}
new Animal("Cat").name;
접근 제어자 (private)
- 멤버가 포함된 클래스 외부에서의 접근을 막는다.
class Animal {
private name: string
constructor(theName: string) {
this.name= theName;
}
}
new Animal("Cat").name //Erorr:Property'name' is private and only accessible within class 'Animal'
상속
- OOP는 상속을 이용하여 존재하는 클래스를 확장해 새로운 클래스를 생성할 수 있다.
- extends 키워드로 Animal이라는 기초 클래스에서 Dog 클래스가 파생되었다.
- 파생된 클래스는 하위클래스(subclass), 기초 클래스는 상위클래스 (superclass)라고 부른다.
- Dog, Cat은 Animal의 기능 (move메소드)을 확장하기 때문에, move()와 makeDound()를 가진 인스턴스를 생성한다.
class Animal {
move(distanceInMeters: number) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
makeSound() {
console.log("멍멍!");
}
}
class Cat extends Animal {
makeSound() {
console.log("야옹!");
}
}
const dog = new Dog();
dog.move(10);
dog.makeSound();
const cat = new Cat();
cat.move(5);
cat.makeSound();
접근 제어자 (protected)
- 멤버가 포함된 클래스와 그 하위 클래스 외부에서의 접근을 막는다.
- Person에서 파생된 Employee의 인스턴스 메소드에서는 name을 사용할 수 있다.