객체 지향 프로그래밍(OOP, Object Oriented Programming)이란 프로그램 설계방법론이자 개념의 일종이다.
객체 지향 프로그래밍 패러다임이 등장하기전 프로그래밍은 절차 지향 프로그래밍(POP, Procedure Oriented Programming)으로 코드의 흐름대로 실행 순서, 즉 절차가 중점이 되는 프로그래밍이 주로 사용되어 왔다.
캡슐화는 데이터와 기능을 하나의 단위로 묶는 것이다.
은닉화의 장점으로 내부 데이터를 객체 외부의 함수가 내부 데이터를 변경할 수 없어 예상치 못한 side-effect를 줄일 수 있다.
추상화는 내부는 아주 복잡한데, 노출된 부분은 단순하게 만든다는 개념이다.
노트북을 예로 들면 우리가 노트북을 사용할 때 내부의 어떤 부품이 어떻게 전기적인 신호를 보내고 하는지 알지 않아도 되듯 단순히 노트북을 켜고 마우스와 키보드를 이용해서 원하는 작업을 하는 것으로 단순화할 수 있다.
필요하지 않은 기능들이 너무 많이 노출되지 않아서 예기치 못한 데이터의 변화가 일어나지 않도록 만들어준다.
불필요한 부분을 도려내가며 그린 추상화(?)
상속을 함으로써 가장 크게 얻을 수 있는 것은 재사용성이다.
예를 들어 이미 잘 만들어진 노트북이라는 클래스가 있다. 추가적으로 맥북이라는 클래스를 만든다고 해보자. 앞서 잘 만들어진 노트북이라는 클래스를 맥북에 상속해주게 되면 꽤나 효율적으로 코드를 작성할 수 있다. 이제 맥북 클래스에 맥북만의 속성과 메서드만 코드를 작성하면 될 것이다!
다형성이란 같은 메서드를 가지고 각 객체마다 다양한 형태의 동작을 하는 것을 말한다.
예를 들어 성훈이라는 사람(성훈 인스턴스)에게 자기소개(자기소개 메서드 호출)를 해보라고 했을 때와 민수라는 사람에게 자기소개를 해보라고 했을 때 각자 다른 자기소개를 하듯이 자기소개라는 하나의 메서드로 다양한 형태의 자기소개가 나오는 것을 다형성이라고 볼 수 있다.
언어 자체에서 다형성을 제공하지 않는다면
if (type === '성훈') {
성훈의자기소개()
} else if (type === '민수') {
민수의자기소개()
}
이처럼 각각의 자기소개를 만들어야 할 것이다.
동물들에게 말해보라고 하면 각자의 방식대로 말을 한다.