개발/Java

Java 객체지향 프로그래밍(OOP) 개념 정리(추상화(Abstraction) 이해하기)

IT 하는 문과생 2019. 11. 14.

 

Java 객체지향 프로그래밍(OOP) – 추상화(Abstraction)

지난 글에서는 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나인 캡슐화(Encapsulation)에 대해 알아보았다. 이번 글에서는 객체지향 프로그래밍의 또 다른 중요한 개념인 추상화(Abstraction)에 대해 살펴보겠다.
추상화라는 단어는 처음 접하면 어렵게 느껴질 수 있지만, 개념 자체는 생각보다 단순하다.
추상화란 공통적인 특징을 묶어 하나의 개념으로 정의하는 것이라고 이해하면 된다.

예를 들어 다음과 같은 동물이 있다고 가정해 보자.

  • 강아지
  • 고양이

이 동물들을 하나의 카테고리로 묶는다면 무엇으로 표현할 수 있을까?
가장 자연스러운 답은 “동물”이라는 개념이다.

객체지향 관점에서 보면 다음과 같이 표현할 수 있다.

동물 → 추상 클래스 (abstract class)
강아지
고양이

소 → 동물 클래스를 상속

 동물이라는 추상적인 개념을 먼저 정의하고, 각 동물 클래스는 이를 상속(extends) 받아 구현하는 것이다.

 

추상 클래스의 역할

조금 더 나아가 동물이라는 추상 클래스에는 동물이 공통적으로 가지는 행동을 정의할 수 있다.
예를 들면 다음과 같다.

  • 숨을 쉰다
  • 먹이를 먹는다
  • 소리를 낸다

이러한 공통 기능을 추상 클래스에서 정의하고, 아래와 같이 각 동물 클래스에서 필요에 따라 재정의(Override) 하여 사용할 수 있다.

abstract class Animal {
    void breathe()
    void eat()
    abstract void sound()
}

class Dog extends Animal
class Cat extends Animal

위와 같이 공통 구조를 정의해 두면 코드의 중복을 줄이고 유지보수가 쉬워진다.

 

자동차 예제로 보는 추상화

추상화 개념에 대해 조금 이해가 되었는가? 이어서 자동차로도 한 번 살펴 보자.
자동차에는 다양한 종류가 존재한다.

  • K5
  • K7
  • 그랜저
  • 아반떼

하지만 대부분의 자동차는 다음과 같은 공통 기능을 가지고 있다. 여기서는 추가 옵션 등은 제외하자.

  • 엔진
  • 시동
  • 바퀴
  • 와이퍼

이러한 공통 기능을 아래와 같이 Car라는 추상 클래스로 정의하면 각 자동차 클래스는 이를 상속하여 구현할 수 있다.

abstract class Car {
    startEngine()
    stopEngine()
    changeWheel()
}

 

추상화를 사용하는 이유

그렇다면 이 추상화를 왜 사용해야 할까?
추상화를 사용하는 가장 큰 이유는 유지보수와 코드 재사용성 때문이다.
예를 들어 자동차 시스템에 에어컨/히터라는 공통 기능이 추가되었다고 가정해 보자.

추상화가 없다면 개발자는 몇백개나 될지 모르는 모든 자동차 클래스를 찾아 수정해야 한다.
추상화가 적용되어 있다면 추상 클래스 한 곳만 수정하면 모든 클래스에 적용된다.

개인의 소규모 프로젝트에서는 이런 수정 사항의 경우 번거로움이 덜 할 수 있다. 확실하게 말할 수 있는 것은 이러한 구조는 대규모 프로젝트에서 특히 큰 효과를 발휘한다.

 

abstract class와 interface

추상화를 구현하는 방법은 두 가지가 있다.

abstract class Animal
  • 일부 메서드 구현 가능
  • 상속 사용 (extends)
interface Animal
  • 설계 중심 구조
  • 구현 클래스에서 구현 (implements)

 

 

마무리

추상화는 객체지향 프로그래밍에서 매우 중요한 개념이다.
공통적인 개념을 하나의 구조로 정의함으로써 코드의 중복을 줄이고 유지보수를 쉽게 만들 수 있다.

실무에서는 이러한 설계 구조가 프로젝트의 유지보수성과 개발 효율을 크게 좌우한다. 따라서 추상화의 개념을 정확하게 이해하는 것은 객체지향 프로그래밍을 배우는 데 매우 중요한 과정이라고 할 수 있다. 처음에는 조금 어려울 수 있지만 위와 같은 방식으로 공통 개념에 대한 구조를 잡는 것에 익숙해 지도록 하자.

 

반응형

댓글