일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 자바스크립트
- 유데미
- 프로젝트캠프
- IT개발캠프
- typescript
- #프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프
- html
- 리액트
- React.js
- 해시
- 인사이드아웃
- BFS
- App Runner
- 메모리
- 개발자부트캠프
- cs #네트워크
- react
- 프로그래머스
- 스레드
- 프로세스
- ip
- Algorithm
- 알고리즘
- 네트워크
- 스나이퍼팩토리
- 타입스크립트
- react-query
- CS
- 웅진씽크빅
- javascript
- Today
- Total
Bin's Blog
오늘의 CS(프로그래밍 패러다임 - 객체지향 프로그래밍) 본문
1.1 객체지향 프로그래밍이란?
객체지향 프로그래밍은 프로그래밍의 한 방식이다. 객체들의 집합으로 프로그램의 상호 작용을 포현하며 데티어를 개체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식이다.
쉽게 설명하면, 집을 지을 때와 비교해보자.
집을 지을 때는, 미리 설계도를 그린다. 그 설계도에는 방의 크기, 창문의 위치, 문의 개수 등 여러가지 정보가 포함되어 있다. 이 설계도를 바탕으로 실제 집을 지어간다.
객체지향 프로그래밍에도 클래스라는 것이 있는데 마치 집을 지을 때 설계도와 같다. 클래스에서는 속성과 메서드가 포함되어 있다. 속성은 클래스가 가지는 특징이나 상태를 나타내고, 메서드는 클래스가 할 수 있는 행동을 나타낸다.
강아지라는 클래스가 있다면 클래스의 속성은 이름, 나이, 털, 색상 등이 있을 수 있고, 메서드는 짖기, 뛰기, 잠자기 등이 있을 수 있다.
const array = [1, 2, 3, 4, 5, 6, 7];
class List {
constructor(list) {
this.list = list;
this.max = list.reudce((max, num) => num > max ? num : max, 0);
}
getMax() {
return this.max;
}
}
const a = new List(array);
// 7
console.log(a.getMax());
1.2 객체지향 프로그래밍의 특징
- 추상화: 추상화란 복잡한 시스템으로부터 핵심적인 개념 또는 기능을 간추려내는 것을 의미한다. 예로 들면, 커피 머신을 생각해보자. 커피 머신이 내부에서 어떻게 동작하는지 우리는 알지 못해도, 버튼을 누르면 커피가 나온다는 것은 알 수 있다. 핵심적인 기능을 간단한 동작만으로도 커피 머신을 사용할 수 있다.
- 캡슐화: 객체의 속성과 메서드를 하나로 묶어서 하나의 클래스라는 캡슐에 담는다. 이러면 서로 밀접한 연관이 있어 이해하기도 쉽고, 코드의 재사용성도 높아진다.
- 상속성: 이미 만들어진 클래스의 속성과 메서드를 다른 클래스가 물려받아서 재사용하거나 추가, 확장하는 것을 말한다. 코드의 재사용성, 유지 보수성, 계층적인 관계 생성에서 중요하다.
- 다형성: 같은 이름의 메서드나 클래스가 다양한 방법으로 동작을 하는 것을 말한다. 예를 들어, 강아지와 고양이 클래스가 존재하는데 둘 다 울기라는 메서드를 가질 수 있는데, 강아지는 멍멍, 고양이는 야옹하게 만들 수 있다. 대표적으로 오버라이딩이 있다.
*오버라이딩이란?
class Monster {
attack() {
console.log("몬스터가 공격합니다!");
}
}
class FireMonster extends Monster {
attack() {
console.log("불꽃 몬스터가 불을 뿜어 공격합니다!");
}
}
class RockMonster extends Monster {
attack() {
console.log("바위 몬스터가 돌을 던져 공격합니다!");
}
}
const fireMonster = new FireMonster();
// "불꽃 몬스터가 불을 뿜어 공격합니다!"
fireMonster.attack();
const rockMonster = new RockMonster();
//"바위 몬스터가 돌을 던져 공격합니다!"
rockMonster.attack();
위에 코드처럼 몬스터라는 큰 카테고리를 만들고 공격이라는 메서드를 정의한다. 그리고 각각의 몬스터는 이 공격을 자신만의 방식대로 수정한다. 즉 부모 클래스인 몬스터의 공격 메서드를 자식 클래스에서 오버라이딩해서 사용하는 것이다. 위에 코드는 상속성과, 다형성이 다 포함되어 있다.
1.3 객체지향 프로그래밍의 설계 원칙
- 단일 책임 원칙: "하나의 클래스는 하나의 일만 해야한다"라는 원칙이다. 학교에서 선생님들이 자신의 과목만 가르치는 것과 같다.
- 개방-폐쇄 원칙: 클래스는 확장에는 열려있고 변경에는 닫혀있어야 하는 원칙이다. 쉽게 말해 아파트를 다 지었는데 아파트의 외부 구조를 바꾸는 것은 어렵다. 다만 내부 구조나 외벽의 페인트칠 정도는 바꿀 수 있다.
- 리스코프 치환 원칙: 부모 클래스를 자식 클래스로 바꿔도 문제가 없어야 한다는 것을 의미한다. 마치 모든 강아지는 개이듯이, 자식 클래스도 부모 클래스의 특징을 가지고 있어야 한다.
- 인터페이스 분리 원칙: 하나의 일반적인 인터페이스보다 구체적인 여러 개의 인터페이스를 만들어야 하는 원칙을 말한다.
예를 들어, 프린터 인터페이스가 복사, 스캔, 팩스 기능을 모두 가지고 있다고 생각해보자. 그런데 일부 프린터는 팩스 기능이 없을 수 있다. 이런 경우에는 프린터 인터페이스를 복사기, 스캐너, 팩스기 등의 더 작은 인터페이스로 분리하는 것이 좋다.
- 의존 역전 원칙: 자신보다 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 원칙을 말한다. 추상화에 의존해야 한다. 예를 들어 전구 클래스와 스위치 클래스가 존재할 때, 스위치 클래스는 전구 클래스에 직접 의존하는 것보다는 전구를 제어하는 데 필요한 인터페이스에 의존하는 것이 더 좋다. 이렇게 하면 전구의 내부 구현이 바뀌더라도 스위치 클래스는 영향을 받지 않게 된다.
'CS' 카테고리의 다른 글
오늘의 CS(네트워크 - 네트워크의 기초) (0) | 2023.05.22 |
---|---|
오늘의 CS(프로그래밍 패러다임 - 절차형 프로그래밍) (0) | 2023.05.18 |
오늘의 CS(프로그래밍 패러다임 - 선언형과 함수형 프로그래밍) (0) | 2023.05.16 |
오늘의 CS(디자인 패턴 - MVC 패턴, MVP패턴, MVVM 패턴) (0) | 2023.05.15 |
오늘의 CS(디자인 패턴 - 노출모듈 패턴) (0) | 2023.05.12 |