객체지향 프로그래밍 (Object-oriented programming)
이하 OOP
객체지향 프로그래밍은 컴퓨터 과학에서 절차적 프로그래밍에서 대두되던 단점. 어떤 구체적인 실재적인 정보를 다루지 못하고 추상적인 기능 구현만 가능하게 됐던 단점들을 해결하기 위해 등장한 패러다임이다.
자동차로 예를 들어보면, 객체지향 이전 절차적 프로그래밍에서는 시동을 걸거나 창문을 내리고 기어 변속을 하는 기능에 대한 함수는 만들 수 있었지만 그 자동차의 제조사, 모델명, 그리고 차량의 색깔같은 우리의 눈에서 실재적으로 보이는 부분들을 다룰 수 없었다.
OOP에서는 그런 부분들을 전부 다룰 수 있게 해줌과 동시에 사물에 관해 추상적으로 생각하는 것 (세상 어딘가에 있는 자동차)과 구체적으로 (내 자동차) 생각하는 것을 전부 다룰 수 있게 해주었다.
OOP의 기본 용어
Class
=> 범용적이고 추상적인 개념을 생각하면 이해가 쉽다. 포유류, 조류, 파충류 혹은 어떤 구체적인 자동차가 아닌 자동차라는 전체 카테고리를 말하는 것
Instance
=> Class에서 범용적으로 다루던 개념을 구체화 한 것. 포유류라면 반달가슴곰, 랫서팬더, 고양이 조류라면 매, 황조롱이, 참새 자동차라면 테슬라 Model S같이 범위를 줄여볼 수 있다.
Method
=> Class에서 범용적으로 다루는 개념이 갖고 있는 능력 혹은 기능이라 생각하면 된다. 반달가슴곰의 연어 사냥, 랫서팬더의 위협 능력, 고양이의 새 사냥 솜씨 매의 넓은 시야,황조롱이의 빠른 날갯짓, 참새의 말벌 잡기 테슬라 Model S의 친환경적 운행 등등
Class method
=> 클래스에 속하지만 특정 인스턴스에 묶이지는 않는 기능 혹은 능력을 나타낸다. 포유류의 전체적인 특성 뇌에서 체온과 혈액 순환을 조절한다라는 특성, 조류의 전체적인 특성 타조같은 예외를 제외하면 날개를 이용해 날아다닐 수 있다라는 특성, 자동차에서는 시동을 건다 브레이크를 밟는다 같이 클래스에서 범용적으로 갖고 있는 기능으로 생각하면 된다.
Constructor
=> 생성자라 불린다. 생성자는 객체 인스턴스를 초기화 한다.
OOP는 클래스를 계층적으로 나누기도 한다.
Superclass
=> 기존에 잡았던 Class의 카테고리보다 상위 카테고리를 의미한다. 포유류, 조류를 포함한 동물, 생물은 또 동물의 superclass이다.
자동차의 superclass는 운송수단인 것처럼
Subclass
=> subclass는 기존에 잡았던 Class의 카테고리보다 하위 카테고리를 나타낸다. 포유류 조류는 동물의 subclass이고, 자동차는 운송수단의 subclass이다.
Class와 Instance 생성
class Car {
constructor(){
}
}
포인트는 class로 만들어줄 객체의 이름 앞 글자는 꼭 대문자로 해줘야 한다.
const carA = new Car();
const carB = new Car();
carA instanceof Car // true;
carA instanceof Life // false;
인스턴스를 만들 때는 new 키워드를 사용해준다. instanceof를 사용하면 내가 만든 class의 인스턴스의 여부를 확인할 수 있다.
class Car {
constructor(make, model) {
this.make = make;
this.model = model;
this.userGears = ["P", "N", "R", "D"];
this.userGear = this.userGears[0];
}
shift(gear) {
if (this.userGears.indexOf(gear) < 0)
throw new Error(`Invalid gear: ${gear}`);
this.userGear = gear;
}
}
여기서 쓰인 this 키워드는 메서드를 호출한 인스턴스를 가리키는 목적으로 쓰였다. 즉 일종의 placeholder로 사용된 것이다. 메서드를 호출할 때 this가 가리키는 것이 무엇인지 알 수 있게 된다.
const carA = new Car("Kia", "Morning");
const carB = new Car("Tesla", "Model S");
carA.shift("D");
carB.shift("R");
인스턴스를 사용한 위의 코드를 보면, carA.shift('D')를 호출하면 this는 carA에 묶이고, carB.shift('R')을 호출하면 this는 carB에 묶이게 된다. 즉 carA는 기아의 모닝이고, 현재 주행중이라는 것이고 carB는 테슬라의 모델 S이며, 후진중이라는 것을 나타내는 것이다.
**Class는 함수이다.
ES6에서 class 키워드가 도입되기 전에는 함수 형태로 만들었었다. ES6가 도입되면서 변경이 된 것이다.
function Car(make, model) {
this.make = make;
this.model = model;
this.userGears = ["P", "N", "R", "D"];
this.userGear = this.userGears[0];
}
Class의 개념이 아직 확실하지 않아 다시 정리하고 있는데, 정리를 해보니 더욱 명확하게 이해가 된다.
다음 날에는 Class 개념의 디테일한 부분들을 더욱 깊게 파고들어 이해를 해야겠다.
'개발 R.I.P.' 카테고리의 다른 글
7.26 Dev.Feedback ( 검색 알고리즘 선형검색, 이진검색) (0) | 2021.07.26 |
---|---|
7.22 Dev.Feedback (객체지향 프로그래밍 #2) (0) | 2021.07.22 |
7.17 Dev.Feedback (API, POSTMAN) (0) | 2021.07.17 |
7.16 Dev.Feedback ( 비동기적 프로그래밍 # B Fetch, Async) (0) | 2021.07.16 |
7.12 Dev.Feedback (비동기적 프로그래밍 #A Callback, Promise) (0) | 2021.07.12 |