일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 이벤트 수식어
- flex
- 프로그래머스 데브코스
- 고양이 사진 검색기
- KDT 프로그래머스
- vue 이벤트 수신
- 프로그래머스 데브코스 프론트엔드
- 리스트 렌더링
- intersection opserver
- git 같은계정 다른 컴퓨터
- vue 지역 컴포넌트
- 다른컴퓨터에서 git사용
- 폼 입력 바인딩
- 프로그래머스 K_Digital Training
- SCSS use
- Vue
- vuex map
- Spacer
- nextjs사용법
- 리액트
- 프로그래머스 프론트엔드 데브코스
- 쌓임맥락
- vue mixin
- KDT 프로그래머스 데브코스 프론트엔드
- SCSS import
- netlify redirect
- SCSS extend
- postcss
- react next
- SCSS forward
- Today
- Total
혼자 적어보는 노트
객체지향 프로그래밍(OOP) 본문
대충은 알고 있었으나 설명이 잘 안되는 것 같아서 OOP에 대해 따로 정리를 해보려고 한다.
객체지향 프로그래밍(Object Oriented Programming)
컴퓨터 프로그래밍의 패러다임중 하나로 프로그램을 객체 단위로 나누고 객체들간의 상호작용을 통해 로직을 구성하는 것이다.
객체 지향 프로그래밍이라는 패러다임이 등장하기 전에는 순서대로 처리하는 방식인 절차지향 프로그래밍 방식을 사용했다. 하지만 프로그램의 크기가 커졌을 때 코드가 복잡해지게되어 동작보다는 데이터를 중심으로 코딩을 하는 방식으로 발전했고 데이터와 처리 방식을 하나의 모듈로 관리를 하며 조립하는 개발 방식으로 확장이 되었다.
객체지향 프로그램의 원리는 객체의 관점에서 작은 문제를 해결할 수 있는 객체들을 만들고 이 객체들을 조합하여 큰 문제를 해결하는 것이다. 객체들을 잘 만들어 둔다면 같은 코드를 반복하지 않고 조합하여 재사용 할 수 있다.
클래스와 인스턴스
클래스: 어떤 문제를 해결하기 위해 어떤 집단에 속하는 속성과 행위를 변수와 메서드로 정의한 것을 의미한다.
객체를 만들기 위한 메타 정보.
인스턴스(객체): 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터를 의미한다.
Javascript 에서의 OOP
자바스트립트는 프로토타입 기반의 언어이다.
클래스 기반 언어에서는 '상속'을 사용하지만 프로토타입 기반 언어에서는 객체를 원형으로 삼고 이를 복제하여 상속과 비슷한 효과를 얻는다. ES6에서 등장한 class또한 내부는 프로토타입으로 구성되어 있기 때문에 타 언어에서 사용되는 class와 비슷할 뿐 일치하다고 볼 수는 없다.
const array = new Array();
const object = new Object();
console.log(array.__proto__.__proto__ === object.__proto__); // true
console.log(array.hasOwnProperty(0)); // false
배열은 Array.prototype을 참조하고 있고 그 내부의 __proto__는 object.prototype을 참조하고 있다.
이렇게 연결되어있기 때문에 배열에서 object의 메서드를 사용할 수 있다.
(프로토타입 관련된 것은 따로 정리할 것이기 때문에 여기선 자세히 적지 않겠음)
위와 같은 원리로 하위 객체에 해당 메서드가 없다면 __proto__를 통해 연결된 상위객체의 메서드를 검색하는 프로토타입 체이닝으로 상속처럼 사용할 수 있다.
let animal = {
name: '',
sleep: function () {
console.log(this.name + '는 자는중..');
},
speak: function () {
console.log('...');
},
};
let cat = {
__proto__: animal,
name: '나비',
speak: function () {
console.log('야옹~');
},
};
let dog = {
__proto__: animal,
name: '콩이',
speak: function () {
console.log('멍멍!');
},
};
cat.speak(); // 야옹~
dog.speak(); // 멍멍
dog.sleep(); // 콩이는 자는 중..
OOP의 특징
1. 추상화(Abscraction)
공통적으로 가지고 있는 특징들을 모아 하나로 묶는 것.
객체지향에서는 클래스를 만드는 것 자체가 추상화라고 볼 수 있다.
class Car {
wheel = 4;
window = 4;
speed = 0;
move() {}
}
class Benz extends Car {
speed = 100;
move() {}
}
class Audi extends Car {
speed = 95;
move() {}
}
예를들어 자동차라는 추상화 집합을 만들고 바퀴, 핸들, 창문 등의 필수적인 특징을 정의해둔다.
그리고 자식 객체로 벤츠, 아우디 등을 추가시킬 때 일일이 자동차의 특징(바퀴, 핸들, 창문)을 추가하지 않고 새로 만들 부분만 추가하여 코드를 줄일 수 있다.
2. 캡슐화(Encapsulation)
목적을 가진 객체가 그 목적을 위해 필요한 변수나 메서드를 하나로 묶는 것을 의미한다.
추상화를하면 공통적인 특징들이 속성과 행위로 나누어지게 되는데 이것들을 관련있는 것 끼리 묶어놓은 것이라고 볼 수 있다. 이렇게 관련된 기능과 특성을 하나로 모아서 분류한다면 객체의 재사용성이 높아진다.
정보 은닉
캡슐화의 개념에는 정보의 은닉도 포함이 되어있다.
예를 들어, 전자 제품을 사용할 때 사용자는 제품이 제공하는 기능만 알면 되고 해당 기능이 어떻게 구현되어있는지 알 필요가 없다. 이와 같이 외부에서 접근할 필요가 없는 것들은 private으로 접근을 제한하여 외부에서는 내부의 구조를 모르게 은닉화 하고 객체가 제공하는 필드와 메서드만 이용할 수 있도록 한다면 외부에서 객체 내부를 손상시키는 일을 방지할 수 있고 모듈간의 결합도를 떨어트릴 수 있다.
class Car {
wheel = 4;
#window = 4;
move() {}
}
const car = new Car();
car.wheel = 2; // public한 필드는 수정 가능
car.window = 2; // Property 'window' does not exist on type 'Car'.ts(2339)
3. 상속(Inheritance)
상속은 부모 객체의 특징을 물려받아 부모 객체의 속성과 기능을 그대로 받아 사용할 수 있게 하는 것을 의미한다.
부모로부터 특징을 물려받게 되면 구현된 자식 객체는 동일한 내용을 다시 구현할 필요가 없기 때문에 코드의 재사용성이 향상된다.
* 하지만 코드 재사용을 목적으로만 하는 상속을 하면 안된다.
class Person {
name = '';
constructor(name) {
this.name = name;
}
getName() {
console.log('제 이름은 ' + this.name + '입니다.');
}
}
class Student extends Person {
// ...
}
const student = new Student('Jay');
// 부모 클래스인 Person의 getName()을 그대로 사용할 수 있다.
student.getName(); // 제 이름은 Jay입니다.
4. 다형성(Polymorphism)
상속을 통해 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것을 의미한다.
메서드 오버라이딩, 오버로딩을 사용하여 같은 메서드지만 다른 결과물을 나타낼 수 있다.
오버로딩: 매개변수의 개수 또는 자료형에 따라 같은 이름의 메서드를 다르게 선언하는 것(자바스크립트에서는 제공하지 않음)
오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의 하는 것
예를들어 포유류라는 부모객체를 상속받은 자식 객체 고양이와 강아지가 있을 때 두 포유류의 울음소리는 다르다.
이렇게 포유류를 상속받은 많은 자식 객체들이 있을 때 전부 다른 울음 소리를 내는 것이 다형성이라고 볼 수 있다.
인터페이스를 유지하면서 메서드명의 낭비를 줄일 수 있다.
class Cat extends Animal {
speak() {
console.log('야옹~');
}
}
class Dog extends Animal {
speak() {
console.log('멍멍!');
}
}
const cat = new Cat();
const dog = new Dog();
cat.speak(); // 야옹~
dog.speak(); // 멍멍!
OOP의 장점
1. 재사용성이 좋다.
상속을 통해 코드의 재사용률을 높일 수 있다.
2. 유지보수에 좋다
절차지향 프로그램에서는 일일이 찾아서 수정해야 하지만 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 존재하기 때문에 해당 부분만 찾아서 수정할 수 있다.
3. 대형 프로젝트에 적합하다
클래스 단위로 모듈화 시켜서 개발을 할 수 있기 때문에 여러명이 분담하여 개발하기 쉽다.
OOP의 단점
1. 처리 속도가 상대적으로 느리다
캡슐화와 격리구조 때문에 절차지향 프로그래밍과 비교하면 실행 속도가 느리다.
2. 객체가 많으면 용량이 커질 수 있다.
3. 설계 시 많은 시간과 노력이 필요하다.
Reference
https://yozm.wishket.com/magazine/detail/1396/
https://jeong-pro.tistory.com/95
'기타' 카테고리의 다른 글
ngrok으로 로컬 개발 환경 외부에 공유하기 (0) | 2022.11.10 |
---|---|
JWT에 대해 이해하기 (+ cookie, session) (0) | 2022.09.17 |
정규 표현식 공백 및 특수문자 체크 (0) | 2022.09.04 |
프로그래머스 데브코스 TIL - Day 52 (0) | 2022.05.31 |
[VSCode] 새 파일, 새 폴더 단축키 설정 (0) | 2022.05.31 |