프로그램 설계 방법론으로 프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수 많은 객체(object)라는 기본 단위로 나누고 이들을 상호 작용으로 서술하는 방식
큰 문제를 작게 쪼개는 것이 아니라, 먼저 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 이 객체들을 조합해서 큰 문제를 해결하는 상향식(bottom-up) 해결법을 도입. 이 객체라는 것을 일단 한번 독립성, 신뢰성이 높게 만들어 놓기만 하면 그 이후에는 그 객체를 수정없이 재사용할 수 있으므로 개발 기간과 비용이 대폭 줄어들게 된다.
캡슐화(encapsulation) : 변수와 함수를 하나의 단위로 묶는 것을 의미한다. 즉, 데이터의 번들링(bundling)이다. 대개 프로그래밍 언어에서 이 번들링은 클래스를 통해서 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다.
정보 은닉(information hiding) : 프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로 노출을 최소화하여 모듈간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념이다. 많은 객체 지향 언어에서 사용되는 클래스를 기준으로 보면, 클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근이 가능하며 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 설계한다.
상속(inheritance) : 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받은 것이다. 기능의 일부분을 변경해야할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 오버라이딩(overriding)이라고 한다. 상속은 캡슐화를 유지하면서도 클래스의 재사용이 용이하도록 해준다.
다형성(polymorphism) : 하나의 변수, 또는 하나의 변수가 상황에 따라 다른 의미로 해석
서브타입 다형성(subtype polymorphism) : 기초 클래스 또는 어떤 인터페이스를 구현하는 상위 클래스를 생성하고, 해당 클래스를 상속받는 다수의 하위 클래스들을 만들어 상위 클래스의 포인터나 참조변수 등이 하위클래스의 객체를 참조하게 하는 것이다.이 때 각각의 하위 클래스는 상위 클래스의 메소드 위에 자신의 메소드를 덮어쓰는 메소드 오버라이딩(method overriding)을 수행하며, 상위 클래스의 참조변수가 어떤 하위 클래스의 객체를 참조하느냐에 따라 호출되는 메소드가 달라진다.
매개변수 다형성(parametric polymorphism) : 타입을 매개변수로 받아 새로운 타입을 되돌려주는 기능이다. 타입 매개변수를 정의한 클래스 혹은 메소드는 사용할 때 매개변수에 타입을 지정하게 되며, 컴파일 시 지정한 타입에 따라 해석된다.
임시 다형성(ad hoc polymorphism)
강제 다형성(coercion polymorphism)
프로그램을 유연하게 변경하고 용이하게 만든다.
프로그램의 개발과 보수를 간편하게 만든다.
직관적인 코드 분석을 가능하게 한다.
=> 강한 응집력(strong cohesion)과 약한 결합력(weak coupling)을 지향한다.
처리 속도가 상대적으로 느림
객체가 많아지면 용량이 커짐
설계 시 많은 시간과 노력이 필요
=>