본문 바로가기

Backend/Java

[Java] 추상 클래스 vs 인터페이스 and 추상 메서드

추상 클래스

- 상속에서 슈퍼 클래스로 사용된다.

- abstract 키워드를 작성한다.

- 추상 클래스가 되는 경우는 두 가지이다.

    1. 추상 메서드를 포함하는 클래스

    2. 추상 메서드를 포함하지 않는 클래스

- 추상 클래스는 객체를 생성할 수 없다.

- 추상 클래스를 상속받아, 추상 메서드를 구현하지 않으면 추상 클래스가 된다. 따라서 서브 클래스도 abstract로 선언해야한다.

- 서브 클래스에서 슈퍼 클래스의 추상 메서드 구현은 오버라이딩이다. => 서브 클래스는 추상 클래스가 아니다. 메서드 내용이 구현되었기 때문이다. 이때 서브 클래스는 추상 클래스가 아니므로 객체 생성이 가능하다.

- 추상 클래스는 추상 메서드를 통해서 서브 클래스가 구현할 메서드를 명료하게 알려주는 인터페이스의 역할을 수행한다. => 서브 클래스는 추상 메서드를 목적에 맞게 구현하는 다형성을 실현할 수 있다.

 

추상 메서드

- 추상 메서드를 가지고 있으면 반드시 추상 클래스로 선언되어야 한다.

 

인터페이스

- 인터페이스란 스펙을 주어 클래스들이 그 기능을 서로 다르게 구현할 수 있도록 하는 클래스의 규격 선언이며, 클래스의 다형성을 실현하는 도구이다.

- interface 키워드

- 멤버 변수(필드)를 만들 수 없다.

- 추상 메서드는 public abstract로 정해져있으며 생략될 수 있고, 다른 접근 지정으로 지정될 수 없다.

- default, private, static 메서드는 모두 인터페이스 내에 코드가 작성되어야 한다.

- default 메서드의 접근 지정은 public으로 고정되어 있다. 인터페이스를 구현하는 것이 목적이기 때문에 public을 사용해야 한다.

- default 메서드는 여러 번 작성 가능하다.

- private 메서드는 인터페이스 내에서만 호출 가능하다.

- static 메서드의 경우 접근 지정이 생략되면 public이며 private으로 지정될 수 있다.

- 인터페이스는 객체를 생성할 수 없다. (구현되지 않은 추상 메서드를 가질 수 있기 때문이다.)

- 인터페이스 타입의 레퍼런스 변수는 선언 가능하다. (객체 생성은 x)

 ex. AInterface a = new AInterface(); // 불가능

       AInterface a; // 가능

- 인터페이스는 다른 인터페이스를 상속할 수 있다.

- 인터페이스 구현: implements 키워드를 사용하여 인터페이스의 모든 추상 메서드를 구현한 클래스를 작성하는 것

- 인터페이스를 구현하면 모든 추상 메서드를 구현하고 일반 메서드 추가 작성이 가능하며 default 메서드는 작성 없이 그대로 물려받는다. 추상 메서드 오버라이딩이 필요하다.

- 클래스는 인터페이스를 상속받을 수 없고 인터페이스끼리만 상속이 가능하다.

- 인터페이스의 상속은 extends 키워드를 사용한다.

- 인터페이스의 다중 상속을 허용한다.

- 클래스는 하나 이상의 인터페이스를 구현할 수 있다. 콤마(,)로 구분하여 나열한다.

- 클래스에서 인터페이스의 메서드를 구현할 때 public을 생략하면 오류가 발생한다.

- 클래스를 상속 받으면서 동시에 인터페이스를 구현할 수 있다.

- 인터페이스도 일종의 추상 클래스이다.

 

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

- 객체를 생성할 수 없다.

- 상속이 가능하며 상속을 위한 슈퍼 클래스로만 사용된다.

- 클래스의 다형성을 실현하기 위한 목적이다.

- 추상 메서드를 구현하기 위해서는 오버라이딩이 필요하며 다형성이 적용된다.

비교 목적 구성
추상 클래스 추상 클래스는 서브 클래스에서 필요로 하는 대부분의 기능을 구현하여 두고 서브 클래스가 상속받아 활용할 수 있도록 하되, 서브 클래스에서 구현할 수밖에 없는 기능만을 추상 메서드로 선언하여, 서브 클래스에서 구현하도록 하는 목적(다형성) - 추상 메서드와 일반 메서드 모두 포함
- 상수, 변수 필드 모두 포함
인터페이스 이너페이스는 객체의 기능을 모두 공개한 표준화 문서와 같은 것으로, 개발자에게 인터페이스를 상속받는 클래스의 목적에 따라 인터페이스의 모든 추상 메서드를 만들도록 하는 목적(다형성) - 변수 필드(멤버 변수)는 포함하지 않음
- 상수, 추상 메서드, 일반 메서드, default 메서드, static 메서드 모두 포함
- protected 접근 지정 선언 불가
- 다중 상속 지원