객체지향 프로그래밍(OOP)이란?
OOP는 컴퓨터 프로그램을 "객체(Object)"의 모임으로 파악하려는 프로그래밍 패러다임 중 하나이다.
큰 문제를 클래스로 쪼개고 클래스 간의 관계를 상속이나 포함으로 고려해가면서 추가한다.
각 객체들은 서로 메시지를 주고 받으며 데이터를 처리할 수 있다.
객체 지향 프로그래밍(OOP)의 장점
- 프로그램을 유연하고 변경이 용이하게 만든다.
남이 만든 클래스를 가져와서 이용가능하며 상속을 통해 확장할 수 있다.
- 프로그램의 개발과 보수를 간편하게 만든다.
절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하지만,
객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 된다.
- 직관적인 코드 분석을 가능하게 한다.
직관적인 코드분석이 가능 하므로 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉬워진다.
객체 지향 프로그래밍(OOP)의 단점
- 처리 속도가 상대적으로 느림
- 객체가 많으면 용량이 커질 수 있음
- 설계시 많은 시간과 노력이 필요
객체지향프로그래밍의 기본 구성 요소
- 클래스(Class)
같은 종류의 집단에 속하는 속성과 행위를 정의한 것. 다른 클래스와 독립적으로 디자인해야 한다. 위의 예제에서 몬스터(Monster) 의 특성과 행위들을 정의한 객체가 클래스가 될 것이다. - 객체(Object)
클래스의 인스턴스(Instance). 상위 클래스의 속성을 가지고 있으면서 개별적인 특성과 행위(메소드 : Method) 또한 가지고 있다. 위의 예제에서는 드래곤, 좀비, 해골 등이 각각의 객체가 된다. - 메서드(Method)
클래스로부터 생성된 객체를 사용하는 방법. 객체의 속성을 조작하는 데 사용된다. 위의 예제에서 각각의 몬스터들이 레벨업을 하는 행위가 메서드(method)라고 볼 수 있다.
클래스의 요소
멤버(member)
필드(field)
생성자(constructor)
메소드(method)
Class 선언
JS와 동일하게 클래스 생성 시 class 키워드를 이용하여 생성한다.
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
say() {
return 'Hello, Myname is' + this.name;
}
}
//new를 사용하여 Person 클래스의 인스턴스를 생성한다.
let person = new Person('june');
클래스 적용 방법
my name is Eundomi 출력하기
class Person {
name: string
constructor(name: string) {
this.name = name
}
// "my name is" + this.name을 출력하는 say() 함수를 완성하세요.
say() {
console.log('my name is '+this.name)
}
}
// Person 클래스의 인스턴스를 생성하여 "my name is 엘리스"가 출력되도록 say() 함수를 호출하세요.
const person=new Person('Eundomi');
person.say();
TypeScript의 접근제어자
속성 또는 메소드로의 접근을 제한하기 위해 사용된다.
- public : 자식 클래스 및 외부 객체에서 접근 할 수 있음
- protected : 자식 클래스에서만 접근 가능
- private : 현재 클래스에서만 접근 가능
1. Public
프로그램 내에서 선언된 멤버들이 자유롭게 접근가능하다.
기본적으로 public으로 선언되며, 객체 내부, 외부 상속도 가능하다.
class Animal {
public name: string
constructor(theName: string) {
this.name = theName;
}
}
new Animal('Cat').name;
2. Protected
멤버가 포함된 클래스와 그 하위 클래스 외부에서의 접근을 막는다.
Person에서 파생된 Employee 의 인스턴스 메소드에서는 name을 사용할 수 있다.
class Person {
protected name: string
constructor(name: string) {
this.name = name;
}
}
class Employee extends Person {
private department: string
constructor(name: string, department: string)
{
super(name);
this.department = department;
}
public getElevatorPich() {
return `Hello, my name is ${this.name} and I work in ${this.department}.`;
}
}
let howard = new Employee('Howard', 'sales');
console.log(howard.getElevatorPich())
console.log(howard.name) //오류
3. Private
멤버가 포함된 클래스 외부에서의 접근을 막는다.
class Animal {
private name: string
constructor(theName: string) {
this.name = theName;
}
}
new Animal('Cat').name; //오류 : name 필드가 private으로 선언되었기 때문에
+정보은닉 (캡슐화) 같은 클래스끼리만 접근 가능 : 객체지향언어의 특성
상속
클래스 계층을 만들어, 코드의 중복을 줄이는 방법이다.
extends 키워드로 상속 가능하며,
파생된 클래스는 하위클래스 (subclass) 기초클래스는 상위클래스(superclass)라고 부른다.
또한 자식 클래스가 부모 클래스를 상속 받을 때는 자식 클래스의 생성자 함수에서 super메소드를 이용하여 부모 클래스의 생성자 함수를 호출해 줘야 한다
class Animal {
move(distanceInMeters: number) {
console.log(`Animal moved ${distanceInMeters}m.`);
}
}
class Dog extends Animal {
makeSound() {
console.log('멍멍!');
}
}
const dog = new Dog();
dog.move(10);
dog.makeSound();
클래스의 getter, setter
비공개로 설정하려는 속성은 private으로 설정하고, 속성값을 읽고 수정하는 getter/setter 함수를 사용한다.
(속성에 직접 접근하여 수정하면 데이터 무결성이 깨질 수 있다.)
class Person {
private _name: string
get name() {
return this._name;
}
set name(name: string) {
if(name.length > 10) {
throw new Error('name too long');
}
this._name = name;
}
}
let person = new Person();
console.log(person.name); // undefined
person.name = 'june';
console.log(person.name); // june
person.name = 'junejunejunejunejunejune'// throw error
위 타입스크립트에서 멤버 변수에 접근하기 위해서는 name이라는 getter함수를 호출해야하며 name을 설정하기 위해서는 name setter함수를 선언해서 할당해줘야한다. 멤버 변수를 외부에서 접근할 수 없도록 private 키워드를 사용했기 때문에 Get접근자와 Set접근자를 사용해야한다.
readonly
readonly가 선언된 변수는 초기화되면 재할당이 불가능하다.
선언될 때나 생성자에서 값을 설정하면 이후 수정할 수 없다.
class Person {
readonly age: number = 20 // 선언 초기화
constructor(age: number) {
this.age = age;
}
}
let person = new Person(10); // 생성자 초기화
person.age = 30; //오류
정적 변수와 정적 메소드
타입스크립트에서는 static키워드를 지원한다. static키워드는 클래스에 정적 멤버 변수나 정적 메서드를 선언할 때 사용할 수 있는데, 객체 생성없이 접근이 가능함으로 메모리의 절약 효과가 있다.
class Computer{
static cpu="4690"
}
Computer.cpu // 접근 가능
이런 정적 변수의 외부 접근 차단을 위해선 앞에 private 접근 제한자를 선언해줄 수 있다.
class Computer{
private static cpu="4690"
}
Computer.cpu // 접근 불가능
class Computer{
private state graphicCard : number= "150";
static cpuPower:number=50;
static isPowerOk(power:number):boolean{
if((this.graphicCard + this.cpu)*2 >power){
return true
}
return false
}
get cpu():number{
return Computer.cpu
}
static set cpu(power:number){
Computer.cpu=power;
}
}
위와 같이 정적 멤버 변수는 객체로 만들지 않고 사용이 가능하다.
추상클래스
추상클래스는 다른 클래스들이 파생될 수 있는 기초 클래스이다.
abstract 키워드는 추상클래스나 추상 메소드를 정의하는데 사용된다.
abstract class Animal {
protected name: string
constructor(name: string) {
this.name = name;
}
abstract makeSound(): void
move(): void {
console.log('move!!');
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log(this.name + ' 멍멍!!')
}
}
const animal = new Animal('animal'); // 오류
const dog = new Dog('진돗개');
dog.makeSound(); //진돗개 멍멍!!
'PROGRAMING > TYPESCRIPT' 카테고리의 다른 글
TypeScript 07 Generic (0) | 2021.11.26 |
---|---|
TypeScript 06 인터페이스 (0) | 2021.11.26 |
TypeScript 04 함수 사용 (0) | 2021.11.24 |
TypeScript 03 Utility types (0) | 2021.11.24 |
TypeScript 02 TypeScript의 기본 Type (0) | 2021.11.24 |