JAVA - 추상클래스(Abstract class)와 인터페이스(Interface)

이재원·2024년 11월 21일
0

JAVA

목록 보기
8/11

추상 클래스(Abstract class)

추상 클래스는 객체 생성이 불가능한 불완전한 형태로, 단지 상속시 상위 클래스로써 존재한다.

다만, 객체 할당 없이 참조변수 선언은 가능하다.

아래는 추상 클래스의 모습이다.

abstract class Shape {
	public void paint() { draw(); }
	abstract public void draw();
}

여기서 abstract 키워드를 사용한 메서드가 있는데 이를 추상 메서드라고 한다. 추상 메서드란 선언은 되어 있으나 코드가 구현되어 있지 않은 메서드이다.

public abstract String getName();
public abstract void setName(String s);

다시 추상클래스로 돌아와서 추상 클래스를 작성하는 이유는 설계와 구현을 분리하기 위해서이다. 비유하자면 추상 클래스에 목차를 정리해 두고 이 목차에 맞춰서 내용을 구성하는 것과 같다. 아래는 추상 클래스의 활용 예이다.

추상 클래스는 추상 메서드 없이도 작성 가능하다.

abstract class Animal {
    void makeSound() {
        System.out.println("Some generic animal sound");
    }
}

추상 메서드가 없는 추상 클래스는 공통된 메서드의 기본 구현을 제공하면서, 확장을 시키고 싶을 때 사용한다.

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Woof");
    }
}

public class Main {
    public static void main(String[] args) {
        // Animal animal = new Animal();  // 오류 발생: 추상 클래스는 인스턴스화할 수 없음
        Animal dog = new Dog();
        dog.makeSound();  // Woof 출력
    }
}

인터페이스(Interface)

인터페이스는 클래스와 클래스 간의 상호 작용의 규격을 나타낸 것이다. 기본적으로 일반 멤버 변수와 메서드를 갖지 못한다.

자바에서는 다중 상속을 지원하지 않지만 인터페이스는 다중 상속을 지원하기 때문에 설계와 구현을 분리하여 규격을 설정하기 좋다.

인터페이스는 추상 클래스와 같이 객체 생성이 불가능하다.(추상 클래스는 구현을 완료하면 객체 생성 가능)

인터페이스를 통해 다형성을 실현할 수 있다.

인터페이스의 정의

Java 7

  • 인터페이스는 상수와 추상 메서드로만 구성

Java 8

  • default 메서드 포함

Java 9

  • private 메서드 포함
  • static 메서드 포함(접근 지정자 생략시 public으로 지정)

인터페이스의 구현

인터페이스는 위에서 설명한대로 상수, 추상 메서드, 디폴트 메서드로만 구현 가능하다.

interface PhoneInterfaceEx {
	public static final int TIMEOUT = 10000; // public static final 생략 가능
	public abstract void sendCall(); // public abstract 생략
	public abstract void receiveCall();
	public default void printLogo() { // public 생략 가능
		System.out.println("Phone");
	}; // 디폴트 메서드 끝에 세미콜론(;) 작성
}

접근지정자를 지정하지 않은 경우 자동으로 public이 붙는다. 또한 인터페이스의 메서드는 추상 메서드가 기본이기 때문에 abstract 키워드를 생략해도 컴파일러에의해 자동으로 삽입된다.

구현은 implements 키워드를 통해 작성하며, 인터페이스에 작성된 모든 추상 메서드를 작성해줘야 합니다.

class SamsungPhone implements PhoneInterfaceEx {
	@Override
	public void sendCall() { ... }
	
	@Override
	public void receiveCall() { ... }
	
	public void flash() { ... } // 추가 메서드 작성
} 

또한 인터페이스끼리는 상속이 가능하다.

interface MobileInterfaceEx extends PhoneInterfaceEx { ... }

추상 클래스와 인터페이스의 비교

공통점:

  • 참조 변수로 사용 가능하지만 객체 생성 불가 (인스턴스화 불가).
  • 다형성을 지원하여 클래스 설계 시 유연성을 제공.

차이점:

  1. 추상 클래스:
    • 모든 형태의 멤버 포함 가능 (멤버 변수, public이 아닌 메서드 포함).
    • 단일 상속만 지원 (extends로 상속).
    • 일반 클래스처럼 필드와 메서드 구현을 가질 수 있음.
  2. 인터페이스:
    • 제한된 멤버만 포함 가능 (멤버 변수 불가, protected 멤버 불가).
    • 다중 상속 지원 (implements로 구현 가능).
    • 상수(public static final)와 추상 메서드만 포함, 자바 8 이후부터 defaultstatic 메서드 구현 가능.

출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이

profile
20학번 새내기^^(였음..)

0개의 댓글