추상화란?
객체에서 공통된 속성과 행동을 추출하는 것이다.
자바에서 추상화를 이용하는 방법은 추상 클래스 또는 인터페이스가 있다.
추상 클래스(Abstract Class)
추상 메소드를 포함할 수 있는 클래스이다. abstract
를 붙여 사용할 수 있다.
부모로서의 사용은 가능하지만 객체로서의 사용은 불가능하다.
추상 메소드(Abstract Method)
본체가 없는 메소드이다. 리턴 타입 앞에 abstract
를 붙여 사용할 수 있다.
추상 메소드의 본체는 추상 클래스를 상속받은 후 재정의할 수 있다.
abstract class Animal{ // 추상클래스
public abstract void eat(); //추상 메소드
public abstract void sleep(); //추상 메소드
public int bite(){ // 메소드
System.out.println("물었다!");
return 0;
}
}
class Dog extends Animal{ // A를 상속받은 B
@Override
public void eat(){
System.out.println("개가 먹는다");
}
@Override
public void sleep(){
System.out.println("개가 잔다");
}
}
public class abstractTest{
public static void main(String[] args) {
Dog obj = new Dog();
obj.eat(); // 개가 먹는다
obj.sleep(); // 개가 잔다
obj.bite(); // 물었다!
// Animal obj2 = new Animal(); // error
}
}
이 코드는 위의 사진을 설명하는 코드이다.
Animal이라는 클래스는 eat와 sleep라는 추상 메소드를 포함하기 때문에 추상 클래스이다.
Dog이라는 클래스는 추상 클래스 Animal을 상속 받고 있다.
그 후, Dog이라는 클래스에서 추상 메소드 eat과 sleep을 재정의 하고 있다.
→ 메인에서 Dog이라는 클래스의 eat과 sleep은 사용 가능하다.
→ 메인에서 Animal이라는 클래스의 eat과 sleep은 사용이 불가능하다. (추상 메소드이기 때문에)
인터페이스(Interface)
추상 메소드만을 가질 수 있다. 인터페이스를 상속 받는 클래스에서는 반드시 인터페이스 안의 메소드를 모두 구현해야한다.
주로 인터페이스를 구현한 객체들에 대해 동일한 동작을 약속하기 위해 사용된다.
interface Animal{ // 인터페이스
public abstract void eat(); //추상 메소드
public abstract void sleep(); //추상 메소드
}
class Dog implements Animal{ // A를 상속받은 B
@Override
public void eat(){
System.out.println("개가 먹는다");
}
@Override
public void sleep(){
System.out.println("개가 잔다");
}
}
public class interfaceTest{
public static void main(String[] args) {
Dog obj = new Dog();
obj.eat(); // 개가 먹는다
obj.sleep(); // 개가 잔다
// Animal obj2 = new Animal(); // error
}
}
인터페이스를 사용하는 방법은 인터페이스 이름 앞에 interface
를 추가한다.
인터페이스를 상속 받을 때에는 extends
대신 implements
를 사용한다.
추상 클래스와 인터페이스의 차이점
- 메소드의 유형
- 추상 클래스 : 추상 메소드(선택) + 일반 메소드
- 인터페이스 : All 추상 메소드
- 변수의 final의 여부
- 추상 클래스 : X
- 인터페이스 : 기본적으로 final을 붙임
- 클래스인가?
- 추상 클래스 : O
- 인터페이스 : X
- 목적
- 추상 클래스 : 상속 받아 기능을 확장해나감
- 인터페이스 : 구현 객체의 같은 동작 보장
- 다중 상속
- 추상 클래스 : 불가능
- 인터페이스 : 가능
이외에도 차이점이 있다. 자세한건 참고문헌의 링크를 참고하면 된다.
추상화의 특징
- 코드의 중복을 줄일 수 있다.
- 유지 보수가 편리하다.
참고 문헌
Difference between Abstract Class and Interface in Java - GeeksforGeeks