[TIL 20] 객체지향프로그래밍

_dodo_hee·2021년 3월 8일
0

JAVASCRIPT

목록 보기
12/17
post-thumbnail
post-custom-banner

객체지향프로그래밍 OPP

사전적 의미 📚

객체지향프로그래밍은 영어로 Object oriented programming(OPP) 이다.
함수들의 집합, 관계성이 있는 객체들의 집합으로 볼 수 있다.

여기서 객체는, 메세지를 받을수도 있고, 데이터를 처리 할 수도 있고, 다른 객체에게 메세지를 전달 할 수도 있다.

객체지향프로그래밍은 유연하고 유지보수성이 높은 프로그래밍을 하고, 개발을 더 단순하고 쉽게 이해할 수 있고 복잡한 상황이나 절차들을 더 직접적으로 분석하고, 코딩 할 수 있도록 만든 프로그래밍 기법이다.

객체지향프로그래밍 용어 📌

객체는 사물 또는 개념과 같은 사전적의미.

  • Class : 객체의 특성을 정의
  • Object : Class의 인스턴스
  • instance : 객체랑 비슷하며 각각 개별적인 특성과 메소드
  • Method : 객체의 능력
  • Property : 객체의 특성

객체지향프로그래밍을 코드로 표현해보자✍️

class Person {
  //생성자
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  //메서드
  speak() {
    console.log(`${this.name}:hello!`);
  }
}

//생성할 인스턴스
const dohee = new Person("dohee", 25);
const minsoo = new Person("minsoo", 29);
const sumin = new Person("sumin", 27);

console.log(dohee.name); //dohee
console.log(dohee.age); //25;
dohee.speak(); //dohee: hello!

코드를 해석해보자면? 🧐

person 으로 객체의 특성을 정의해준다.
공통적인 속성인 person 이라는 속성은 모두에게 준다.
하지만 생성할 인스턴스는 각자의 이름과 나이가 틀리기 때문에
메소드를 생성해서 그에 맞는 속성과 메소드를 줘야한다.
인스턴스를 생성해서 호출시킨다.

객체지향프로그래밍의 특성 📌

  • 캡슐화 (Encapsulation) : 클래스는 해당 객체의 특성들만을 정의하고,
    메서드는 그 메서드가 어떻게 실행 되는지만 정의 한다.
  • 상속 (Inheritance) : 클래스는 다른 클래스로부터 특성들을 상속받을 수 있다.
  • 추상화 (Abstraction) : 복잡한 상속,메서드,객체의 속성의 결합은
    반드시 현실 세계를 시뮬레이션 할 수 있어야 한다.
  • 다형성 (Polymorphism) : 다른 클래스들이 같은 메서드나 속성으로 정의 될 수 있다.

객체 생성 방법

  • 객체 리터럴
  • 생성자
  • Object.creat()

1. 객체 리터럴

가장 기본적인 객체 생성 방법이지만, 비슷한 객체를 많이 만들어낼때 효율적이지 않은 방법이다.

const car = { country : "독일", brand : "BMW"};

2. 생성자

function Brand(country,name){
	this.country = country;
    this.name = name;
    
    this.sayCountry = function(){
    	console.log(this.country);
    };
}

const carBrand = new Brand("독일","BMW");

console.log(carBrand); //Brand("독일","BMW")
carBrand.sayCountry(); //"독일"

🖐여기서 잠깐! 짚고 넘어가야할 부분!🖐

생성자 안에서 this 뒤에 메서드를 정의하면 this.sayCountry = function()
그 생성자로 생성한 모든 인스턴스에 똑같은 메서드가 추가된다.

만약, 코딩할때 수천개의 객체를 만들 경우에 같은 함수만 수천개를 생성해야한다🤮
그럼 메모리의 손해도 발생되고 매우 비효율적이게 된다.

이런 단점을 극복하기위해 프로토타입을 사용해야한다.
프로토타입 설명은 맨밑에서.

3. Object.create()

Object.create()를 사용하면 명시적으로 프로토타입을 지정해서 객체 생성.
가장 간단하게 상속을 표현할 수 있다.

const person1 = {
  name: "dohee",
  sayHello: function () {
    console.log("Hello!" + this.name);
  }
};

const person2 = Object.create(person1);
person2.name = "minsoo";
person2.sayHello(); //Hello! minsoo

person2person1name프로퍼티와 sayhello를 상속받았다.
하지만, person2.name이 있어서 person2person2name프로퍼티 값을 사용한다.

💁‍♀️ 프로토타입 체인에서는 해당 객체와 가장 가까운 프로퍼티를 사용한다.

프로토타입 Prototype

자바스크립트는 프로토타입 상속에 기반을 둔 객체 지향언어이다.
상속이란 일반적으로 특정 객체가 다른 객체로부터 기능을 이어받는 것을 말한다.
자바스크립트는 클래스가 아닌 객체를 상속한다.

상속을 하는 이유? 중복코드를 작성하지 않아도 되서 유지 보수성이 높은 프로그램을 만들 수 있다.

프로토타입 체인

프로토타입 체인은 scope체인 같이 값을 찾을려고 계속 상위값을 찾는 개념과 비슷하다.
__proto__프로퍼티는 그 객체에게 상속 해준 부모 객체를 가르킨다.

const objA = {
  name: "dohee",
  sayHello: function () {
    console.log("Hello!" + this.name);
  }
};
const objB = {
  name: "minsoo"
};
objB.__proto__ = objA;
const objC = {};
objC.__proto__ = objB;
objC.sayHello(); // 안녕하세요 민수

__proto__를 사용하면 연결고리로 묶여있는 형태가 되어,
objC가 빈객체라서 objB에 있는 값이 있으면 멈추고 objB값을 출력하는 것이다.


프로토타입이랑, 클래스 부분이 잘 이해가 안가서 나중에 다시 더 자세히 정리해야겠다.
그래도 객체에 대해 이해하고 사용법을 이해해서 정리만 하면 된당
프로토타입 넘모 어렵...🤪

profile
무럭무럭 자라나는 도도 개발성장일기
post-custom-banner

0개의 댓글