Java-객체지향 프로그래밍-추상화

추상화

객체지향 프로그래밍의 대표요소 중 다형성에 대해서 알아보자.
추상이란 “사물이나 표상을 어떤 성질·공통성·본질에 착안하여 그것을 추출하여 파악하는 것을 말한다.
자바에서 추상화의 핵심은 공통성과 본질을 추출하는 것 이라고 할 수 있다.
자동차를 예를들어 보자.
람보르기니와 포르쉐를 비교해보았을 때, 각각의 차에는 문, 바퀴, 창문, 핸들등 공통적인 요소를 가지고 있다.
람보르기니와 포르쉐는 서로 다른 모델이지만, 두 가지의 공통적인 요소들을 모으면 하나의 ‘자동차’라는 범주로 묶을 수 있다.
예시처럼 자동차라는 공통성과 본질을 추출하여, 정의하는 것을 추상화 라고 한다.

추상 클래스와 추상 메서드

추상클래스는 하나 이상의 추상 메서드를 포함하는 클래스를 가리켜 추상 클래스라고 한다.
추상클래스를 선언하기 위해서는 abstract키워드를 class키워드 앞에 선언하여 준다.
추상 메서드는 추상 클래스 내부에 abstract 키워드로 선언된 메서드이며 상위 클래스를 상속받는 하위 클래스는 상위 클래스(추상 클래스)가 가진 추상 메소드를 반드시 재 정의(Override)해야 한다.
이를 통해 각각의 하위 클래스는 상속받은 메서드를 하위 클래스의 객체에 필요한 구체적인 구현을 통해 메서드를 사용할 수 있다.

아래의 코드를 통해abstract를 이용한 추상클래스와 추상메서드 사용법을 알아보자.

public class AbstractExample {
    public static void main(String[] args) {
        Lamborghini lamborghini = new Lamborghini();
        Porsche porsche = new Porsche();
        lamborghini.run();
        porsche.run();
    }
}


abstract class Car{
    abstract void run();

    void powerOn(){
        System.out.println("시동이 걸렸습니다.");
    }

    void powerOff(){
        System.out.println("시동이 꺼졌습니다.");
    }
}

class Lamborghini extends Car{
    @Override
    void run(){ //상속받은 추상메서드를 반드시 구현
        System.out.println("시속 200km로 달립니다.");
    }
}

class Porsche extends Car{
    @Override
    void run(){ //상속받은 추상메서드를 반드시 구현
        System.out.println("시속 150km로 달립니다.");
    }
}

//출력
시속 200km로 달립니다.
시속 150km로 달립니다.
  • 추상클래스와 추상메서드는 abstract키워드를 이용해 선언할 수 있다.
  • 추상클래스를 상속받은 클래스는 상위클래스(추상클래스)에 선언된 추상메서드를 반드시 재 정의(Override) 해야한다.
  • 추상클래스 내에는 추상메서드 뿐만 아니라 필드와 정의된 메서드도 선언이 가능하다.
  • 추상메서드는 메서드명 만이 선언 가능하며, {}를 통한 구현이 불가하며, 반드시 상속받은 하위 클래스에서 구현해야한다.

인터페이스

인터페이스의 사전적 정의는 ‘서로 다른 두개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 점점이나 경계면을 의미’한다.
Java에서의 인터페이스는 추상클래스(abstract class)보다 더 추상화된 클래스로 다른클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개역할까지 담당한다.
Java의 클래스는 기본적으로 다중상속을 지원하지않지만, 인터페이스는 다중구현을 허용하여, 여러 클래스들이 인터페이스들의 메서드들을 구현하여, 사용할 수 있다.

그렇다면, 아래의 인터페이스 예제 코드를 살펴보자.

interface Car{
    public abstract void run();
}

class Lamborghini implements Car {
    @Override
    public void run(){
        System.out.println("시속 200km로 달립니다.");
    }
}

class Porsche implements Car {
    @Override
    public void run(){
        System.out.println("시속 150km로 달립니다.");
    }
}
  • 인터페이스는 interface키워드를 통해 선언이 가능하다.
  • 인터페이스를 구현하는 클래스에 implements키워드를 통하여 구현이 가능하다.
  • 인터페이스는 다중구현이 가능하다.
  • 인터페이스는 필드, 구체화된 메서드를 가질 수 없으며, 오직 추상메서드만을 가질 수 있다.
  • 인터페이스의 필드는 반드시 public static final이여 하며, 이를 생략할 수 있다.
  • 인터페이스의 메서드는 반드시 public abstract이며, 이를 생략할 수 있다.

abstract class와 인터페이스의 특징

  • 공통점
    • 추상 메서드를 가진다.
    • 객체 생성이 불가하다.
  • 차이점
    • 인터페이스
      • 상수, 추상 메서드만 가진다.
      • 다중구현을 지원한다.
    • 추상클래스
      • 클래스가 가지는 모든 속성과 기능을 가진다.
      • 단일 상속만 지원한다.

추상화의 이점

  • 메서드의 표준화를 통한 중복 코드 감소
  • 코드 간결화를 통한 생산성, 가독성증가와 에러 및 유지보수 시간 감소
  • 코드의 재사용성 증가