객체 지향 프로그래밍이란?
객체 지향 프로그래밍(OOP, Object-oriented programming)은 인간이 사물을 파악하는 방식과 비슷하게 개발하는 패러다임을 말한다.
붕어빵틀(클래스)과 붕어빵(인스턴스)을 만드는 방식으로 코딩하여 가독성있고 깔꼼하게 프로그래밍을 하는 것이다.
이 객체 지향 프로그래밍은 데이터와 기능을 한곳에 묶어서 처리한다. 속성과 메서드가 "객체"라는 개념에 묶여서 구현이된다.
++ 참고 ++ 객체지향프로그래밍의 '객체'는 그냥 일반 {key: value}객체가 아니라 class로 찍어내는 instance객체를 말한다.
++ 참고 ++ 엄격한 의미에선 '클래스지향프로그래밍'이라고 하는 것이 더 맞지만, 큰 의미에서 그냥 객체지향프로그래밍이라고 부른다.
객체 지향 프로그래밍 장점
- 프로젝트를 독립적인 클래스단위로 분리하기가 편하다.
- 분리가 편하기 때문에 협업이 편하다.
- 분리가 편하기 때문에 규모가 커도 체계적으로 진행할 수 있다.
- 유지보수 측면에서도 뛰어나다.
현대의 언어들은 대부분 객체 지향의 특징을 갖고 있다고 한다.(Java,C++,C#등)
객체 지향 프로그래밍 ↔️ 절차 지향 프로그래밍 비교
그러니까 이제까지 내가 해오던건 다 절차 지향 프로그래밍이었던 것이다... 오호..
구분 | 객체 지향 프로그래밍 | 절차 지향 프로그래밍 |
처리 방식 | 문제를 여러개의 객체(클래스) 단위로 나누어 처리하는 방식 | 문제를 여러개의 함수로 나누어 순차적으로 호출하여 처리하는 방식 |
장점 | -최근 방식 -함수를 추적하지 않아도 클래스 정의만 보면 관련된 모든걸 확인할 수 있음 -가독성이 좋음 -클래스에 모든 정의가 모여있으므로 원리 파악도 더 쉬움 -대규모 프로젝트에서 클래스만 잘 짜놓으면 아주 효율적으로 개발 가능 |
-그냥 함수만 배워도 쓸 수 있음 -간단하게 빠르게 쓰기엔 더 좋음 -메모리에 더 좋다 |
단점 | -학습 난이도가 높음 -개발자가 깔끔하게 잘 짜놓아야 잘 씀 |
-오래된 방식 -일일이 함수를 추적해서 따라다녀야함 -가독성이 떨어짐 -협업시 코드의 원리를 파악하기 힘듦. |
객체지향프로그래밍의 철학
객체지향프로그래밍은 사람이 세계를 보고 이해하는 방법을 흉내낸 방법론이다.
우리가 길을 가면
"버스가 도로위를 달린다" 이렇게 단순한 하나하나의 부분들로 이해하지
"원료가 모터를 거쳐 바퀴를 돌리고 핸들이 여기와 연결되서 방향을 바꾸도록 이러쿵저러쿵해서 완성된 것(버스)이
중장비로 비포장 도로를 평평하게 갈고닦아 이러쿵저러쿵 페인트로 선을그어 표시한 것(도로)
위를 달리는 군" 이라고 인식하지 않는다.
'버스'와 '도로'로 상황을 파악하는 것이 객체지향에서 클래스와 인스턴스로 프로그램을 파악하는 객체지향 프로그래밍 방법이며,
만들어진 절차와 재료등을 풀어서 따라가면서 해석하는 방법은 함수를 쫓아가는 절차 지향 프로그래밍 방법이다.
객체 지향 프로그램의 특징
- Encapsulation(캡슐화)
- Inheritance(상속)
- Abstraction(추상화)
- Polumorphism(다형성)
객체 지향 프로그램의 특징 1️⃣ : 캡슐화 Encapsulation - 코드가 복잡하지 않게, 재사용성 UP
캡슐화라는 말이 좀 어렵게 느껴지는데, 아래와 같은 특징들을 말한다.
- 데이터와 기능을 하나의 단위로 묶는 것
- 은닉(hiding): 구현은 숨기고, 동작은 노출시킴
- 느슨한 결합(Loose Coupling)에 유리: 언제든 구현을 수정할 수 있음
"은닉화"는 내부 데이터나 내부 구현이 외부로 노출되지 않도록 만든 것을 말한다. 디테일한 구현과 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시킨다.
자바스크립트에 은닉화는 사실 closure함수나 새롭게 나온 #문법을 이용해서 할 수는 있으나, 그닥 쓰지는 않는다고 한다.
"느슨한 결합"은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 코드를 모아 결합하는 것을 의미한다. 강한 결합의 반대말로 아래와 같은 차이가 있다.
느슨한 결합(Loose Coupling) | 강한 결합(Tight Coupling) |
다른 클래스를 직접적으로 사용하는 클래스의 의존성을 줄이는 것 | 클래스와 객체가 서로 의존하고 있는것 |
권장⭕️ | 권장❌ - 재사용성이 떨어진다. 객체가 변경될 시 클래스가 전체적으로 수정되어야 할 위험이 있다. |
객체 지향 프로그램의 특징 2️⃣ : 추상화 Abstraction - 코드가 복잡하지 않게, 단순화된 사용
"추상화"는 복잡한걸 단순하게 만든다는 뜻이다.
아래의 그림에서 피카소는 복잡한 소를 단순하게, 추상화 하여 표현했다.
추상화와 캡슐화가 종종 헷갈리는데, 캡슐화가 코드나 데이터의 은닉에 포커스가 맞춰져 있다면, 추상화는 클래스를 사용하는 사람이 필요하지 않은 메서드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것에 포커스가 맞춰져 있다.
그니까,
내가 어떤 프로젝트를 할때에 처음 설계자로써, 클래스 프로토타입 안에 메서드, 속성을 짜놓는 일이 캡슐화시키는 일이고,
내가 프로젝트를 공유받는 개발자로서 짜 놓은 클래스의 메서드가 어떤 로직으로 짜져 있는지 파악하지 않아도 클래스.메소드()로 간단하게 호출되는 것이 추상화된 인터페이스를 사용하는 것이다. (이미 설계자가 메소드를 추상화해서 클래스에 캡슐화해놓은 것이기 때문)
객체 지향 프로그램의 특징 3️⃣: 상속 Inheritance - 불필요한 반복코드 없애고, 재사용성 UP
상속은 부모 클래스의 특징을 자식 클래스가 물려받는 것을 말한다. 더 정확히 말하자면 '기본 클래스'와 '파생 클래스'로 볼 수 있다.
- 기본 클래스(base class) = 부모클래스 = 상위 클래스
- 파생 클래스(derived class) = 자식클래스 = 하위 클래스
위의 그림에선 Animal이라는 기본클래스에서 파생된 Dog이라는 파생클래스가 있다면, 이 파생클래스는 기본클래스의 eat(),sleep()메서드를 기본으로 참조할 수 있고, 여기에 bark()라는 자기만의 특화된 메서드를 갖게 된다.
객체 지향 프로그램의 특징 4️⃣: 다형성 Polymorphism - if조건문 없이도 객체에 따라 달리 작성
'poly(많은)' + 'morph(형태)'를 합친말로, 다양한 형태를 가질 수 있다는 말이 된다. 같은 메서드이지만, 파생클래스의 종류에 따라, 만들어진 인스턴스의 종류에따라 다양한 형태로 변형될 수 있음을 가르킨다.
다형성이 존재하지 않았다면 각각의 cat일 경우, dog일 경우를 animal 기본클래스에 전부 if문으로 연결해줘야 했겠지만, 클래스가 다형성이 인정이 되므로, 각각의 인스턴스에서 변형해서 사용할 수 있다.
다형성을 간단히 말하자면 부모의 메서드를 자식이 받아서 다양하게 활용될 수 있다.
부모 클래스의 메서드를 자식 클래스에서 바꿀 수도 있다!
class Grub {
constructor(){
this.age = 0;
this.color = 'pink';
this.food = 'jelly';
}
eat(){
return 'Mmmmmmmmm jelly'
//📌주목
}
}
class Bee extends Grub{
constructor(food){
super(food);
this.age = 5;
this.color = 'yellow';
this.job = 'Keep on growing'
}
eat(){
return 'Mmmmmmmmm great'
//📌주목
}
}
const bee = new Bee()
bee.eat() //'Mmmmmmmmm great'//📌주목
이렇게 자식이 부모를 상속받지만 다양한 모습으로 상속받은 것을 바꿀 수 있는것을 '다형성'이라고 한다.
위 글은 코드스테이츠 프론트엔드 부트캠프 참여중, 강의 내용을 참고 + 추가 하여 작성한 글입니다. :)
관련글
'개념 > javaScript' 카테고리의 다른 글
[javaScript] 정규 표현식 (0) | 2022.07.24 |
---|---|
[javaScript] 프로토타입 (0) | 2022.07.22 |
[javaScript] 클래스와 인스턴스 (0) | 2022.07.22 |
[javaScript]내장 고차 함수 filter,map,reduce (0) | 2022.07.21 |
[javaScript]객체 메서드 정리 & 객체의 반복문과 복사 (0) | 2022.07.20 |