객체 지향 프로그래밍

정진우·2022년 6월 6일
0

OOP (Object Oriented Programming)

객체 지향 프로그래밍(OOP)은 문제를 여러 개의 객체 단위로 나눠 작업하는 방식을 말한다. 객체 지향 프로그래밍의 가장 큰 특징은 클래스를 이용해 연관 있는 처리 부분(함수)과 데이터 부분(변수)를 하나로 묶어 객체(인스턴스)를 생성해 사용하는 점이다. 프로젝트를 독립적인 객체 단위로 분리해서 작업할 수 있기 때문에 여러 개발자와 협업해 규모가 큰 프로젝트를 진행할 수 있으며, 유지 보수 측면도 뛰어나다는 장점이 있다.

📌 객체지향 핵심 개념

🧩 캡슐화

속성의 행위들을 관련 있는 것끼리 묶는 것, 중요한 것은 외부에서 접근이 필요한 부분을 제외하고 내부로 숨기는 것이다. 알약을 먹을 때 중요한 것은 약의 성분이 인체에 미치는 영향이지 약의 맛이나 식감이 아니기 때문에 캡슐 속으로 숨기는 것과 마찬가지이다. 외부로부터 세부적인 내용을 숨기는 것을 정보 은닉(information hiding)이라고 한다.

  • 데이터와 코드의 형태를 외부로부터 알 수 없게하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 방법
  • 캡슐화의 중요한 목적은 변수를 private로 선언하여 데이터를 보호하고, 보호된 변수는 getter나 setter등의 메서드를 통해서만 간접적으로 접근을 허용하는것
  • 캡슐화를 하면 불필요한 정보를 감출 수 있어 정보은닉을 할 수 있다는 특징이 있다.

🧩 추상화

추상화란 특정 대상을 관찰하여 핵심적이고 특징적인 공통점들을 뽑아내는 과정입니다.

추상화의 핵심적인 특징은 대상에 대해 현재 내가 구현하고자 하는 프로그램에서의 관심사 라고 할 수 있다.

추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말한다.

다시 말해 실제로 존재하는 객체들을 프로그램으로 만들기 위해 공통 특성을 파악해 필요없는 특성을 제거하는 과정을 가르킨다.

객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징을들이 있어야 한다고 정의하는 추상화된 개념이다.

추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법

🧩 상속

대상이 되는 클래스의 모든 특징들을 물려 받는 것을 말한다. A가 B를 상속받게 되면 A의 속성과 행위들을 모두 물려받게 된다.

기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가 할 수 있는것.

상속이 필요한 이유는 코드의 중복을 없애기 위해 코드의 중복이 많아지면 개발 단계와 유지 보수에서 많은 어려움이 생긴다.

상속 관계를 맺으면 자식 객체를 생성할 때 부모 클래스의 속성들을 자동으로 물려받기 때문에 자식 클래스에서 또 정의할 필요가 없다.

🧩 다형성

객체지향에서 다형성이란 하나의 속성이나 행위가 상황에 따라 다른의미로 해석될 수 있는 특징을 말합니다.

상속과 연관있는 개념이다 하나의 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말한다. 한 부모의 밑에서 태어난 자식들이 조금씩 다르다는 의미.

오버로드(Overload) 또는 오버라이드(Override)가 다형성의 대표적인 예시

이것을 구현하는걸 오버로딩(Overloading)과 오버라이딩(Overriding)이라고 한다.

  • 오버라이딩 - 하위 클래스(자식)가 상위 클래스(부모) 에서 만들어진 메서드를 자신의 입맛대로 다시 재창조해서 사용하는것
  • 오버로딩 - 하나의 클래스 안에서 같은 이름의 메서드를

다형성은 유용하며 코드 재사용성을 늘려주어 유지보수가 용이하게 해준다.

❓ 📌 인스턴스와 객체의 차이점

🧩 인스턴스

비슷한 성질을 가진 여러 개의 객체를 만들기 위해, 일종의 설계도라고 할 수 있는 생성자 함수(Constructor)를 만들어 찍어내듯 사용하는데 이렇게 생성된 객체를 인스턴스라고 한다. 클래스의 속성과 메서드를 담고 있는 객체이다. 클래스로 만든 객체가 인스턴스라고 생각하면 쉽다.

//  new 연산자를 사용하여 Object를 생성
let obj = new Object();

// 변수 obj에 오브젝트를 생성한 것을 할당
// 이렇게 변수에 할당,반환된 오브젝트가 인스턴스이다.

console.log(obj);
// Object {}

// 객체 리터럴 방식을 사용하여 오브젝트 생성
let obj2 = {};
// 변수 obj2 가 인스턴스

console.log(obj2);
// Object {}

변수에 할당,반환된 오브젝트가 인스턴스라고 표기하고 있는데 인스턴스를 생성하는 이유는 무엇인지 다음코드를 보자

// 생성자 함수를 사용
function OriginObject() {
  this.name = "포도";
}

var obj = new OriginObject();
obj.name = "사과";
console.log(obj.name); // 사과

obj2 = new OriginObject();
console.log(obj2.name); // 포도 

원본 오브젝트에 name 프로퍼티가 있다고 한다면, 위의 코드처럼 name 프로퍼티에 “포도” 란 값을 설정하면 모든 인스턴스는 같은 값을 갖게 된다. 하지만 생성한 인스턴스에 name 프로퍼티에 값을 다시 설정하면 인스턴스마다 name 프로퍼티는 다른 값들을 가질 수 있다. 그렇다고 인스턴스의 name 프로퍼티를 바꿨다고 해서 원본 오브젝트의 값이 바뀌지는 않습니다. 위의 코드의 obj1 인스턴스에서 name 프로퍼티를 다시 설정했다고 하여 obj2 인스턴스의 name 프로퍼티가 “사과”로 출력되지 않고 obj2.name을 바꾸지 않았으므로 원본 오브젝트의 name 프로퍼티를 그대로 가지게 되는 것입니다. 인스턴스마다 다른 값을 유지 제어하기 위해서 인스턴스를 생성하는 것

쉽게 설명하면 복사기로 복사한 것과 같다. 복사한 레포트에 메모를 하더라도 원본은 그대로 유지되기 때문에 다시 복사를 했을 때 원본 그래도 내용이 복사된다. 원본이 오브젝트 복사한 레포트가 인스턴스인 것이다.

👀  배울 때 생각했던 건 클래스로 여러 객체 여러 인스턴스를 만들 수 있다. 객체 = 인스턴스로 알고 있는데 어떻게 다른지 헷갈립니다… 일단 정리하면서 이해도가 조금은 올라갔습니다. 더 보겠습니다.

📌 프로퍼티와 메소드의 차이

자바스크립트의 객체는 키(key)와 값(value)으로 구성된 프로퍼티들의 집합이다.
프로퍼티의 값으로 자바스크립트에서 사용할 수 있는 모든 값을 사용할 수 있다. 자바스크립트의 함수는 일급 객체이므로 값으로 취급할 수 있다. 따라서 프로퍼티 값으로 함수를 사용할 수도 있으며 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라 부른다.

🧩 프로퍼티

let person = {
  name: "John",
  age: 30,
};

객체는 프로퍼티의 집합이라고 할 수 있다.

  • 프로퍼티 : name : John, age : 30
  • 프로퍼티 키 : name, age
  • 프로퍼티 값 : John, 30

프로퍼티는 프로퍼티 키(이름)와 프로퍼티 값으로 구성된다. 프로퍼티는 프로퍼티 키로 유일하게 식별할 수 있다. 즉, 프로퍼티 키는 프로퍼티를 식별하기 위한 식별자(identifier)다. 프로퍼티 키의 명명 규칙과 프로퍼티 값으로 사용할 수 있는 값은 아래와 같다.

  • 프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 symbol 값
  • 프로퍼티 값 : 모든 값

🧩 메소드

  • 프로퍼티 값이 함수일 경우, 일반 함수와 구분하기 위해 메소드라 부른다. 메소드는 객체 속성으로 저장된 함수이다.
  • 객체의 프로퍼티 값이 함수인 프로퍼티
let user = {
  name: "John",
  age: 30,
};

user.sayHi = () => console.log("Hello!");

user.sayHi();

이렇게 객체 프로퍼티에 할당된 함수를 메서드(method) 라고 부릅니다. 위 예시에선 user에 할당된 sayHi가 메서드이다. property속성 이라면 method행동 이다

profile
내가 바뀌지 않으면 아무것도 바뀌지 않는다 🔥🔥🔥

0개의 댓글