TIL_022_210226

James·2021년 2월 26일
0

TILs

목록 보기
22/40

OOP(Object Oriented Programming)

  • OOP 객체지향 프로그래밍이란 무엇인가?
    => 재사용성을 극대화하기 위한 프로그래밍 설계 철학이다.

  • 재사용성을 왜 극대화 해야 하는가?
    => 기존의 함수와 공통적인 부분이 있음에도 재사용하지 않고 조금 상이한 특징이 있는 함수를 처음으로 끝까지 새로 구현하는 일을 반복하게 되면 프로젝트의 규모가 커질 수록 점점 코드가 복잡해 지고 길어지는 경향이 있다. 이는 시간적, 경제적 낭비로 이어져 프로젝트 생명유지(Cost, Schedule, Quality)의 치명적인 리스크로 작용할 수 있다.
    => 프로젝트는 여러 사람이 협업을 요구되는 만큼 다른 사람이 내 코드를 봤을 때 쉽게 이해할 수 있어야 하고 불필요한 코드 작성을 최대한 지양하는 것이 중요하다.

  • 재사용성을 극대화하기 위한 OOP의 4가지 컨셉

  • 1) 캡슐화(Encapsulation)
    => 객체의 속성과 기능들을 하나의 단위로 묶어 놓는 것
    => 재사용이 필요할 때 마다 변수나 함수를 새로 만들지 않고 이미 캡슐화되어 있는 객체의 변수나 메소드를 사용하면 되니 재사용성이 증가한다고 할 수 있다.
    => 캡슐화의 특징 중 하나인 은닉화란 사용자가 클래스의 메소드에 접근할 수 있으나 메소드 내부의 변수나 함수에는 직접 접근하지 못하게 함으로써 구현은 숨기고 기능을 노출하는 개념을 실현한다.
    => 하지만, Javascript는 특성상 인스턴스가 모든 메소드 뿐만 아니라 내부 속성에도 직접 접근이 가능하여 완벽한 은닉화에는 한계가 있다.

  • 2) 추상화(Abstraction)
    => 객체의 속성과 기능들을 정의할 때 최대한 단순하고 범용적이고 변하지 않는 것들로만 구성하는 것
    => 메소드 내부는 복잡하더라도 사용자는 정의된 메소드명을 보고 쉽게 그 기능을 쉽게 이해하고 사용할 수 있어 재사용성을 증가시킬 수 있다.

  • 3) 상속(Inheritance)
    => 이미 만들어져 있는 클래스에 공통적인 특징이 있고 그것에 더하여 좀더 구체적인 특징을 추가하고 싶을 때 기존의 클래스의 속성과 메소드를 간단하게 그대로 물려받을 수 있는 것
    => 이미 존재하는 속성과 메소드를 재정의 할 필요없이 그대로 사용할 수 있으므로 재사용성을 증가시킬 수 있다.
    => 부모클래스를 기본클래스(base class)라 하고, 자식클래스를 파생클래스(derive class)라 부른다.

  • 4) 다형성(Polymorphism)
    => 같은 기능의 메소드라도 대상에 따라 다르게 구현되는 것
    => 다형성은 상속과 밀접한 관련이 있다. 예를 들어, '동물'이란 부모 클래스에서 '개'란 자식클래스와 '고양이'란 자식클래스가 상속을 받아 동일한 메소드인 speak()를 각자 내부 구현내용을 "멍멍"과 "야옹"으로 수정하는 경우가 있다.
    => 동일한 메소드명을 재사용하기 때문에 대상에 따라 새롭게 함수를 만들 필요가 없으므로 코드를 보다 간결하게 할 수 있어 재사용성을 증가시킬 수 있다.

JavaScript Prototype

  • JS에서 Prototype이란?
    => Javascript는 class가 아니라 Prototype기반으로 OOP를 구현하는 언어이다.
    => Javascript에서 모든 객체는 함수를 통해 만들어 진다. 함수를 정의하면 이 함수에 접근할 수 있는 객체도 함께 자동으로 생성이 되는 데 이 객체를 이용하여 함수를 마치 class처럼 이용하여 OOP를 구현할 수 있는 것이다.
    => Prototype이란 JS에서 함수를 만들 때 "함수명.prototype" 이란 빈 객체가 만들어지고 빈 객체로 key:value를 정의해 놓으면, 인스턴스 = new 함수명 을 통해 만들어진 인스턴스가 함수의 내부 뿐만 아니라 함수명.prototype이란 객체에도 접근할 수 있는 개념이다. 마치 함수명.prototype이 base class이고 재사용되는 속성이나 메소드가 들어 있는 template이라 할 수 있다.
    => 탄생부터 객체지향 프로그래밍을 목적에 두고 만들어진 언어들은 class기반으로 OOP를 구현하지만 Javascript는 그렇지 않기 때문에 ES6에서 class란 키워드를 사용하여 코드를 작성할 수 있도록 되었어도 결국 그 코드도 함수로 취급되어 prototype 객체가 생성된다.
    => 즉, ES6로 class란 문법이 도입된 후부터는 본격적으로 class기반의 OOP처럼 흉내낼 수 있게 되었다. 하지만 은닉화의 한계와 같이 실제 class기반의 언어들과 완전히 동일하게 기능을 구현하지는 못한다.

! 돈이 되는 규모 있는 프로젝트를 수행하려면 OOP의 개념은 확실히 하고 가야 겠다.

profile
웹개발자 James 입니다.

0개의 댓글