[OOP] 2️⃣ | Object-Oriented Programming

WONNY_LOG·2023년 4월 17일
0

객체지향 프로그래밍 ?

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다.

객체?물리적으로 존재하거나(자동차, 책, 사람), 추상적인 것(회사, 날짜) 중에서 자신의 속성과 동작을 가지는 모든 것을 말한다.

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F410a649b-b75d-453a-8e68-334ea886ba4b%2Fimage.png

  • 실제 세계에 기반한 모델을 만들기 위해 추상화를 사용하는 프로그래밍 패러다임
  • 관계성있는 객체들의 집합이라는 관점의 소프트웨어 디자인
  • 각 객체는 별도의 역할이나 책임을 갖는 작은 독립적인 기계
  • 소프트웨어 개발에 있어 쉬운 유지보수와 가독성을 높힘

강한 응집력과 약한 결합력OOP의 경우 하나의 문제를 해결하기위해 여러 데이터를 모아둔 클래스를 활용하는 것을 지향하고(강한 응집력), 클래스 간을 독립적으로 디자인 한다.(약한 결합력)

 1. 연관성있는 코드들 끼리 `function`, `method`와 같은 함수에 담는다.
 2. 함수가 많아지면 새로운 객체를 생성하여 연관성 있는 함수끼리 한 객체에 담는다.
 3. 객체를 호출하여 사용시 해당 객체에 들어있는 함수를 각각 분리하여 사용한다.

OOP의 기본 구성요소 ?

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F6f9b071a-9086-4576-9995-c088b2d65a05%2Fimage.png

클래스(Class)

  • 상태를 정의하는 필드(fields)와 동작을 정의하는 메서드(method)같은 종류의 집단(문제 해결을 위한)에 속하는 속성과 행위를 정의한 것 (추상적인 주체)본인 이외의 다른클래스, 외부 요소와 독립적으로 디자인되어야 한다특성과 행위들을 정의한 객체가 클래스가 된다인스턴스들이 갖는 변수들과 인스턴스들이 사용할 메서드를 갖는다

객체(Object)

  • 클래스의 인스턴스이다 (클래스로부터 실체화 된 것)class에서 정의한 행위를 수행 할 수 있다class의 속성을 가지고 있음과 동시에 각각 자신 고유의 속성을 가지고 있다
  ✨ **클래스** = **개**(dog)
        &
     **객체** = 우리집 강아지 **하루**, 옆집 강아지 **도도**

메소드(Method)

  • 객체의 속성을 조작하는데 사용됨객체가 데이터(메세지)를 받아 작동할(행위) 기능을 구체적인으로 정의한 것이다객체간의 통신은 메세지로 이루어짐

속성(Property)

  • 인스턴스가 사용될 때 필요한 각종 값들 (속성 = 인스턴스 내에 정의된 것)한 클래스 내에 속한 객체들이 가지고 있는 데이터 값들을 단위별로 정의한 것이다객체의 성질, 분류, 식별, 수량, 현재 상태 등에 대한 표현 값이다

인스턴스와 객체

같다고 생각 할 수 있지만 정확히 하자면 다른개념이다.객체: 소프트웨어 세계에 구현할 대상 (설계도)인스턴스: 소프트웨어 세계에 구현된 실체 (설계도를 바탕으로 구현한 구현체)➡️ 클래스타입의 객체➡️ 클래스안에 객체를 생성해주는 것

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fd58d8e01-f59b-4a3b-8e91-c35e80093233%2Fimage.png

✔️ 몬스터가 가지고 있는 특성(속성, 행위) 들을 나열해 보자

moster 가 가지고 있는 속성
=> 체력(healthPoint), 레벨(level), 서식지(habitat)
moster 가 가지고 있는 행위
=> 레벨을 1단계 올릴 수 있는 메소드(levelUp)

JavaScript 코드 예제

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F160089c2-92b5-4800-95e2-2fe11146449c%2Fimage.png

클래스 다이어그램

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F8327c6eb-28f8-40be-8576-fe6719d13d5d%2Fimage.png

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fb021ce4b-7430-494e-9e69-c7a42c7151c8%2Fimage.png


OOP의 특징 ?

추상화(Abstraction)

  • 현실 세계에서 특정한 대상을 관찰하여 핵심적이고 특징적인 공통점들을 뽑아내는 과정(구체화 된 건 아니지만 딱봐도 무엇을 나타내고자 하는지 알수 있는 것)이러한 공통적인 특징들은 크게 속성(attribute)와 행위(behavior)로 나눈다

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F9a210bfc-04a5-4b6f-b971-84c4cabd8a89%2Fimage.png

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fb4d830a4-a660-4368-8cf2-51c8bc120880%2Fimage.png

캡슐화(Encapsulation) _ 정보 은닉(data hiding)

  • (추상화에서 언급한)속성과 행위를 관련있는 것들끼리 하나의 클래스로 묶어놓은 것사용자가 굳이 알 필요가 없는 정보를 은닉함으로 최소한의 정보를 가지고 사용자가 프로그램을 사용할 수 있게한다(다른객체에게 자신의 정보는 숨기고 자신의 연산만 통하여 접근을 허용한다)외부에서 접근이 필요한 부분은 제외하고 전부 내부로 숨김(사용자가 필요한 정보만 가지고 프로그래밍 할 수 있게함 => 정보 은닉)
❗️Javascript에서는 키워드를 제공하지 않는다.
 때문에 외부에서 접근이 제한된 데이터에 접근하려고 할 때
 외부에서 접근할 수 있는 메서드를 제공하여 객체의 데이터에 접근하는 방식을 구현하여 사용한다.
   ➡️ 접근제한자(access modifier)라는 문법 지원
     - public : 클래스 외부에서 제한 없이 접근 가능 (모든 접근 허용)
     - private : 자기 클래스 내부의 메서드만 접근 가능
     - protected : 자기 클래스, 상속한 하위 클래스에서만 접근 가능

 ➡️ JS.ver
     - public
     - private -> #private(클로저)
     - protected -> _protected

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fd7be728f-e6bb-4864-9b23-f3243fec8b87%2Fimage.png

알약을 먹을 때 약의 성분이 인체에 미치는 영향이 중요하지, 맛이나 식감은 중요하지않기 때문에 캡슐안으로 숨기는 것과 같다

정보 은닉(data hiding)

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F2eca1eb2-50d3-4d6d-b9ac-71c09ecbad2e%2Fimage.png

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fc9b0e1ed-e3e5-4a15-949d-231d08b643fa%2Fimage.png

let fruitName = name; 로직을 통해 class안에 선언은 되어있으나 정보 은닉화 시켜줌

//전체로직으로 다시 이해하기

var Dog = function(name){

// private
var name = name;

// public
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
} } };

var haru = new Dog('Haru');
console.log(haru.name); // undefined

console.log(haru.getName()); // haru

haru.setName('haruru');
console.log(haru.getName()); // haruru

상속(Inheritance) = 재사용 + 확장

  • 객체지향의 핵심 기능 중에 하나로 대상이 되는 클래스의 모든 특징들을 물려 받는 것b클래스가 a클래스를 상속받을 때 a클래스의 속성,행위를 모두 물려받는다➡️ 이를 상속관계라고 하며 a=부모클래스, b=자식클래스 라고함클래스 간의 계층 구조가 생겨 위(일반화)에서 아래로 내려갈수록 구체화라고 한다클래스의 구체화(= 고유의 특징 생김), 일반화(= 객체에 영향을 줌)코드의 재사용성 = 자식클래스는 부모클래스에서 물려받은 내용은 이미 구현되어 있기 때문에 다시 구현할 필요가 없다➡️ 자식클래스는 부모 클래스로 대체가능되어야 한다

부모class

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fd7f600e4-3eb6-4361-8fdf-4f33904376c0%2Fimage.png

자식class

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2Fa1c4f1e1-3ccd-461c-a76d-d58c0442ca80%2Fimage.png

다형성(Polymorphism) = 사용편의

  • 하나의 속성이나 행위(객체)가 상황에 따라 다른 의미로 해석될 수 있다➡️ 예를 들어, 복합기는 복사, 스캔, 프린트 등 여러가지 기능을 수행 할 수 있다다형성의 개념을 사용하는 방법으로 오버라이딩(Overriding)과 오버로딩(Overloading) 존재

오버라이딩(Overriding)

  • 부모로 부터 받은 메서드를 자식객체에서 재정의 하는 것

https://velog.velcdn.com/images%2Fjaewon97%2Fpost%2F850362ff-0308-447f-ab15-34b4872979e2%2Fimage.png

오버로딩(Overloading)

  • 같은 함수 이름을 가지고 있으나 매개변수, 리턴타입 등의 특징은 다른 여러개의 서브프로그램 생성을 가능하게 하는 것

0개의 댓글