컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체(Object)"들의 모임으로 파악하고자 하는 것이다. 우리가 실생활에서 쓰는 모든 것을 객체라 하며, 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다.
클래스를 이용해 연관있는 처리부분과(함수) 데이터부분(변수)을 하나의 객체(인스턴스)로 묶어 생성, 사용, 작은 문제를 해결하는 객체를 생성해 큰문제를 해결하는 Bottom-Up 방식이다.
객체 지향 프로그래밍의 중요한 특성은 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향한다는 점이다.
응집력(cohesion) : 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도. 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집력이 높다고 표현한다.
결합력(coupling) : 프로그램 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도. 결합력이 낮다는 것은 한 요소가 다른 요소들과 관계를 크게 맺고 있지 않은 상태를 의미한다.
클래스에 하나의 문제 해결을 위해 데이터를 모아 놓은 객체를 활용한 프로그래밍을 지향하므로 응집력을 강화하며, 클래스 간에 독립적으로 디자인함으로써 결합력을 약하게 할 수 있다.
대상을 관찰하여 핵심적인 특징(속성과 행위)을 뽑아내는 과정이다.
이때 관련있는 것들을 묶게되면 캡슐화가 되고 묶은 개념은 추상화가 되고 주체는 클래스가 된다.
중요한 것은 속성 위주가 아닌 동작 위주로 정의하는 작업을 하는 것이다.
'객체'는 클래스로 부터 실체화 된것으로 눈에 보이며 실체한다.
'클래스'는 추상적이기에 눈에 보이지 않고 개념적으로만 존재한다.
특징(속성과 행위)가 관련있는 것끼리 묶는다. (데이터와 알고리즘을 하나로 묶는 것)
접근이 필요한 부분을 제외하고 구체적인 로직은 내부로 숨긴다(=은닉성)
구체적인 로직을 내부로 은닉하기 위함이다.
- 클래스 내부 구현의 '응집도'를 증가시킨다.
- 외부 클래스와의 '결합도'를 감소시킨다. (일반적인 객체지향언어는 '접근 제한자'를 지원한다.{public, private, protected})
대상이 되는 클래스의 모든 특징을 물려받는 것, 자식 클래스로 부터 부모 클래스가 대체되어도 의미가 성립되어야한다.(계층형 구조)
-부모와 자식은 '상속관계'
-관계가 내려갈수록 고유 특징이 증가하여 '구체화'된다.
- 관계가 올라갈수록 '일반화'된다. (더 많은 객체에 영향을 준다)
상속과 연관이 있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성 되는 것이다.
쉽게 말하면 한부모의 밑에서 태어난 자식(쌍둥이포함)이 똑같지는 않는 것과 같다.