반응형
SMALL
1️⃣ 절차지향
- 말 그대로 위에서 아래로 프로그램이 유기적으로 연결되도록 순차적인 처리를
하는 방식입니다. - 보통 실행 속도가 빠르며 시간적 유리함을 가진다는 것이 특징입니다.
- 다만 유지 보수가 어렵고 실행 순서가 정해져 있어 순서를 바꾸거나 수정 시
결과값이 달라질 수 있고 그에 따라 디버깅이 어렵습니다.
2️⃣ 객체지향
- 실제 세계를 모델링하여 소프트웨어를 개발하는 방법.
- 즉, 프로그래밍에서 필요한 데이터를 추상화 시켜상태와 행위를 가진
객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는
프로그래밍 방법입니다.
▶ 객체 지향 프로그래밍은 크게 추상화 , 캡슐화 , 상속 , 다형성 의
네가지 특징을 가집니다.
1. 추상화
- 중요한 기능만 노출, 구현에 관한 세부 사항은 숨김
즉, 불필요한 정보는 숨기고 중요한 정보만 표시 - 장점
- 다른 객체들은 노출된 속성, 기능만 신경쓰면 됨
- 객체들 사이의 의존성이 낮아짐
- 유연하게 개발이 가능함
ex)
| Class: Singer | Object: Dean, Crush, Zion.T |
| Class: Game | Object: Lol, BattleGround, Overwatch |
추상화를 통한 큰 카테고리 안에 부속을 자유롭게 넣을 수 있는 특징
2. 캡슐화
- 추상화된 객체 내부에 접근하지 못하도록 막는 것 ( = 정보은닉의 특성 )
- 장점
- 개발자의 실수를 방지 할 수 있음
- 안정성 높은 코드 개발이 가능함
- Getter와 Setter를 통해 특정 프로퍼티의 수정이나 접근을 제한
- ex) 코드 예시
class Customer {
#name; // 프라이빗 속성으로 외부에서 직접적인 접근 불가
constructor(name) {
this.#name = name; // 생성자를 통한 초기화
}
// Getter: 외부에서 name 속성에 접근할 때 사용
get name() {
return this.#name;
}
// Setter: 외부에서 name 속성을 변경할 때 사용
set name(regName) {
if (regName.length > 0) { // 유효성 검사
this.#name = regName;
} else {
console.log("이름을 입력해주세요.");
}
}
}
// 객체 생성
const customer = new Customer("김삿갓");
// Getter를 사용하여 name 읽기
console.log(customer.name); // 출력: 김삿갓
// Setter를 사용하여 name 변경
customer.name = "이상";
console.log(customer.name); // 출력: 이상
// 유효성 검사 시도
customer.name = ""; // 출력: 이름을 입력해주세요.
console.log(customer.name); // 출력: 이상
3. 상속
- 하위 클래스가 상위 클래스의 프로퍼티와 메소드를 물려받는 것
- 클래스 이름 옆에 `extends` 키워드 사용
- 장점
- 코드 재사용성이 좋아짐
- ex) 코드 예시
// 상위 클래스
class Singer {
constructor(name, songName) {
this.name = name;
this.songName = songName;
}
callArtist() {
console.log(`${this.name}의 노래 ${this.songName} 입니다.`);
}
}
// 하위 클래스
class Genre extends Singer {
constructor(name, songName, genre) {
super(name, songName); // 상위 클래스의 생성자를 호출
this.genre = genre; // 추가 속성
}
callGenre() {
console.log(`${this.name}의 노래 중 ${this.songName}의 장르는 ${this.genre} 입니다.`);
}
}
// 객체 생성
const explainGenre = new Genre("Crush", "NAPPA", "Hiphop R&B");
// 메서드 호출
explainGenre.callArtist(); //Crush의 노래 NAPPA 입니다.
explainGenre.callGenre(); //Crush의 노래 중 NAPPA의 장르는 Hiphop R&B 입니다.
4. 다형성
- Polymorphism
- 하나의 요소에 여러 개념을 넣어 놓는 것 (여러 의미로 해석 될 수 있는 것)
- 장점
- 코드의 재사용성, 확장성이 좋아짐
- 특정 하위 클래스에 대한 의존성이 낮아짐
- 오버라이딩: 상위 클래스의 메소드와 같은 이름의 메소드를 하위 클래스에서
다르게 구현하는 것 - 오버로딩: 같은 이름의 메소드가 형태( 매개변수의 개수, 타입 )에 따라 다른
기능을 하는 것- ex) 코드 예시
// 부모 클래스
class Game {
output() {
console.log("게임을 시작합니다.");
}
}
// 자식 클래스
class StarCraft extends Game {
output() {
console.log("스타크래프트를 실행합니다.");
}
}
class BattleGround extends Game {
output() {
console.log("배틀그라운드를 실행합니다.");
}
}
// 객체 생성
const mystarCraft = new StarCraft();
const mybattleGround = new BattleGround();
// 다형성: 동일한 메서드 호출, 다른 동작
mystarCraft.output(); // 출력: 스타크래프트를 실행합니다.
mybattleGround.output(); // 출력: 배틀그라운드를 실행합니다.
마지막으로 객체지향 프로그래밍과 절차지향 프로그래밍의 차이점을
표로 정리하고 마치겠습니다.
구분 | 객체지향 프로그래밍 (OOP) |
절차지향 프로그래밍 |
구조 | 클래스와 객체 중심적 | 함수와 절차 중심적 |
재사용성 | 높음 (상속과 다향성 등의 특징) |
낮음 |
속성 및 사용처 | 복잡한 시스템이나 규모가 큰 프로젝트에 적합함 |
간단한 프로그램 |
유지보수 | 업그레이드와 디버깅이 쉬움 |
유지 보수와 디버깅이 어려움 |
속도 | 느리고 설계 시간이 긴 편 | 빠름 |
부족한 내용이 있을 수 있습니다. 언제든지 코멘트 남겨주시면 감사하겠습니다.
이상입니다.
반응형
LIST
'위클리 페이퍼' 카테고리의 다른 글
Fetch API와 Axios의 비교 (2) | 2025.02.09 |
---|---|
자바스크립트에서 모듈(Module)을 사용하는 이유 (6) | 2025.02.06 |
프로미스(Promise)의 세 가지 상태 (2) | 2025.01.31 |
쿼리 / 요청 응답 (5) | 2025.01.27 |