본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] 추상 클래스와 인터페이스

by GDNGY 2023. 4. 27.

11. 추상 클래스와 인터페이스

자바의 추상 클래스와 인터페이스는 코드의 재사용성과 유연성을 향상하는 객체 지향 프로그래밍의 중요한 개념입니다. 각각의 역할과 특징은 다음과 같습니다.

 

추상 클래스(Abstract Class)
  1. 추상 클래스는 완전한 기능을 가지지 않고 하나 이상의 추상 메소드(구현되지 않은 메서드)를 포함하는 클래스입니다.
  2. 추상 클래스는 인스턴스화 할 수 없으며, 상속을 통해 자식 클래스에서 구현해야 합니다.
  3. 추상 클래스는 일반 메소드와 변수를 포함할 수 있으며, 자식 클래스는 이를 상속받습니다.
  4. 자식 클래스는 추상 클래스의 모든 추상 메서드를 구현해야 하며, 그렇지 않으면 자식 클래스도 추상 클래스로 선언해야 합니다.
인터페이스(Interface)
  1. 인터페이스는 모든 메소드가 추상 메서드인 추상 타입입니다 (자바 8부터는 디폴트 메소드와 정적 메서드를 포함할 수 있습니다).
  2. 인터페이스는 상수만 포함할 수 있으며, 일반 변수는 허용되지 않습니다.
  3. 클래스는 여러 인터페이스를 동시에 구현할 수 있으며, 이를 통해 다중 상속을 지원합니다.
  4. 인터페이스는 인스턴스화 할 수 없으며, 클래스가 인터페이스를 구현해야 합니다.

추상 클래스와 인터페이스 모두 공통된 동작을 정의하고, 클래스에 특정 기능을 강제하거나 코드를 재사용하는데 도움을 줍니다. 선택의 기준은 다음과 같습니다.

  • 공통된 구현을 제공해야 하는 경우 추상 클래스를 사용합니다.
  • 구현 대신에 규약(명세)만 제공하려는 경우 인터페이스를 사용합니다.
  • 다중 상속이 필요한 경우 인터페이스를 사용합니다.

11.1. 추상 클래스 선언 및 사용

추상 클래스(abstract class)는 객체를 직접 생성할 수 없는 클래스로, 하나 이상의 추상 메소드(미구현 메서드)를 포함합니다. 추상 클래스는 상속을 통해 자식 클래스에서 구체화되어 사용되며, 일반 메서드와 인스턴스 변수도 포함할 수 있습니다.

 

abstract class Animal {
    String name;

  Animal(String name) {
        this.name = name;
    }

    abstract void sound();

    void introduce() {
        System.out.println("저는 " + 이름 + "입니다.");
    }
}

class Cat extends Animal {
 Cat(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println("야옹");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name);
    }

    @Override
    void sound() {
        System.out.println("멍멍");
    }
}

 

11.2. 추상 메서드

추상 메서드는 선언만 있고 구현 본체가 없는 메서드로,추상 클래스 내에서 선언되며, 자식 클래스에서 반드시 구현(오버라이딩)되어야 합니다.

abstract class Animal {
    abstract void SOUND();
}

추상 메서드는 인스턴스화된 객체에서 호출되어 동작을 수행하기 때문에, 자식 클래스에서 구현되지 않으면 객체 생성이 불가능합니다. 따라서 추상 메서드를 포함한 클래스를 상속받는 모든 자식 클래스는 추상 메소드를 오버라이딩해야 합니다.

 

11.3. 인터페이스의 활용

인터페이스(interface)는 추상 클래스와 유사하지만, 모든 메서드가 추상 메서드이고,인스턴스 변수를 가질 수 없습니다. 인터페이스는 다중 상속을 지원하며, 클래스가 구현할 수 있는 여러 행동의 "계약"을 정의하는 데 사용됩니다.

interface Animal {
    void sound();
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

class Dog implements Animal {
    @Override
    public void sound() {
        System.out.println("멍멍");
    }
}

인터페이스는 다른 인터페이스를 상속받을 수도 있으며, 클래스는 여러 인터페이스를 구현할 수 있습니다. 이를 통해 다양한 동작을 조합하여 사용할 수 있습니다.

 

11.4. 디폴트 메서드와 스태틱 메소드

자바 8부터 인터페이스에 디폴트 메소드와 스태틱 메서드를 추가할 수 있습니다. 디폴트 메서드는 인터페이스에 구현된 기본 메서드로,인터페이스를 변경하지 않고도 기능을 추가할 수 있습니다. 이를 통해 인터페이스를 구현하는 기존 클래스에 영향을 미치지 않고 새로운 기능을 제공할 수 있습니다.

interface Animal {
    void sound();

    default void walk() {
        System.out.println("걷는 중");
    }
}

스태틱 메서드는 인터페이스에서 직접 호출할 수 있는 메서드로,인스턴스를 생성하지 않고도 사용할 수 있습니다. 스태틱 메서드는 인터페이스와 관련된 유틸리티 기능을 제공하는 데 사용됩니다.

interface Animal{
    void sound();

    static void sleep() {
        System.out.println("잠자는 중");
    }
}

class Cat implements Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal.sleep(); // 스태틱 메소드 호출
    }
}

요약하면, 추상 클래스와 인터페이스는 객체지향 프로그래밍에서 중요한 역할을 하는 기능입니다. 추상 클래스는 클래스 계층 구조에서 공통 기능을 제공하는 상위 클래스로 사용되며, 인터페이스는 다중 상속을 지원하여 클래스가 구현할 수 있는 여러 행동을 정의하는 데 사용됩니다. 자바 8부터 인터페이스에 디폴트 메서드와 스태틱 메서드를 추가할 수 있어 인터페이스의 활용 범위가 더 넓어졌습니다.

반응형

댓글