Seeeni Tech Diary

[Java] 추상 클래스 & 인터페이스 본문

컴퓨터 언어/Java

[Java] 추상 클래스 & 인터페이스

seyeon0207 2024. 2. 18. 00:12

1. 추상 클래스

추상 클래스는 해당 클래스를 상속 받는 자손 클래스에서 반드시 재정의가 필요한 클래스이기 때문에 조상 클래스에서의 구현이 무의미하다. 상속전용 클래스라고 이해하면 된다. Java에서는 구현부가 없다는 의미로 조상 클래스 선언부에 abstract를 추가해야 한다.

 

abstract 클래스는 구현부가 없는 메소드가 존재하기 때문에 해당 클래스의 객체를 생성할 수 없고, 상속 받는 자손 클래스는 abstract 메소드를 재정의할 책임이 있다. abstract 클래스는 그 자체로 객체를 생성할 수 없지만 상속을 받는 자식 클래스를 참조하는 것은 가능하다.

 

public abstract class Building {
    private int floor, room;

    public void reportBuilding() {
        System.out.printf("건물: %s: 층수: %d, 방수: %d", this.getClass().getSimpleName(), floor, room);
    }
    
    public abstract void build();
}

 

위의 코드를 보면, Building은 추상 클래스로 선언이 되어 있고, 추상 메소드 build가 존재한다. 그렇다면 만약 Apt클래스가 이 Building클래스를 상속받는다면 build메소드를 반드시 재정의해야만 한다. 그렇게 만들어진 Apt 클래스는 밑 코드와 같이 Building메소드가 Apt의 부모 클래스로서 참조할 수 있다.

 

Building = new Apt();

 

추상 클래스의 존재 이유는 자손 클래스에게 구현을 강제함으로써 프로그램의 안정성을 향상하기 위함에 있다.


2. 인터페이스

추상 클래스와 비슷한 역할을 하는 것이 있는데, 바로 인터페이스다.

인터페이스도 구현부가 없기 때문에 해당 인터페이스를 사용하는 클래스에서 추상 메소드를 구현해야할 의무가 있다.

먼저 인터페이스가 어떤 형태로 구현되는지 알아보도록 하자.

 

 

1) 인터페이스 작성 방법

인터페이스는 최고 수준의 추상화 단계이며 인터페이스 내의 모든 메서드는 abstract메서드로 존재한다.

모든 클래스는 자동적으로 Object를 상속받게 되어있는데, 인터페이스는 클래스가 아니기 때문에 Object를 상속 받지 않는다.

 

인터페이스의 모든 멤버 변수는 public static final로 선언되며, 메서드는 public abstract로 선언된다. 그렇다면 인터페이스를 만들 때 항상 이렇게 선언을 해줘야할까? 그렇지 않다. 선언부에 앞에서 얘기한 부분을 생략하여도 멤버 변수는 public static final로, 메서드는 public abstract로 자동적으로 선언이 된다.

 

2) 인터페이스 상속 

인터페이스에서의 상속은 클래스와 마찬가지로 extends로 상속할 수 있다. 클래스에서는 단일 상속만 가능했던 것과는 달리 인터페이스는 다중 상속이 가능하다. 클래스에서 다중상속이 불가능했던 이유는 여러 부모 클래스에서 같은 선언부를 가진 메소드가 존재하게 될 때 충돌이 발생하기 때문인데, 인터페이스에서는 구현부가 존재하지 않아 같은 선언부를 가진 메소드를 가진다고 하여도 충돌이 발생하지 않기 때문이다. 참고로 추상 클래스는 인터페이스와는 달리 일반 메서드도 존재할 수 있다.

 

인터페이스는 클래스에서 사용할 때 implements 키워드를 사용하여 구현한다. 클래스에서 특정 인터페이스를 implements할 경우 해당 인터페이스에 있는 모든 abstract 메서드를 반드시 오버라이드하여 구현해야하고, 만약 구현하지 않을 경우에는 abstract 클래스라는 것을 표시하여 다음 자손에게 구현을 맡겨야 한다. 즉 구현하지 않은 인터페이스 메소드가 존재할 경우 해당 클래스는 그 자체로 객체로 만들 수 없는 추상 클래스가 되어야만 한다는 것이다.

 

 

3) 인터페이스의 필요성

인터페이스는 추상 클래스와 마찬가지로 구현의 강제로 인한 표준화 처리가 가능하고, 모듈 교체를 할 때 편하다는 것이 가장 큰 장점이다.

추상 클래스와 역할이 겹치는 것이 아닌가 하지만 인터페이스도 존재하는 이유는 서로 상속관계가 아닌 클래스들에게 인터페이스를 제공함으로써 관계를 부여하고 다형성을 확장할 수 있기 때문이다.

 

 

Comments