객체 지향 프로그래밍(OOP)

손연주·2021년 6월 15일
0

OOP(Object Oriented Programming)

객체 지향 프로그래밍

프로그램 설계방법론이자 개념의 일종으로 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 속성(데이터)'의 묶음으로 봐야 한다.

그래서 OOP는 왜 생겼을까?

컴퓨터가 발명되고 컴퓨터를 컨트롤 하기위해 컴퓨터가 이해할 수 있는 언어가 개발되었다. 그 언어를 사용해 컴퓨터에게 명령을 내리는데 컴퓨터는 기본적으로 명령이 내려진 순서대로 동작을 한다. 따라서 초기의 프로그래밍은 모두 절차 지향 프로그래밍이었다. 하지만 컴퓨터에게 명령을 내리는 주체는 사람이기때문에 사용자가 편리함을 추구하면서 나온 이론이 객체지향프로그래밍이다. 각 기능들과 기능에 필요한 데이터들을 따로 모아 객체로 나누어 필요한 순간에 필요한 기능만 가져와 프로그래밍을 하기 시작한 것이다.
Low Coupling, High Cohesion 의존성을 줄이고, 응집도를 높이자

용어

  • 클래스(class) : 객체를 생성하는 데 사용되는 템플릿, 프로토타입 또는 하나의 모델이 되는 blueprint
  • 인스턴스(instance) : 객체를 나타내는 클래스의 복사본

청사진을 바탕으로 한 객체는 인스턴스 객체(instance object)이다.
이미 자바스크립트에는 "객체"라는 개념이 객체 지향 프로그래밍과 무관하게 이미 존재한다. 따라서 여기서는 용어를 잘 구분하는 것이 중요하다. 객체(Object)는 소프트웨어 세계에 구현할 대상이고, 이를 구현하기 위한 설계도가 클래스(Class)이며, 이 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스(Instance)이다. 객체를 설명할 때 자주 언급되는 자동차를 예로 보면, 자동차는 차체, 바퀴, 엔진, 창문, 좌석, 핸들 등등 수만가지의 크고 작은 부품들(속성)로 만들어진다. 클래스는 attribute와 method로 이루어져있다. 그리고 자동차를 이용하여 우리는 어딘가로 이동할 수 있다.(자동차의 기능) 하지만 우리는 한 가지 자동차만 가지고 있지는 않는다. 각 나라마다 자동차를 생산하는 회사가 여러개 있고 각 회사에서 생산하는 여러가지 다른 종류의 자동차도 있다. 이 특징이 객체지향프로그래밍의 주요한 특징이 된다. 자동차를 만들기 위해서는 설계도가 필요하다. 자동차에는 여러종류가 있다. 승용차, 승합차, 경차, 버스, 캠핑카 등 각자의 목적에 맞는 유형이 있다. 그렇기 때문에 목적에 맞는 설계도를 만들어야 해당 자동차를 만들 수 있다.

객체(Object)는 현실의 대상(Object)과 비슷하여, 상태나 행동 등을 가지지만, 소프트웨어 관점에서는 그저 콘셉(concept), 즉 사유의 결과일 뿐이다. 소프트웨어에서 객체를 구현하기 위해서는 콘셉 이상으로 많은 것들을 사고하여 구현해야 하므로, 이를 위한 설계도로 클래스를 작성한다. 설계도를 바탕으로 객체를 소프트웨어에 실체화 하면 그것이 인스턴스(Instance)가 되고, 이 과정을 인스턴스화(instantiation)라고 한다. 실체화된 인스턴스는 메모리에 할당된다.
출처: https://alfredjava.wordpress.com/2008/07/08/class-vs-object-vs-instance/

클래스 작성

ES6에서는 class라는 키워드를 이용해서 정의할 수 있다

class Car {
  constructor(brand, name, color) {
    //인스턴스가 만들어질 때 실행되는 코드
	this.brand = brand;
    this.name = name;
    this.color = color;
  }
  drive() {
    console.log(`연주가 운전을 합니다`)
  }
}

이 클래스는 설계도이다. 실제로 자동차를 구현해야 자동차를 탈 수 있다.
인스턴스가 바로 이 클래스(설계도)를 통해 구현된 객체를 말한다.

인스턴스 작성

const yeonCar = new Car("maserati", "ghibli", "black")

yeonCar.drive()

Car클래스를 통해 yeonCar를 만들었다. 이 차는 마세라티라는 브랜드와 기블리라는 이름 그리고 검은색이라는 색상을 가지고 있다. 생성자의 파라미터로 "maserati", "ghibli", "black"이 들어가 yeonCar의 속성이 된다. 그리고 내장되어있는 drive란 기능을 실행시켜 운전을 할 수 있다.

객체 지향 프로그래밍의 주요 컨셉

  • Encapsulation (캡슐화)
  • Abstraction (추상화)
  • Inheritance (상속)
  • Polymorphism (다형성)

1. 캡슐화

  • 데이터와 기능을 하나의 단위로 묶는다(lossely coupled)

하나의 객체를 위해 속성과 메소드 들이 만난 것 -> 은닉화라는 특성으로 이어진다.
실제 객체의 모습의 추상화를 위해 필요한 데이터(속성)와 기능(메소드)을 모았다.
코드, 데이터의 은닉화: class를 위한 속성, 메소드를 모아놨으니까 그 속성은 해당 class로만 변경 가능하게 하는 것이다. 해당 인스턴스의 속성이 메소드를 통해서만 변해야 할 때 다른 인스턴스 메소드를 사용해도 이전에 만들었던 인스턴스가 변하지 않는다는 확신이 생긴다. -> 예측가능한 코딩 가능
디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메소드)만 노출시켜야 한다
다른 객체나 메소드에서 이 클래스의 메소드를 활용하지 않으면 내부에 접근 불가
=>함부로 외부 로직이 해당 객체의 로직을 건드릴 수 없게한다.

2. 추상화

  • 내부 구현은 아주 복잡한데, 실제로 노출되는 부분은 단순하게 만드는 것이다

따라서 내부 로직을 알지 않아도 외부만 보고 짐작을 할 수 있다. 예를 들어 전화라는 객체가 있다면, 그 안에는 스피커와 마이크가 존재하고, 서킷 보드 등이 존재하는 등 내부 구현이 되어 있을 것이다. 하지만 우리는 전화기만 보고 안에 뭐가 들어있는지 대충 짐작할 수 있을 것이다. 필요하지 않은 메소드 등을 노출시키지 않고, 단순한 이름으로 정의하는 것이다.

3. 상속

부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것이다.

부모 클래스 => 자식 클래스 (부모 클래스의 속성과 메소드를 자식 클래스가 물려받아 활용하는 것)

부모 클래스 : 사람
자식 클래스 : 학생

학생의 본질은 결국 사람이므로, 상속을 이용하여 학생 클래스는 사람 클래스를 상속받을 수 있다. 학생은 추가적으로 학습 내용, 공부하다와 같은 속성/메소드를 추가할 수 있다.

4. 다형성

profile
할 수 있다는 생각이 정말 나를 할 수 있게 만들어준다.

2개의 댓글

comment-user-thumbnail
2021년 6월 15일

다형성 없어서 엇덕혜..

1개의 답글