프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다. 객체지향적으로 코드를 작성하면 재사용성과 변형가능성을 높일 수 있습니다.
프로그램이 실행되는 동안 실존하는 인스턴스로, 멤버 변수와 메서드로 구성되어 있습니다.
제공해야 할 기능을 찾고 그 기능을 알맞은 객체에 할당한 후, 객체 간에 어떻게 메시지를 주고받을지 결정합니다.
캡술화, 상속, 다형성 등과 같은 기법을 이용할 수 있으며, 절차지향 언어보다 실행속도가 느립니다.
OOP로 코드를 작성하면 재사용성과 변형가능성을 높일 수 있습니다.
객체 지향 프로그래밍은 크게 추상화, 캡슐화, 상속, 다형성의 네가지 특징을 가집니다. 추상화는 객체에서 공통된 속성과 행위를 추출하는 것입니다. 캡술화는 외부의 접근으로부터 객체의 데이터를 보호하는 것입니다. 상속은 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것입니다. 다형성은 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 것입니다.
만약 자동차를 추상화로 구현해 놓는다면, 새로운 브랜드가 추가 되었을 때 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 구현해 주면 되기 때문입니다.
재사용으로 인해 코드가 줄어들고, 범용적인 사용이 가능하다는 것입니다.
상위 클래스 변경이 어렵고, 클래스의 개수가 불필요하게 증가할 수 있다는 것입니다.
상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것입니다.
같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것입니다.
SRP, DCP, LSP, ISP, DIP 5가지 설계 원칙이 있습니다. SRP는 단일 책임 원칙으로, 클래스는 단 하나의 목적을 가져야 하며, 클래스를 변경하는 이유는 단 하나의 이유여야 한다는 것입니다. OCP는 개방-폐쇄 원칙으로 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다는 것입니다. LSP는 리스코프 치환 원칙으로, 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다는 것입니다. ISP는 인터페이스 분리 원칙으로, 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다는 것입니다. DIP는 의존 역전 원칙으로, 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다는 것입니다.
혼재된 책임을 각각의 개별 클래스로 분할하여 클래스 당 하나의 책임만을 맡도록 합니다. 유사한 책임들은 부모에게 위임하고 다른 책임들은 각 클래스에 정의합니다.
변경될 것과 변하지 않을 것을 구분하여, 두 모듈이 만나는 지점에 인터페이스를 정의합니다. 구형에 의존하기보다 정의한 인터페이스에 의존하도록 코드를 작성 합니다.
두 개체가 똑같은 일을 한다면, 하나의 클래스로 표현하고 이들을 구분 할 수 있는 필드를 둡니다. 공통된 연산이 없다면 완전 별개인 2개의 클래스를 만듭니다.
구체적인 인터페이스로 분리하여, 클래스가 특정 역할만을 이용할 수 있도록 합니다.
인터페이스나 추상 클래스를 만들고, 저수준 모듈이 해당 인터페이스나 추상 클래스를 구현하도록 합니다.