[추상 클래스] ( is a kind of ~ // ex. 사자 is a kind of 동물)
여러 자식들이 가지고 있는 공통된 속성을 뽑아서 하나의 클래스를 만들어 놓은 것.
하위 클래스에서도 상속을 통해 이 추상 클래스를 상속받아 객체를 구체화 한다.
1. 단일 상속을 지원
2. 변수를 가질 수 있다.
3. 하나 이상의 추상 메서드가 존재해야 한다.
4. 자식 클래스에서 상속을 통해 추상 메서드를 구현.
// 추상 클래스 //
abstract class Animal {
public String kind;
public abstract void sound();
}
// 추상 클래스 상속 //
class Dog extends Animal { // Animal 클래스로부터 상속
public Dog() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("멍멍");
}
}
// 추상 클래스 상속 //
class Cat extends Animal { // Animal 클래스로부터 상속
public Cat() {
this.kind = "포유류";
}
public void sound() { // 메서드 오버라이딩 -> 구현부 완성
System.out.println("야옹");
}
}
class DogExample {
public static void main(String[] args) throws Exception {
Animal dog = new Dog();
dog.sound();
Cat cat = new Cat();
cat.sound();
}
}
// 출력값
멍멍
야옹
추상 클래스 Animal의 추상 메서드 sound()를 상속 클래스에서 오버라이딩 하고 있음.
이렇듯 추상 클래스를 사용하면,
하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능하다.
[인터페이스]
추상 클래스를 설계가 모두 끝나지 않은 미완성 설계도라면,
인터페이스는 그보다 높은 추상성을 가지는 가장 기초적인 기본 설계도.
오로지 상수와 추상 메서드만 가질 수 있고 이것을 다른 객체가 구현한다.
> 매개체 관점
1. 다중 상속을 지원.
2. 변수는 final 상수만 가질 수 있음.
3. 모든 메서드는 시그니처만 존재한다.
4. 구현 클래스는 인터페이스에 선언된 모든 메서드를 오버라이딩 한다.
interface Animal { // 인터페이스 선언. public abstract 생략 가능.
public abstract void cry();
}
interface Pet {
void play();
}
class Dog implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
public void cry(){ // 메서드 오버라이딩
System.out.println("멍멍!");
}
public void play(){ // 메서드 오버라이딩
System.out.println("원반 던지기");
}
}
class Cat implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
public void cry(){
System.out.println("야옹~!");
}
public void play(){
System.out.println("쥐 잡기");
}
}
public class MultiInheritance {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
dog.cry();
dog.play();
cat.cry();
cat.play();
}
}
// 출력값
멍멍!
원반 던지기
야옹~!
쥐 잡기
인터페이스 Animal, Pet을 Dog, Cat 클래스에서 구현하여 사용하고 있음.
[인터페이스 vs 추상 클래스]
1. 다중 상속, 다중 구현 가능 유무
인터페이스 : 가능
추상 클래스 : 불가
2. 가질 수 있는 변수 종류
인터페이스 : 상수(final static)만 가능.
추상 클래스 : 제한 없음.
3. 상속, 구현 키워드 (extends or implements)
인터페이스 : implements
추상 클래스 : extends
4. 목적
인터페이스 : 구현하는 객체들이 같은 동작을 보장하기 위함
추상 클래스 : 상속을 통해 자식 클래스에서 완성하도록 유도하는 클래스.
[결론]
추상 클래스는 부모 클래스를 상속 받아 추상 메서드의 오버라이딩을 통해
부모 클래스의 기능을 하위 클래스로 확장하는 느낌이지만,
인터페이스는 다중 구현이 가능하므로
인터페이스의 추상 메서드를 각 클래스의 기능 목적에 맞게 기능을 구현하는 느낌이다.
추상 클래스 | 인터페이스 | |
사용 키워드 | abstract | interface |
사용 가능 변수 | 제한 없음 | ONLY static final (상수) |
사용 가능 접근 제어자 | 제한 없음 (public, private, protected, default) | public |
사용 가능 메서드 | 제한 없음 | abstract method, default method, static method, private method |
상속 키워드 | extends | implements |
다중 상속 가능 여부 | 불가능 | 가능 (클래스에 다중 구현, 인터페이스 끼리 다중 상속) |
공통점 | 1. 추상 메서드를 가지고 있어야 한다 2. 인스턴스화 할 수 없다. (new 생성자 사용 불가) 3. 추상 클래스 혹은 인터페이스를 상속 받아 구현한 구현체의 인스턴스를 사용해야 한다. 4. 추상 클래스와 인터페이스를 상속, 구현한 클래스는 추상 메서드를 구현해야 한다. |
'백엔드 기술 > Java' 카테고리의 다른 글
메서드 오버라이딩 VS 오버로딩 (0) | 2023.04.15 |
---|---|
OOP (객체지향 프로그래밍) 이란 ? (0) | 2023.04.15 |
클래스와 객체의 차이 (0) | 2023.04.12 |
Java 데이터 타입의 기본형 & 참조형 타입 (0) | 2023.04.12 |
JVM (Java Virtual Machine) ? (0) | 2023.04.08 |