OOP 의 기본 컨셉은 프로그램 내에서 표현하고자 하는 실 세계(real world)의 일들을 객체를 사용해서 모델링하고, 객체를 사용하지 않으면 불가능 혹은 무지 어려웠을 일들을 쉽게 처리하는 방법을 제공한다. - mdn
객체의 모델링을 만들고 그것을 활용한다. 이것이 oop의 기초인것 같다. oop가 나온이유는 아마 이전에 절차적으로 작성한 코드들의 문제점, 혹은 불편한 점때문에 나온것이라고 생각된다.
객체의모델링, encapsulation
객체의 모델링은 객체 내에 필요로하는 데이터와 행동들을 표현하는것으로 한다.
class라는 모델을 표현하자면 대략 이런식으로 할수 있을것이다. 여기서는 data는 name,age,gender,interests.
행동은 bio, greeting정도로 볼수 있겠다. 이 모델을 가지고 실체를 만들어내서 활용하면 된다.
(cf. person은 모델링하자면 아마 이것보다 훨씬 더 많은 data와 행동들이 있을수 있다. 하지만 프로그래밍에서는 모든것을 다 쓰지 않고 필요한것만 쓰면 된다. 프로그래머의 의도에 의해서 일부만 사용하는것, 이것을 추상화(abstract)라고 한다.)
위의 그림을 보면 person 이라는 모델을 이용하여 object 2개를 만든것이 보인다. (Instantiation).
각각의 object는 실제로 data 와 행동을 가지고 있고 활용도 할수가 있다.
이 과정에서 각 객체들은 object단위로 움직인다. 즉 object 에 있는 data는 묶여서 활용이 된다는 말이다.
이를 캡슐화 (Encapulation) 라고 한다. 실제 세계에서도 같은 원리다.
객체의 상속(Inherite)
객체의 상속은 모델링에 대한 얘기라고 할수 있겠다. 모델링도 어떤식으로 생각하느냐에 따라 달라지기 일수일것이다. 일반적인 모델링이 있다면 그것보다 더 상세한 모델링이 있을수있다는 말이다.
person이라는 모델링보다 더 상세한 student나 teacher같은 모델링이 필요할수도 있을것이다.
이때 student모델 따로, teacher 모델 따로 만들어내는것이 아닌 상위 개념이라고 할수있는 person을 이용하여 표현을 할수가 있다.
teacher, student모두 일부 data는 person의 data를 사용하도록 모델링 하게 된다면, 상속(Inherited)을 이용하여 모델을 표현할수가 있다. 이때 person 모델을 부모 class 라고하고 teacher, student를 자식 class라고 한다.
중복되는 data나 행동들은 자식 class에서 작성해주지 않아도 된다. (상위 class의 data,행동을 사용하기 때문)
이 상속을 이용하지 많으면 프로그래밍에서는 아마 재앙 수준일것이다. 각자 모든 모델들에 대해 수정하고 각 인스턴스에 대해서도 수정을 해줘야 하기때문이다. 아마도 mdn에서 말한 불가능한일,어려웠을 일을 쉽게 처리한다는게 이것을 의미 하는게 아닐까 싶다.
부모 class(person)에서 물려받은 행동 그대로를 쓰지 않아도 된다. 행동명은 같지만 내용을 바꿀수 있다는 말이다.
위 예를 보면 Bio의 내용이 바뀌어 있는것을 알수가 있다.
부모 class의 행동을 자식class가 재정의 해서 사용하는것을 다형성(Polymorphism) 이라 한다.
oop 의 기본요소
- Encapsulation
- Abstract
- Inherite
- Polymorphism
이 4가지는 꼭 이해해야할 개념이다.