OOP 객체지향 프로그래밍이란 무엇인가?
=> 재사용성을 극대화하기 위한 프로그래밍 설계 철학이다.
재사용성을 왜 극대화 해야 하는가?
=> 기존의 함수와 공통적인 부분이 있음에도 재사용하지 않고 조금 상이한 특징이 있는 함수를 처음으로 끝까지 새로 구현하는 일을 반복하게 되면 프로젝트의 규모가 커질 수록 점점 코드가 복잡해 지고 길어지는 경향이 있다. 이는 시간적, 경제적 낭비로 이어져 프로젝트 생명유지(Cost, Schedule, Quality)의 치명적인 리스크로 작용할 수 있다.
=> 프로젝트는 여러 사람이 협업을 요구되는 만큼 다른 사람이 내 코드를 봤을 때 쉽게 이해할 수 있어야 하고 불필요한 코드 작성을 최대한 지양하는 것이 중요하다.
재사용성을 극대화하기 위한 OOP의 4가지 컨셉
1) 캡슐화(Encapsulation)
=> 객체의 속성과 기능들을 하나의 단위로 묶어 놓는 것
=> 재사용이 필요할 때 마다 변수나 함수를 새로 만들지 않고 이미 캡슐화되어 있는 객체의 변수나 메소드를 사용하면 되니 재사용성이 증가한다고 할 수 있다.
=> 캡슐화의 특징 중 하나인 은닉화란 사용자가 클래스의 메소드에 접근할 수 있으나 메소드 내부의 변수나 함수에는 직접 접근하지 못하게 함으로써 구현은 숨기고 기능을 노출하는 개념을 실현한다.
=> 하지만, Javascript는 특성상 인스턴스가 모든 메소드 뿐만 아니라 내부 속성에도 직접 접근이 가능하여 완벽한 은닉화에는 한계가 있다.
2) 추상화(Abstraction)
=> 객체의 속성과 기능들을 정의할 때 최대한 단순하고 범용적이고 변하지 않는 것들로만 구성하는 것
=> 메소드 내부는 복잡하더라도 사용자는 정의된 메소드명을 보고 쉽게 그 기능을 쉽게 이해하고 사용할 수 있어 재사용성을 증가시킬 수 있다.
3) 상속(Inheritance)
=> 이미 만들어져 있는 클래스에 공통적인 특징이 있고 그것에 더하여 좀더 구체적인 특징을 추가하고 싶을 때 기존의 클래스의 속성과 메소드를 간단하게 그대로 물려받을 수 있는 것
=> 이미 존재하는 속성과 메소드를 재정의 할 필요없이 그대로 사용할 수 있으므로 재사용성을 증가시킬 수 있다.
=> 부모클래스를 기본클래스(base class)라 하고, 자식클래스를 파생클래스(derive class)라 부른다.
4) 다형성(Polymorphism)
=> 같은 기능의 메소드라도 대상에 따라 다르게 구현되는 것
=> 다형성은 상속과 밀접한 관련이 있다. 예를 들어, '동물'이란 부모 클래스에서 '개'란 자식클래스와 '고양이'란 자식클래스가 상속을 받아 동일한 메소드인 speak()를 각자 내부 구현내용을 "멍멍"과 "야옹"으로 수정하는 경우가 있다.
=> 동일한 메소드명을 재사용하기 때문에 대상에 따라 새롭게 함수를 만들 필요가 없으므로 코드를 보다 간결하게 할 수 있어 재사용성을 증가시킬 수 있다.
! 돈이 되는 규모 있는 프로젝트를 수행하려면 OOP의 개념은 확실히 하고 가야 겠다.