Java

[객체지향] 1. 객체지향

jwKim96 2021. 7. 24. 13:53

요즘 주로 사용되는 다양한 언어, 프레임워크들은 객체지향 프로그래밍을 지향합니다. 대표적으로 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. 추상화

하위 객체들의 공통적인 속성, 메소드를 추출하여 상위 객체로 만드는 것입니다. 이는 객체 모델링 이라고도 합니다.

자동차 객체

  • 속성 : 차종, 현재기어, 속도 ...
  • 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다 ...

저가형 자동차 객체 (자동차 객체 상속)

  • 속성 : 차종, 현재기어, 속도 ...
  • 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다 ...

고급형 자동차 객체 (자동차 객체 상속)

  • 속성 : 차종, 현재기어, 속도, 드라이브모드 ...
  • 행위 : 시동을건다, 속도를높인다, 속도를줄인다, 시동을끈다, 네비게이션켜기, 드라이브모드_변경 ...

저가형 자동차고급형 자동차자동차를 상속합니다.

  • 자동차저가형 자동차
  • 자동차고급형 자동차

다시 말하면, 저가형 자동차고급형 자동차의 공통적인 속성메소드자동차 객체로 추상화 하였다고 할 수 있습니다.
그리고 상속받은 속성메소드를 재정의하거나 새롭게 추가할 수 있습니다.