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

해니·2024년 10월 21일
0

Java

목록 보기
22/34
post-thumbnail

추상클래스와 인터페이스


공통점

  • 하나 이상의 추상 메서드를 갖는다.
  • 인스턴스화 할 수 없다.
    • new 생성자를 사용할 수 없다.
  • 추상 클래스 혹은 인터페이스를 상속받아 구현한 구현체의 인스턴스를 사용해야 한다.
  • 인터페이스와 추상클래스를 구현, 상속한 클래스는 추상 메소드를 반드시 구현하여야 한다.

추상클래스

  • abstract 키워드를 사용한다.
  • extends 키워드로 상속시킨다.
  • 접근 제어자에 제한이 없다.
  • 다중 상속이 불가능하다.

인터페이스

  • interface 키워드를 사용한다.
  • implements 키워드로 구현한다.
  • 클래스에 다중 구현을 지원한다.
  • 인터페이스 끼리는 다중 상속 지원을 지원한다.
  • 내부의 모든 메서드는 public abstract 로 정의한다.
  • 내부의 모든 필드는 public static final 상수로 선언한다.

🧹 Java는 다중 상속을 지원하지 않는다. 부모를 하나만 선택할 수 있기 때문에, extends 대상은 하나만 선택할 수 있다. (부모가 또 부모를 가지는 것은 가능하다.)



추상클래스와 인터페이스 사용처

  • 각각 고유의 특징들 때문에 사용처가 달라지게 된다.

추상클래스 사용

중복 멤버 통합

  • 일반 클래스에서도 유요한 특징
  • 인터페이스에서는 상수만 정의할 수 있기 때문에, 중복 멤버 통합을 목적으로 사용할 수는 없다.

중복되는 메소드와 필드가 많은 경우

class Cat {
	String name;
	int age;
    
    void run(){
    	*/ ... /*
    }
}

class Dog {
	String name;
	int age;
    LocalDateTime walkingTime;
    
    void run(){
    	*/ ... /*
    }
    
    void takeAWalk(){
    	*/ ... /*
    }
}

중복되는 메소드와 필드를 통합한 경우

class Animal {
	String name;
	int age;
    
    abstract void run();	
}

class Cat extends Animal {

    void run(){
    	*/ ... /*
    }
    
}

class Dog extends Animal {
	LocalDateTime walkingTime;
    
    void run(){
    	*/ ... /*
    }
    
    void takeAWalk(){
    	*/ ... /*
    }
}



명확한 계층 구조

  • 클래스 끼리 명확한 계층 구조가 필요할때 추상 클래스를 사용한다.
    • 추상 클래스는 기능에 초점을 맞추기 보다는 개념의 구조적 표현에 초점이 맞춰져 있다.
  • 추상 클래스의 하위 클래스는 다른 클래스를 확장할 수 없고, 반드시 추상 클래스의 하위 클래스가 되어야 하므로 클래스 계층 구조의 is-a 관계의 근거가 명확해야 한다.
    ex ) '사각형은 확실히 도형인가?', '고양이는 확실히 동물인가?'라는 질문에 확실히 '그렇다'라고 답할 수 있어야 한다.

// 추상 클래스 (조상 클래스)
abstract class 생명체 {
}


// 추상 클래스 (부모 클래스)
abstract class 포유류 extends 생명체 {
}

abstract class 조류 extends 생명체 {
}

// 자식 클래스
class 사람 extends 포유류 {
}

class 참새 extends 조류 {
}

🫧 추상 클래스를 선택할 때에는 클래스 계층 구조가 명확하고 어떤 개념을 구조적으로 잘 표현할 수 있을 때 사용하는 것이 바람직하다.




인터페이스 사용


자유로운 관계 묶음

  • 서로 관련성이 없는 클래스들이더라도 같은 동작을 한다면 하나의 인터페이스로 묶을 수 있다.
    • 추상 클래스에 추상 메소드를 추가하면, 곧 이를 상속하는 모든 자손/자식 클래스에서 반드시 메소드를 구체화 해야하기 때문에, 해당 기능을 할 수 없는 경우에라도 강제적으로 메서드를 구현해야 하는 상황이 발생한다.
  • is able to 관계에서 인터페이스를 사용할 수 있다.
    ex) 사람 is able to 수영

인터페이스로 구현 전

// 추상 클래스 (조상 클래스)
abstract class 생명체 {
	abstract void 수영하다();
}


// 추상 클래스 (부모 클래스)
abstract class 포유류 extends 생명체 {
}

abstract class 조류 extends 생명체 {
}

// 자식 클래스
class 사람 extends 포유류 {
	abstract void 수영하다();
}

class 참새 extends 조류 {
	// 참새는 수영을 할 수 없지만, 상속 관계로 인해 강제적으로 메서드를 구현해야 한다.
	abstract void 수영하다(); 
}

인터페이스로 구현 후

// 추상 클래스 (조상 클래스)
abstract class 생명체 {
}


// 추상 클래스 (부모 클래스)
abstract class 포유류 extends 생명체 {
}

abstract class 조류 extends 생명체 {
}


// 인터페이스
interface 수영가능한 {
	void 수영하다();
}



// 자식 클래스
class 사람 extends 포유류 implements 수영가능한, 앞발사용가능한 {
    @Override
    public void 수영하다() {}
}

class 참새 extends 조류 {
}

다중 상속이 필요한 경우

// 추상 클래스 (조상 클래스)
abstract class 생명체 {
}


// 추상 클래스 (부모 클래스)
abstract class 포유류 extends 생명체 {
}

abstract class 조류 extends 생명체 {
}


// 인터페이스
interface 수영가능한 {
	void 수영하다();
}

interface 앞발사용가능한 {
	void 앞발을사용하다();
}

// 자식 클래스
class 사람 extends 포유류 implements 수영가능한, 앞발사용가능한 { // 다중 구현
    @Override
    public void 수영하다() {}
    @Override
    public void 앞발을사용하다() {}
    
}

class 참새 extends 조류 {
}

🫧 인터페이스는 일반적으로 계층 구조로 표현하기 힘든 개념이나 해당 클래스가 어떤 기능을 할 수 있는지 표현할 때 많이 사용한다.






출처

☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해
추상 클래스와 인터페이스 적재적소에 사용하기
[JAVA] 추상클래스와 인터페이스의 차이
[인프런 Java] 인터페이스 - 다중 구현

profile
💻 ⚾️ 🐻

0개의 댓글