객체지향 프로그래밍
객체지향 프로그래밍은 실세계에 존재하고 인지하는 객체를 소프트웨어의 세계에서 표현하기 위해 객체의 핵심적인 개념 또는 기능만을 추출하는 추상화를 통해 모델링하는 프로그래밍 패러다임을 뜻한다.
다시말해 우리가 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상을 의미한다.
객체지향 프로그래밍의 네 가지 개념
- 캡슐화 (Encapsulation) :
캡슐화는 데이터(속성)과 기능(메서드)을 하나의 객체 안에서 느슨한 결합(Loose Coupling) 상태를 가지는 것을 의미한다. 외부에 공개될 필요가 없는 데이터 등의 정보는 숨겨지므로 은닉화의 특징도 포함한다.
느슨한 결합은 코드 실행 순서에 따라 절차적으로 코드를 작성하는 것이 아니라, 코드가 상징하는 실제 모습과 닮게 모아서 결합한 것을 의미한다.
- 추상화 (abstraction) :
추상화는 복잡한 구현을 숨기고, 노출되는 부분을 단순화 시키는 개념이다.
추상화를 이용하면 인터페이스를 단순하게 만들 수 있는데, 이러한 단순함은 사용간의 예기치못한 변화를 예방할 수 있다.
추상화와 캡슐화는 데이터나 구현을 숨긴다는 점에서 비슷해 보이는데, 캡슐화는 코드나 데이터의 은닉이 주 관심사라면, 추상화는 사용자에게 필요치 않은 메서드 등을 숨기고 단순한 이름으로 정의한다는 점이 주 관심사이다.
- 상속 (Inheritance) :
상속은 부모의 특징을 자식이 물려받는 것을 의미한다. 정의된 클래스와 그 클래스에 의해 생성된 객체가 같은 특징(속성, 메서드)을 가지는 것을 말한다.
이는 부모 자식 객체 간의 프로토타입 체인에 의해 이루어 지며, 자식은 부모의 속성과 메서드를 상속 받을 수 있으나 부모는 자식의 속성과 메서드를 가져올 수 없다.
- 다형성 (Polymorphism)
다형성은 같은 이름을 가진 메서드가 대상에 따라 조금씩 다르게 작동하는 것을 의미한다. 도형이라는 클래스와 사각형, 삼각형, 원 이라는 인스턴스가 있다고 했을 때 너비를 구하는 메서드는 각 인스턴스에 따라 넓이를 구하는 공식이 다르게 적용돼야 할 것이다.
그래서 동일한 메서드에 대해 조건문을 쓰는 대신 객체의 특성에 맞게 작성하는 것이 가능해진다.