객체지향 프로그래밍

Jun·2022년 5월 11일
0

네이버 부스트캠프

목록 보기
6/21

1. 객체지향


1.1 클래스 vs 객체 vs 인스턴스


  • 클래스란?

    • 공통된 속성과 행위를 수행하는 객체의 집합이다. 즉 객체를 정의하고 만들어 내기 위한 설계도
    class 사람 {
    	나이: ;
    	성별: ;
    
    	인사 () {
    		안녕하세요..
    	}
    }

    클래스는 속성을 나타내는 필드와, 행위를 나타내는 메소드로 구성된다.

  • 객체란?

    • 클래스로 구현한 실체된 대상이다.
    • 즉, '나'는 사람이라는 클래스의 객체라고 볼 수 있다.
    • 객체는 클래스의 인스턴스라고 부른다.
  • 인스턴스란?

    • 클래스 설계도를 바탕으로 소프트웨어에서 구현된 구체적인 실체이다.
    • 즉, 객체를 소프트웨어에서 실체화 하면 그것을 인스턴스라고 부른다.
    • 실체화된 인스턴스는 메모리에 할당된다.
  • 객체 vs 인스턴스

    • 클래스 타입으로 선언한 것을 객체라 하고, 그 객체가 메모리에 할당 되어질때 (new) 인스턴스라고 한다.
    • 객체는 현실세계에 가깝고, 인스턴스는 관계의 초점에 가까운 개념

1.2 상속과 다형성


  • 상속
    객체지향에서 상속이란 어떤 클래스보다 좀 더 확장된 기능을 구현하고 싶을 때 새로 클래스를 구현하지 않고, 기존의 클래스를 상속받아서 속성이나 기능을 확장시키는 것을 말한다.

  • 다형성

    다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있다는 것을 의미한다.

    예를 들어 상속을 이용한다면, 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 할 수 있다.

  • 오버로딩(Overloading) vs 오버라이딩(Overriding)

    • 오버로딩: 같은 이름의 메서드를 여러개 가지면서 매개변수의 유형과 개수가 다르게 하는 방법
    class OverloadingTest{
        cat(){
            console.log("매개변수 없음");
        }
    
        cat(int a, int b){
            console.log("매개변수 :"+a+", "+b);
        }
    
        cat(String c){
            console.log("매개변수 : "+ c);
        }
    }
    

    출처: https://private.tistory.com/25 [공부해서 남 주자]


    • 오버라이딩: 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의 해서 사용하는 방법

      class Woman{
      	constructor() {
      	    this.name;
      	    this.age;
          }
          info(){
              console.log("여자의 이름은 "+name+", 나이는 "+age+"살입니다.");
          }
      
      }
      
      class Job extends Woman{
      	 constructor() {
      	    this.job;
          }
          info() {
              super.info();
              console.log("여자의 직업은 "+job+"입니다.");
          }
      }
      
      출처: https://private.tistory.com/25 [공부해서 남 주자]
  • this vs super
    this란 현재 클래스의 인스턴스를 의미하고, super란 상위 클래스의 인스턴스를 의미한다.

2. 자바스크립트에서 객체지향


2.1 object literal


자바스크립트는 오브젝트를 이용하여 객체를 표현할 수 있다.

const person = {
  name: '곽성준',
  Age: 24,

  info() {
    console.log('이름: ' + this.name + '나이: ' + this.age);
  },
};

person.info();

2.2 Class (ES2016)


class가 생기고 class에서 제공하는 constructor라는 생성자가 주어짐.

class를 new로 호출하면 생성자가 실행되고, 인스턴스를 반환한다.

하지만 class는 prototype을 내부적으로 사용하고 있다.

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  info() {
    console.log('이름: ' + this.name + '나이: ' + this.age);
  }
}

const person = new Person('곽성준', 24);
person.info();

2.3 constructor pattern


function을 new 키워드로 호출하면 그 함수는 constructor가 된다.

const Person = function(name, age) {
		this.name = name;
		this.age = age
		this.info() = function {
		    console.log('이름: ' + this.name + '나이: ' + this.age);
	  }
}

const person = new Person('곽성준', 24);
person.info();

2.4 prototype


constructor 패턴과 유사하나, 메서드를 prototype객체에 보관해서 메모리 효율성에서 유리하다.

  • 자바스크립트에서 함수를 정의하고, 파싱 단계에 들어가면 내부적으로 수행되는 작업이 있다.
  • 함수 멤버로 prototype 속성이 생기고, 이 속성은 다른 곳에 생성된 함수이름의 프로토타입 객체를 참조한다.

  • 예를 들어 아래의 함수를 정의했다고 하자.
function Person() {}
  • 속성이 하나도 없는 Person함수가 정의되고, 파싱단계에 들어가면, Person 함수 Prototype 속성은 프로토타입 객체를 참조한다.
  • 그리고 프로토타입 객체 멤버인 constructor 속성은 Person함수를 참조하는 구조를 가진다.

스크린샷_2021-07-28_오전_12 11 54


  • 여기서 person 프로토타입 객체는 new라는 연산자와 Person함수를 통해 생성된 모든 객체의 원형이 되는 객체이다.
  • 예를 들어 Person함수를 new연산자를 이용해 생성한다면 아래와 같이 같은 프로토타입 객체를 참조한다.
function Person() {}

const joon = new Person();
const jisoo = new Person();

스크린샷_2021-07-28_오전_12 15 36

  • proto 란 비표준 속성이고, 이는 원형인 프로토타입 객체를 숨은 링크로 참조하는 역할을 한다.

  • 모든 객체는 프로토타입 객체에 접근할 수 있고, 프로토타입 객체 또한 동적으로 멤버를 가질 수 있다.
  • 예를 들어 아래와 같이 런타임에 멤버를 추가할 수 있다.
function Person() {}

const joon = new Person();
const jisoo = new Person();

Person.prototype.getType = function () {
  return '인간';
};

console.log(joon.getType()); //인간
console.log(jisoo.getType()); //인간

스크린샷_2021-07-28_오전_12 20 46


  • 만약 동적으로 멤버를 추가할 때 프로토타입 객체를 사용하지 않는 다면 프로토타입 객체가 아닌 각각의 객체 안에 멤버가 추가된다.
joon.getType = function () {
  return '사람';
};

console.log(joon.getType()); //사람
console.log(jisoo.getType()); //인간

jisso.age = 25;

console.log(joon.age); // undefined
console.log(jisoo.age); // 25

스크린샷_2021-07-28_오전_12 23 58

  • 따라서 프로토타입 패턴을 사용하면 메서드를 따로 보관하지 않고, 프로토타입 객체에 보관해서 메모리 효율이 더 좋다.

2.5 class기반 vs prototype기반


  • 클래스
    • 클래스는 객체의 기본적인 구조와 기능을 먼저 정의한다.
    • 인스턴스는 특정 클래스의 양식을 기반으로 한다.
    • 즉, 모든 인스턴스의 구조는 동일하다.
  • 프로토타입
    • 클래스는 클래스 사이의 분류 관계에 초점을 맞추지만, 프로토타입은 여러가지 표본의 동작 방식에 초점을 맞춘다.
    • 프로토타입 기반 체계는 동적으로 구조를 정의할 수 있다.

3. 객체지향 설계 (SOLID)


3.1 SRP (단일 책임 원칙)


  • 한 클래스는 하나의 책임만 가져야 하며, 그 기능을 완전히 캡슐화해야 한다.
  • 이는 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야함을 의미한다.
  • SRP는 책임 영역이 확실하기 때문에 다른 클래스와의 연쇄작용에서 자유로울 수 있다.
  • 따라서 코드의 가독성 향상, 재사용성 증진, 유지보수 용이라는 이점이 있다.

3.2 LSP (리스코프 치환 원칙)


  • 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
  • 즉, 서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다.
  • 이는 다형성을 증진시키기 위한 목적이다.

리스코프 치환 원칙 예시

profile
HiHi

0개의 댓글