추상 클래스
- 상속에서 슈퍼 클래스로 사용된다.
- 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 접근 지정 선언 불가 - 다중 상속 지원 |
'Backend > Java' 카테고리의 다른 글
[Java] String toString() 메서드, Scanner (0) | 2023.06.08 |
---|---|
[Java] equals()와 ==의 차이 (0) | 2023.06.08 |
[Java] 오버라이딩 vs 오버로딩 (0) | 2023.06.08 |
[Java] 슈퍼 클래스 생성자, 캐스팅, 업캐스팅, 다운캐스팅 (0) | 2023.05.24 |
[Java] 메소드 (0) | 2023.05.22 |