🌈객체지향 프로그래밍은 프로그램을 명령어 또는 함수의 목록으로 보는 전통적인 명령형 프로그래밍의 절차지향적 관점에서 벗어나 여러개의 독립적인 단위, 즉 객체(object)의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임을 말한다.
🌈 객체지향 프로그래밍은 실세계의 실제 ( 사물이나 개념)을 인식하려는 철학적 사고를 프로그래밍에 접목하려는 시도에서 시작되었다. 실체는 특징이나 성질을 나타내는 속성( attribute / value )를 가지고 있고, 이를 통해 실체를 인식하거나 구별할 수 있다.
🌈 이런 방식을 프로그래밍에 접목시켜보자. 사람에게는 다양한 속성이 있으니ㅏ 우리는 사람의 ’이름’ , ‘주소’ 라는 속성만 원한다. 이처럼 다양한 속성중에서 프로그램에 필요한 속성만 간추려 내어 표현하는 것을 추상화(abstraction ) 이라 한다.
프로그래머는 이름과 주소 속성으로 표현된 객체( object )인 person을 다른 객체와 구별하여 인식할 수 있다. 이처럼 속성을 통해 여러개의 값을 하나의 단위로 구성한 복잡한 자료구조를 객체라하며 객체지향 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임이다.
‘이름’ ‘주소’ 라는 속성을 갖는 person 이라는 객체를 자바스크립트로 표현한다면 옆의 코드와같다.
프로그래머는 이름과 주소 속성으로 표현된 객체( object )인 person을 다른 객체와 구별하여 인식할 수 있다. 이처럼 속성을 통해 여러개의 값을 하나의 단위로 구성한 복잡한 자료구조를 객체라하며 객체지향 프로그래밍은 독립적인 객체의 집합으로 프로그램을 표현하려는 프로그래밍 패러다임이다.
const person ={
name : 'Lee',
address:'seoul',
}
const circle ={
radius :5,
getDiameter(){
return 2*this.radius
}
circle 이라는 객체에는 상태를 나타내는 데이터가 있고, 원의 지름을 구하는 동작이 있다. 상태과 동작을 하나의 논리적인 단위로 묶어 생각할 수 있다. 따라서 객체는 상태 데이터와 동작을 하나의 논리적인 단위로 묶은 복합적인 자료구조라 할 수 있다. 이때 객체의 상태를 프로퍼티(property) , 동작을 (method) 라 부른다.
상속에는 2가지 타입이 있는데 classical and prototypical이다. 이 말은 생성자 함수의 경우에는 프로토타입을 이용해서 상속을 구현하고 클래스의 경우에는 extends 를 이용한다.
참조 :
2- Prototypes and Prototypical Inheritance
Now we refer to the shape object as the prototype of the circle. so a prototype is essentially a parent of another object. whenever you hear the word prototype, just think parent.
상속( inheritance )는 객체지향 프로그래밍의 핵심개념으로 어떤 객체의 프로퍼티 또는 메서드를 다른 객체가 상속받아 그대로 사용할 수 있는 것을 말한다.
자바스크립트는 프로토타입( prototype) 을 기반으로 상속을 구현하여 중복을 제거한다.
아래의 코드를 보면,
function Circle (radius) {
this.radius = radius;
this.getDiameter= function(){
return 2*this.radius
}
}
const circle1 = new Circle(1)
const circle2 = new Circle(2)
console.log(circle1.getDiameter === circle2.getDiameter)
// false
Circle 생성자 함수는 인스턴스를 생성할때마다 동일한 동작을 하는 getDiameter를 중복생성하고 각 인스턴스가 개별적으로 소유한다. radius 프로퍼티는 일반적으로 인스턴스마다 다르다. getDiameter 는 모든 인스턴스가 동일한 내용의 메서드를 실행하므로 단 하나만 생성하고 모든 인스턴스가 공유하도록 하는 것이 바람직하다.