본문 바로가기

Backend/JAVA

추상화(Abstract)

추상화란?

객체에서 공통된 속성과 행동을 추출하는 것이다.

자바에서 추상화를 이용하는 방법은 추상 클래스 또는 인터페이스가 있다.

추상 클래스(Abstract Class)

추상 메소드를 포함할 수 있는 클래스이다. abstract를 붙여 사용할 수 있다.

부모로서의 사용은 가능하지만 객체로서의 사용은 불가능하다.

추상 메소드(Abstract Method)

본체가 없는 메소드이다. 리턴 타입 앞에 abstract를 붙여 사용할 수 있다.

추상 메소드의 본체는 추상 클래스를 상속받은 후 재정의할 수 있다.

abstract class Animal{ // 추상클래스
    public abstract void eat(); //추상 메소드
    public abstract void sleep(); //추상 메소드
    public int bite(){ // 메소드
        System.out.println("물었다!");
        return 0;
    }
}
class Dog extends Animal{ // A를 상속받은 B
    @Override
    public void eat(){
        System.out.println("개가 먹는다");
    }
    @Override
    public void sleep(){
        System.out.println("개가 잔다");
    }
}
public class abstractTest{
    public static void main(String[] args) {
        Dog obj = new Dog();
        obj.eat(); // 개가 먹는다
        obj.sleep(); // 개가 잔다
        obj.bite(); // 물었다!

        // Animal obj2 = new Animal(); // error
    }
}

이 코드는 위의 사진을 설명하는 코드이다.

Animal이라는 클래스는 eat와 sleep라는 추상 메소드를 포함하기 때문에 추상 클래스이다.

Dog이라는 클래스는 추상 클래스 Animal을 상속 받고 있다.

그 후, Dog이라는 클래스에서 추상 메소드 eat과 sleep을 재정의 하고 있다.

→ 메인에서 Dog이라는 클래스의 eat과 sleep은 사용 가능하다.

→ 메인에서 Animal이라는 클래스의 eat과 sleep은 사용이 불가능하다. (추상 메소드이기 때문에)


인터페이스(Interface)

추상 메소드만을 가질 수 있다. 인터페이스를 상속 받는 클래스에서는 반드시 인터페이스 안의 메소드를 모두 구현해야한다.

주로 인터페이스를 구현한 객체들에 대해 동일한 동작을 약속하기 위해 사용된다.

interface Animal{ // 인터페이스
    public abstract void eat(); //추상 메소드
    public abstract void sleep(); //추상 메소드
}

class Dog implements Animal{ // A를 상속받은 B
    @Override
    public void eat(){
        System.out.println("개가 먹는다");
    }
    @Override
    public void sleep(){
        System.out.println("개가 잔다");
    }
}
public class interfaceTest{
    public static void main(String[] args) {
        Dog obj = new Dog();
        obj.eat(); // 개가 먹는다
        obj.sleep(); // 개가 잔다

        // Animal obj2 = new Animal(); // error
    }
}

인터페이스를 사용하는 방법은 인터페이스 이름 앞에 interface를 추가한다.

인터페이스를 상속 받을 때에는 extends 대신 implements를 사용한다.


추상 클래스와 인터페이스의 차이점

  • 메소드의 유형
    • 추상 클래스 : 추상 메소드(선택) + 일반 메소드
    • 인터페이스 : All 추상 메소드
  • 변수의 final의 여부
    • 추상 클래스 : X
    • 인터페이스 : 기본적으로 final을 붙임
  • 클래스인가?
    • 추상 클래스 : O
    • 인터페이스 : X
  • 목적
    • 추상 클래스 : 상속 받아 기능을 확장해나감
    • 인터페이스 : 구현 객체의 같은 동작 보장
  • 다중 상속
    • 추상 클래스 : 불가능
    • 인터페이스 : 가능

이외에도 차이점이 있다. 자세한건 참고문헌의 링크를 참고하면 된다.

추상화의 특징

  • 코드의 중복을 줄일 수 있다.
  • 유지 보수가 편리하다.

참고 문헌

Difference between Abstract Class and Interface in Java - GeeksforGeeks

자바 입문 - 추상클래스 | 프로그래머스