- 프로그램을 구성하는 로직 상태와 행위로 구분해서 연관된 상태와 행위를 그룹핑한것.
- 쉽게 예를 들면 학생이라는 객체는 학번이라는 상태, 공부한다라는 행위가 있다.
- 이 객체들이 모여 프로그램을 구성하는 것이 객체 지향 프로그래밍이다.
우리가 만드는 프로그램들은 점점 개발할수록 규모가 커지고 점점 유지보수하기 힘들어진다. 프로그램의 기능을 어느 한 곳에만 몰아서 동작하게 하면, 프로그램을 수정할 때마다 일일이 프로그램을 싹다 뜯어 고쳐야 한다. 그러니 기능을 한 곳에 몰아서 넣는 것이 아닌 기능을 쪼개서, 필요에 의해 기능을 수정하거나 확장하는 것이 용이하게 해야한다. 이렇게 프로그램을 객체로 알맞게 쪼개야하고, 객체를 알맞게 만들어야 유지보수가 쉬워지고 좋은 프로그램을 만들 수 있다.
객체 지향 프로그래밍은 이 객체들을 조립하여 완성된 프로그램을 만드는 기법이다.
예를 들어 차 객체를 만든다고 하자. 차는 아주 많은 속성을 가지고 있다. 엔진, 페달, 사이드미러, 타이어 등등 차를 구성하는 속성은 아주 많다.. 이렇게 복잡한 차의 속성을 다 구현할 순 없다. 그래서 복잡한 전체가 아닌 필요한 속성만 쏙쏙 뽑아서 필요한 요소를 제외한 나머지를 잘 배제하여 구성해야 좋은 객체를 만들 수 있다. 이 차에도 종류가 있다, 승용차, 승합차 등.. 그래서 차(어떤 영역)의 공통된 속성을 모아 놓아 하나의 개념으로 정의하는 것을 추상화라고 한다.
- 간단 요약: 어떤 사물에서 내가 원하는 특징만을 추출하여 그 특징으로 사물을 일반화 하는 것.
- 실제 구현 내용을 감추고 내가 드러내고 싶은 기능만 드러내는 것.
- 외부의 잘못된 사용으로 인한 객체 손상을 막을 수 있고, 사용자 또한 내부 구조를 몰라도 객체를 사용할 수 있다는 장점이 있다.
- 간단 요약 : 중요하거나 알 필요 없는건 숨기고, 내가 원하는 것만 드러내는 특성
-
상위 객체를 하위 객체가 상속하여 처음 부터 생성하는 것이 아니라 객체를 재사용하여 반복된 코드의 중복을 줄여주고 객체를 처음 부터 설계하지 않아도 되어 시간이 절약된다.
-
상속은 일반화라고도 하는데, BMW, 벤츠등의 이런 다양한 차들을 "차"라는 부모 클래스라고 일반화 할 수 있기 때문이다. 그렇기에 다른 클래스에서 그냥 "차"라고만 알 수 있지 이것이 BMW인지 벤츠인지 알지 못하게하는 캡슐화의 기능도 한다.
- 같은 타입이지만 실행결과가 다양한 객체를 이용할 수 있는 성질을 말한다.
예를 들어 동물이라는 상위 클래스에 울기라는 메서드가 있다. 이 울기 메서드는 선언만 되어있고 아무 기능이 없다고 하자. 하지만 이를 고양이, 호랑이 클래스에서 상속을 한 후 메서드를 재정의 해서 고양이 클래스에서는 울기 메서드를 했을 때 "야옹"을 출력하고, 호랑이 클래스에서는 "어흥"을 출력한다. 이처럼 같은 메서드를 사용했음에도 결과가 다른데 이 특성을 다형성이라고한다. 자바에서는 다형성을 위하여 자식 클래스에서 부모클래스로의 타입 변환이 가능하다.
- 허나 Robert C. Martin이 쓴 클린 아키텍쳐에서는 위의 특징들이 모두 객체지향 언어에서만 가능한 것이아니라 원래 C 와 같은 절차적 프로그래밍에서도 가능했던 요소들이라 객체 지향 언어가 새로 만든 개념은 없고 저 4개의 특징 중에서 다형성과 상속에 대해 편의성과 안전성을 제공했다고 한다.