요즘 주로 사용되는 다양한 언어, 프레임워크들은 객체지향 프로그래밍을 지향합니다. 대표적으로 Java-Spring, Python-django, PHP-Laravel 등 다수의 프레임워크들은 객체지향을 기반으로 만들어져있습니다. 심지어 함수형 프로그래밍을 지향하는 Node.js 에서도 상황에 따라 class 사용을 통한 부분적 객체지향을 권장하기도 합니다.
1. 객체지향이란?
모든 사물과 개념을 객체로 정의하여 개발하는 방식 입니다.
모든 객체는 행위
와 속성
을 가진다는 개념을 바탕으로, 객체를 설계할때는 실제 사물을 기반으로 설계를 합니다.
자동자 객체
- 속성 : 차종, 현재기어, 속도 ...
- 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다 ...
그리고 캡슐화
, 상속
, 다형성
, 추상화
등의 특성을 갖고 있습니다.
2. 객체의 4가지 특성
1. 캡슐화
캡슐화는 객체의 속성
과 메소드
를 하나로 묶고, 객체의 속성
을 보호하기 위한 개념입니다. 속성
을 외부에서 접근할 수 없도록 하고, 메소드
를 통해 변경되도록 해야합니다. 이렇게 하는 이유는 의도한 대로 동작하도록 하게 하기 위함입니다.
자동차 객체
예를 들어, 최고 속도가 100인데 속도속성
에 접근하여 150을 입력하면 오류이다. 그래서메소드
를 통해 속도속성
에 입력할 속도 값이 100을 넘지 않는지검증
을 하여 입력되게 한다면 의도한 대로 동작하도록 할 수 있다.
- 장점
- 추상화:외부에서는 내부에서 어떻게 동작하는지 이해할 필요가 없으며, 단순 호출만으로 기능을 실행할 수 있고, 객체 단위 설계가 가능함
- 재사용성 : 한 객체에 관련된
속성
,메소드
는 타 객체에 의존하지 않기 때문에 객체의 응집도가 높아져서 재사용성이 향상됨
2. 상속
상위 객체의 속성
과 메소드
를 물려받는것을 의미합니다.
흔히 상속 관계는 상위 객체
←하위 객체
와 같은 형식으로 나타냅니다.
상위 객체
일수록 추상적이고, 하위 객체
일수록 구체적으로 표현됩니다.
- 장점
- 재사용성 : 필요한
속성
,메소드
를 가진상위 객체
를 상속하여 효율적으로 객체를 정의할 수 있음 - 확장성 : 비슷한 특성을 가진 새로운
하위 객체
를 효율적으로 정의할 수 있어 확장성이 좋음 - 유지보수성 : 동일한
메소드
를 각 객체마다 정의하고 있다면, 수많은 작업이 필요하다. 하지만, 상속을 이용한다면상위 객체
에서 수정하면하위 객체
에 적용되기 때문에 유지보수가 용이함
- 재사용성 : 필요한
3. 다형성
동일한 이름의 메소드
를 실행해도, 각 객체가 어떻게 구현했느냐에 따라 그리고 어떤 매개변수를 받느냐에 따라 다르게 동작하도록 만드는것 입니다.
아래와 같이 예를들 수 있습니다.
저가형 자동차 객체
public void 시동을건다() { this.is엔진동작 = true; }
고급형 자동차 객체
public void 시동을건다() { this.is엔진동작 = true; this.네비게이션켜기(); this.드라이브모드_변경('기본모드'); } public void 시동을건다(최근에_사용했던_드라이브모드) { this.is엔진동작 = true; this.네비게이션켜기(); this.드라이브모드_변경(최근에_사용했던_드라이브모드); //에코모드, 스포츠카모드 등 }
4. 추상화
하위 객체
들의 공통적인 속성
, 메소드
를 추출하여 상위 객체
로 만드는 것입니다. 이는 객체 모델링 이라고도 합니다.
자동차 객체
- 속성 : 차종, 현재기어, 속도 ...
- 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다 ...
저가형 자동차 객체 (자동차 객체 상속)
- 속성 : 차종, 현재기어, 속도 ...
- 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다 ...
고급형 자동차 객체 (자동차 객체 상속)
- 속성 : 차종, 현재기어, 속도, 드라이브모드 ...
- 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다, 네비게이션켜기, 드라이브모드_변경 ...
저가형 자동차
와 고급형 자동차
는 자동차
를 상속합니다.
자동차
←저가형 자동차
자동차
←고급형 자동차
다시 말하면, 저가형 자동차
와 고급형 자동차
의 공통적인 속성
과 메소드
를 자동차
객체로 추상화 하였다고 할 수 있습니다.
그리고 상속받은 속성
과 메소드
를 재정의하거나 새롭게 추가할 수 있습니다.