카테고리:

객체 지향 (Object-Oriented)

객체 지향은 프로그램을 위에서 아래로 흐름에 따라 순서대로 처리하는 기존의 절차 지향에서 벗어나 모든 요소를 객체로 인식하고 객체 간의 관계 설계를 통해 개발하는 기법이다.

과거 공장 생산 라인의 발전을 생각해보면 쉽게 이해가 가능하다.

자동차가 개발되었을 때, 초기 자동차 생산 과정은 한명의 기술자가 자동차 한대의 생산을 처음부터 도맡아 제작하는 과정을 거쳤다.

이 방법은 생산성이 떨어지고 불량품 검출이 힘든 등 단점이 많았기 때문에, 이 후 포드 사의 포드가 개발한 각 부품별로 생산 후 조립하는 대량생산방식으로 발전하게 되었다.

절차 지향은 기존의 한 프로그램을 하나의 흐름을 통해 개발하는 초기 생산과정과 같다면, 객체 지향은 코드에 사용될 요소들을 부품별로 생산하고 조립하는 대량생산방식과 동일하다 볼 수 있다.

객체 지향의 4가지 특성

1.추상화

추상화란 공통적인 요소를 한데 모아 구성하고 구체적인 내용은 배제하는 것이다.

추상화를 통해 구현 내용과 인터페이스를 분리하게 되고, 사용자에게 세부적인 내용은 감추게 되어
프로그램의 구조를 몰라도 사용이 가능하도록 만드는 개념이다.

이 개념은 프로그램 설계에도 유용하게 사용되는데, 객체 간의 관계를 설계할 때 부모 클래스와 자식 클래스 선정, 객체에 특징을 부여하는 등에 사용된다.

추상화인터페이스예시

위의 사진처럼 캐릭터가 전방 범위에 공격을 휘둘러 몬스터와 돌이 피격되었다고 가정하자.

돌은 데미지를 받지 않고, 늑대만 데미지를 주게 하는 경우 인터페이스를 사용하면 편하다.

IDamageable이라는 인터페이스를 선언하고 공격에 피격된 물체가 IDamageable 인터페이스를 상속받았는지 확인하는 가정을 통해 피해를 입힐 객체와 입히지 않을 객체를 결정할 수 있다.

피해를 입는다는 특징을 인터페이스를 통해 부여하는 것이다.

2.상속

상속이란 클래스의 재활용을 의미한다.

추상화의 연장선으로, 추상화를 통해 설계된 객체 간의 관계가 있다면, 하위 클래스가 상위 클래스의 메서드와 변수들을 사용하게 하여 반복적인 코드를 줄일 수 있다.

하지만 세세한 구현을 객체에서 하도록 강요하는 추상화의 인터페이스와 달리, 상속은 필요한 경우에만 재정의를 통한 변형이 가능하게 유동적으로 설계된다.

상속예시
출처: https://en.wikipedia.org/wiki/Inheritance_%28object-oriented_programming%29

Dog가 Animal을 상속받으며 기존 Animal의 멤버 변수와 메서드를 모두 사용할 수 있다. Dog에서는 정의되지 않은 eat()가 Dog 클래스의 객체에서 호출이 가능하며, 부모에서 정의된 기능을 실행하게 될 것이다.

여기서 move()는 오버라이딩을 통해 기존에 존재하던 메서드를 자식에서 새롭게 정의된 move()로 바뀌는 과정이 보여진다.

3.캡슐화

캡슐화란 속성과 기능을 한데 모아 클래스를 만드는 과정이다.

캡슐화는 두 가지 목적: 데이터 보호, 데이터 은닉을 위해 존재한다. 캡슐이란 내용물을 밖에서 알 수 없게 되어있다. 캡슐화된 클래스도 동일한 맥락이다.

  • 데이터 보호: 외부로부터 데이터를 접근성을 제한하여 보호.
  • 데이터 은닉: 클래스의 세부내용은 가리고 클래스를 사용하기 위해 필요한 부분만 노출.

캡슐화된 클래스는 밖에서 데이터를 임의로 접근하지 못하게 하기 위해 public, protected, private등의 접근 제어자를 사용한다.

캡슐화표

public: 모든 곳에서 접근 가능 protected: 자신과 자식 클래스에서만 접근 가능 private: 자신만 접근 가능

4.다형성

다형성은 객체의 다양한 변형을 의미하는 객체 지향의 핵심적인 특징이다. 오버라이딩, 오버로딩, 상속 등이 모두 다형성을 구현하기 위한 방법들이다.

다형성예시
출처:https://codegym.cc/groups/posts/polymorphism-in-java

다형성이 객체 지향의 핵심 요소인 이유는 어떠한 기능이 필요할때마다 구현하지 않고 기존에 있는 기능을 변형하여 사용하기 때문에 작업량이 줄어들며 유지 보수가 간편하게 만들어 주기 때문이다.

사진처럼 단 하나의 함수로 다양한 객체에서 다른 동작을 실행하거나, 다양한 자식 클래스를 부모 클래스의 배열로 한꺼번에 관리하는 것을 가능하게 해준다.