객체 지향 프로그래밍

남성윤·2022년 7월 22일
0

Code States 학습

목록 보기
17/66

객체 지향

객체 지향 프로그래밍이란?

객체 지향 프로그래밍이랑, 하나의 모델이 되는 청사진을 만들고, 그 청사진을 바탕으로 한 객체르 만드는 프로그래밍 패턴이다.

여기서

  • 청사진을 바탕으로 한 객체   =   인스턴스 객체(인스턴스)
  • 청사진   =   클래스
라고 부른다.

Class 만들기

ES5

ES5 에서의 클래스는 함수로 정의한다.

function Car(brand, name, color) { 
  this.brand = brand;
  this.name = name;
  this.color = color;
}

Car.prototype.refuel = function() {
  //연료 공급을 구현하는 코드
}

Car.prototype.drive = function() {
  //운전을 구현하는 코드
}

ES6

ES6에서는 class 키워드를 이용하여 정의할 수 있다.

class Car {
	constructor(brand, name, color) {
      this.brand = brand;
      this.name = name;
      this.color = color;    
    }
  
  refuel() {
  }

  drive() {
  }
}

위와 같이, 클래스에 속성과 메서드를 정의하고, 인스턴스에서 이용하게 된다.

여기서 보이는 함수는, 생성자(constructor) 함수라고 부르며 인스턴스가 만들어질 때 실행되는 코드이다. 이 생성자 함수는 return 값을 만들지 않는다.

this라는 키워드는 여기에서 생성자 함수를 불러온 인스턴스 객체를 의미한다.

클래스의 인스턴스 만들기


let avante = new Car('hyundai', 'avante', 'black');
let cooper = new Car('mini', 'cooper', 'cyan');
let beetle = new Car ('volkswagen', 'beetle', 'red')

이처럼, 인스턴스를 만들 때에는 new 라는 새로운 키워드를 이용한다.

일반적인 다른 함수와 구분하기 위해 클래스는 보통 대문자로 시작하며 일반명사로 만들고, 일반적인 함수는 적절한 동사를 포함하고 소문자로 시작하는것이 좋다.

이때, 즉시 생성자 함수가 실행되며, 변수에 클래스의 설계를 가진 새로운 객체가 할당되게 된다. 이 인스턴스는 Car라는 클래스의 속성과, 메서드를 갖게 되는 것이다.

사용

위 코드들을 사용했을때,

avante.color;  //'black'
avante.drive(); //drive()실행

와 같은 방식으로 실행된다.

Object Oriented Programming (객체 지향 프로그래밍)

객체 지향 언어

객체 지향 언어는 데이터 모델의 청사진을 사용해 코드를 작성한다.
단순히 별개의 변수와 함수로 순차적으로 작동하는 것을 넘어, 데이터의 접근과 데이터의 처리 과정에 대한 모형을 만들어 내는 방식이 고안되며 데이터와 기능이 별개로 취급되지 않고, 한번에 묶여서 처리할 수 있게 되었다.

엄밀히 따지자면, Java Script는 객체 지향 언어는 아니지만, 객체 지향 패턴으로 작성할 수 있는 언어이다.

OOP

OOP는 프로그램 설계 철학으로서, 모든것은 객체로 그룹화되며 메모리상에서 반환되기 전까지 객체 내의 모든것이 유지된다.

OOP Basic Concepts

애플리케이션을 만들 때, 좋은 설계를 하기 위해서는 이 객체지향을 이해하고 응용하는 것이 중요하다.
객체지향의 네가지 기본 개념에 대해 이야기하자면

캡슐화

캡슐화는 속성과 메서드를 하나의 객체 안에 넣어 묶음으로서 속성과 데이터를 느슨하게 결합시키는것이다.
캡슐화의 개념은 은닉화의 특징도 포함하고 있는데, 이는 내부 데이터나 구현은 외부로 노출되지 않고, 동작만이 노출된다는 뜻이다.
이러한 특징을 가지고 있어 언제든 구현을 수정할 수 있다는 유리한 점을 가진다.

추상화

추상화란, 내부 구현은 복잡하지만, 노출되는 부분은 단순하게 만든다는 개념이다.
실제로 사용할때, 내부 구현에 대해서 생각하지 않도록 인터페이스를 단순화하는 것이다.
너무 많은 기능들이 노출되지 않도록 하여, 예기치 못한 사용상의 변화가 일어나지 않도록 만들 수 있다.

이는 캡슐화의 데이터 은닉의 개념과 혼동할 수 있지만, 캡슐화가 은닉에 중점이 있다면, 추상화는 사용하는 사람이 필요하지 않은 메서드는 숨기고, 단순한 이름으로 정의하는것에 중점이 있다.

상속

상속은 부모 클래스의 특징을 자식 클래스가 물려받는것이다.
부모 클래스에 있는 속성이나 메서드를 자식 클래스가 받음으로서, 동일한 속성을 여러번 작성하지 않게 한다.

다형성

다형성은 다양한 형태를 가질 수 있다는것이다.
똑같은 메서드더라도, 각기 약간씩 다른 방식으로 구현될 수 있음을 의미한다.

정리

  • 캡슐화 (Encapsulation)
  • 캡슐화는 코드가 복잡하지 않게 만들고, 재사용성을 높인다.
  • 추상화 (Abstraction)
  • 추상화는 마찬가지로 코드가 복잡하지 않게 만들고, 단순화된 사용으로 변화에 대한 영향을 줄인다.
  • 상속     (Inheritance)
  • 상속 역시 불필요한 코드를 줄여 재사용성을 높인다.
  • 다형성 (Polymorphism)
  • 다형성으로 동일한 메서드에 대해 if/else if 등을 사용하지 않고도 객체 특성에 맞게 달리 작성하는것이 가능해진다.

    결론적으로 이 모든것은 코드가 복잡하지 않게 만들고, 재사용성을 높여주는데 목적이 있다.

    프로토타입과 클래스

    JS는 프로토타입 기반 언어로, 여기서 프로토타입은 원형객체를 의미한다.

    prototype은 ‘object that provides shared properties for other objects’로, 다른 객체에 공유 프로퍼티(메서드 포함)를 제공하는 객체이다.

    모든 객체는 [[Prototype]]이라는 내부 슬롯(자바스크립트 엔진의 내부 로직)을 갖으며, 상속을 구현하는 프로토타입 객체를 가리킨다.
    하지만 [[Prototype]] 내부 슬롯에는 직접 접근이 불가하다. 이는 프로토타입 체인의 단방향을 지키기 위해서다. 만약 직접 접근가능하다면, 서로가 서로의 프로토타입이 되면서 프로토타입 체인이 무한으로 돈다. 따라서 __proto__ 프로퍼티로만 접근할 수 있다.

    인스턴스, 프로토타입의 관계
    prototype(속성): prototype 속성은 프로토타입 객체를 참조한다.

    __proto__ : 객체가 만들어지기 위해 사용된 원형인 프로토타입 객체를 참조하는 링크를 가진다.

    profile
    안녕하세요, Blog 2022.06 ~

    0개의 댓글