OOP(Object Oriented Programming)
강아지는 회색, 흰색의 털을 가지고 있고, 눈동자색은 파란색과 갈색이다. 이름은 레인이다.
고유한 특성을 가지고 있으나 특성에 관계없이 레인은 강아지라는 종에 포함이 된다.
그리고 또 어딘가에는 또리라는 갈색과 검은색의 털로 덮여 있고, 갈색눈동자를 가진 강아지도 있을 것이다.
강아지들은 앉아 있기도하며, 드러눕기도 하고, 밥을 먹을때도 있다.
강아지를 예제로 OOP에 대해서 알아보려고 한다.
기본적인 구성요소
- Calss : Class는 같은 종류의 집단에 속하는 특성들을 정의 한 것이다. 다른 클래스와 독립적으로 만들어야 한다.
레인과 또리는 모두 색이 있는 털로 덮여있으며, 이름이 있고, 눈동자도 있다. 강아지라는 종의 종류에 들어가지만,
휴대폰은 털도 없고, 눈동자도 없기 때문에 강아지가 될 수 없다. - Object : Class 의 Instance. Object(객체) 는 상위 클래스의 속성을 상속하면서, 각각의 고유한 특성(property)와 행위(Method) 가지고 있다 . 레인은 또리는 각각의 Object가 된다.
- Property : Object의 특성이다. 또리와 레인은 모두 강아지이고, 눈동자도 있지만, 또리는 갈색이라는 눈동자색과 레인은
파란색과 갈색이라는 고유의 특성(property)을 가지고 있다. - Method : Class에 있는 Object를 조작하여 동작하는 것으로 드러눕기.. 밥먹기, 앉기 등을 예로 들 수 있다
OOP의 특징들
- 추상화(Abstraction) : Object의 공통적인 property와 Method를 추출하여 추상화 시켜주는 것이다.
불필요한 정보는 제외하고 공통적으로 필요한 정보를 분류, 구성하는 것이다. 동물이라는 대분류 안에 강아지, 고양이 , 사람등이 있다면, 네발로 걷는 강아지에게 두발로 걷는 사람의 특성은 필요하지 않을 것이다. 이러한 것들을 빼고, 필요한 것만 추상화 시키는 것이다.
- 캡슐화(Encapsulation) : Object 외부에서 직접 접근하지 못하도록하고, 임의로 조작할 수 없게 한다. Method를 통해서만 접근이 가능하게 한다. 만약 내가 레인을 만들때, 다른 누군가가 프로펠러를 달았다. 레인은 더이상 강아지일까? 또, 캡슐화를 통해서 Class 내에 넣어줌으로써 일일해 지정해야하는 번거로움이 줄어든다.
- 상속(Inheritance) : 상위 Class의 특징을 하위Class가 물려 받는다. 모든 하위Class는 상위Class이며, 하위 Class는 상위Class의 구체적인 분류이다. 강아지라는 상위Class에 또리와 레인이라는 하위 Class가 있다. 강아지중 레인이라는 한종류와 또리라는 다른 종류가 있다. 그러나 또리와 레인은 고유한 특성은 다르나 눈동자가 있고, 털도 있으며, 드러눕기가 가능한 요소들을 가지고(상속)있다.
- 다형성 (Polymorphism) : 상위 Class에서 상속받은 하나의 Method가 다른 방식으로 실행되는 경우가 있다.
reusability(재사용성)을 같이 살펴볼수 있는데 ,레인 말고도 강아지를 여럿 만들고 싶다. 기능도 추가하고 싶다. 그렇다면 각각의 특성별로 새로 만들어야할까? 또리 : {눈동자 :갈색 털 : 갈색, 검정색 / 행동 : 뛰어다니기 } / 뽀삐 : {눈동자 : 파란색 ....행동:손내밀지....일일히 특성과 행동을 개별적으로 입력해야 할까?
하나씩 만들다보면 너무 시간도 오래걸리고 비효율적이다. 그러나 우리는 강아지라는 눈동자와 털을 가진 기본적인 Base를 가지고 있다. 그렇다면하나씩 하나씩 만들 필요없이 강아지 Class 안에 특성들을 추가해주고, 뽀삐에게 행동들을 추가해주면 또리와 뽀삐가 탄생한다!
OOP Benefits
- Code reusability (코드의 재사용성)
- Scalability (확장성)
- Efficiency (효율성)
- Reduce complexity (복잡도의 감소)
OOP Concern
- Complex to create (설계{생성}시 복잡성)
- Typically slower than others (상대적으로 느린 처리 속도)
'JavaScript' 카테고리의 다른 글
Web Architectures (0) | 2020.05.18 |
---|---|
[Data Structure]Linked List, Hash Table (0) | 2020.05.12 |
ES6 의 Class와 Super (0) | 2020.05.08 |
[Data Structure] Stack / Queue (0) | 2020.05.06 |
유효성 검사하기 중 getElementsByName 이 작동하지 않을 때 (0) | 2020.04.07 |