객체지향 프로그래밍이란? (Object Oriented Programming)
객체 간의 상호작용을 통해 프로그래밍하는 것
객체: 서로 연관된 변수와 함수를 그룹핑하고 이름을 붙인 것
클래스: 객체를 생성하기 위해 변수와 메서드를 정의하는 설계도, 틀
constructor: 인스턴스 객체를 생성하고, 초기화하는 메서드
인스턴스: 클래스로부터 만들어진 객체
객체지향 프로그래밍의 장점
코드 재사용성
- 상속을 통해 코드의 재사용성을 높일 수 있다.
유지보수가 쉬워진다
- 코드 수정 시, 캡슐화를 통해 주변에 미치는 영향을 최소화할 수 있다.
대형 프로젝트에 적합
- 클래스 단위로 모듈화 시켜서 개발할 수 있어서 업무 분담을 효율적으로 할 수 있다.
객체지향 프로그래밍의 단점
개발 속도가 느려진다.
- 설계 단계부터 많은 시간이 소요된다..
절차 지향 프로그래밍에 비해 실행 속도가 느림
객체지향 프로그래밍의 4가지 특징
추상화
추상화의 사전적 의미는 다음과 같다.
여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용.
즉, 구체적인 정보는 숨기고, 꼭 필요한 핵심만 추출해서 표현하는 방법이다.
출처: https://ko.wiktionary.org/wiki/%EC%B6%94%EC%83%81
프로그래밍에서의 추상화란 다음과 같다.
객체들의 공통 속성과 행위를 추출하는 것
자동차로 예를 들자면 자동차는 공통적으로 브랜드와 이름이 있고, 움직이고 멈출 수 있다.
속성: 브랜드, 이름
행위: 움직이고, 멈춤
캡슐화
객체지향 프로그래밍에서 캡슐화는 두 가지 측면이 있다.
1. 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶는다.
2. 실제 구현 내용 일부를 내부에 감추어 은닉한다.
출처: https://ko.wikipedia.org/wiki/%EC%BA%A1%EC%8A%90%ED%99%94
추상화로 객체들의 공통 속성과 행위를 정의했다면, 캡슐화로 객체의 속성과 행위를 하나로 묶는다.
class Car {
brand: string;
name: string;
constructor(brand: string, name: string) {
this.brand = brand;
this.name = name;
}
getMove(): void {
console.log(`${this.brand} ${this.name}가 움직인다.`);
}
getStop(): void {
console.log(`${this.brand} ${this.name}가 멈춘다.`);
}
}
상속
상위 클래스(부모 클래스)의 기능을 하위 클래스(자식 클래스)가 사용할 수 있는 개념이다.
중복되는 코드를 재사용하기 위해 사용한다.
먼저 상속을 사용하지 않고 현대 자동차와 기아 자동차에 대한 클래스를 만들어보자.
class HyundalGV80 {
brand: string = "Hyundal";
name: string = "GV80";
getMove(): void {
console.log(`${this.brand} ${this.name}가 움직인다.`);
}
getStop(): void {
console.log(`${this.brand} ${this.name}가 멈춘다.`);
}
getHyundalSound(): void {
console.log('현대 부르릉')
}
}
class KiaK5 {
brand: string = "Kia";
name: string = "K5";
getMove(): void {
console.log(`${this.brand} ${this.name}가 움직인다.`);
}
getStop(): void {
console.log(`${this.brand} ${this.name}가 멈춘다.`);
}
getKiaSount(): void {
console.log('기아 부르릉')
}
}
현대 자동차의 GV80과 기아 자동차의 K5에 대한 클래스가 잘 만들어졌다. 하지만 데이터 필드와 메서드가 중복되는 것에 아쉬움이 있다. 극단적으로 모든 종류의 자동차에 대한 클래스를 만든다고 한다면 굉장히 많은 중복 코드가 발생할 것이다.
이제 상속을 사용해서 중복 코드를 줄여보자. 아까 위에서 만든 Car 클래스를 사용해보자.
class Car {
brand: string;
name: string;
constructor(brand: string, name: string) {
this.brand = brand;
this.name = name;
}
getMove(): void {
console.log(`${this.brand} ${this.name}가 움직인다.`);
}
getStop(): void {
console.log(`${this.brand} ${this.name}가 멈춘다.`);
}
}
class HyundalGV80 extends Car {
getHyundalSound(): void {
console.log("현대 부르릉");
}
}
class KiaK5 extends Car {
getKiaSount(): void {
console.log("기아 부르릉");
}
}
const hyundalGV80 = new HyundalGV80("Hyundal", "GV80");
hyundalGV80.getMove(); // Hyundal GV80가 움직인다.
hyundalGV80.getHyundalSound(); // 현대 부르릉
hyundalGV80.getStop(); // Hyundal GV80가 멈춘다.
const kiaK5 = new KiaK5("Kia", "K5");
kiaK5.getMove(); // Kia K5가 움직인다.
kiaK5.getKiaSount(); // 기아 부르릉
kiaK5.getStop(); // Kia K5가 멈춘다.
다형성
다형성이란 하나의 메서드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
출처: https://opentutorials.org/module/516/6127
메서드 오버로딩
매개 변수만 다른 같은 이름의 함수를 여러 개 정의하는 것.
조건
- 함수 이름이 같아야 한다.
- 매개 변수의 순서는 같아야 한다.
- return type이 void가 아닐시에는 같아야 한다.
매개 변수 갯수가 같을 때
class Car {
getCarInfo(name: string): void {
console.log(`내 차 이름은 ${name}`);
}
}
class HyundalCar extends Car {
// 유니온 타입으로 선언 & 타입 가드
getCarInfo(name: number | string) {
typeof name === "number"
? console.log(`내 차 이름은 GV${name}`)
: console.log(`내 차 이름은 ${name}`);
}
}
const hyundalCar = new HyundalCar();
console.log(hyundalCar.getCarInfo(80)); // 내 차 이름은 GV80
매개 변수 갯수가 다를 때
class Car {
getCarInfo(name: string): void {
console.log(`내 차 이름은 ${name}`);
}
}
class HyundalCar extends Car {
// 유니온 타입으로 선언 & 옵셔널 & 타입 가드
getCarInfo(name: number | string, price?: string) {
typeof name === "number"
? console.log(`내 차 이름은 GV${name}, 가격: ${price}`)
: console.log(`내 차 이름은 ${name} 가격: ${price}`);
}
}
const car = new Car();
console.log(car.getCarInfo("GV80")); // 내 차 이름은 GV80
const hyundalCar = new HyundalCar();
console.log(hyundalCar.getCarInfo(80)); // 내 차 이름은 GV80, 가격: 6,136~7,056만원
메서드 오버라이딩
부모 클래스의 메서드를 자식 클래스에서 재정의 하는 개녕
'node.js' 카테고리의 다른 글
[Node] Mac OS에서 NVM 설치하기 (0) | 2023.01.28 |
---|---|
[node.js] nodejs로 크롤링(crawling) 시작하기 (2) | 2022.10.11 |
[node.js] nvm으로 프로젝트별 node version 관리하기 (0) | 2022.07.07 |
[node.js] package.json script 실행 파일 명령어 설정 ( --global ) (0) | 2022.06.24 |
[node.js] node.js + typescript 실행환경 세팅하기 (0) | 2022.06.23 |