ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 인터페이스와 추상클래스 차이점
    Java 2023. 10. 10. 19:20

    * 인터페이스와 추상클래스는 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.

     

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

    • new 연산자로 인스턴스 생성 불가능
    • 사용하기 위해서는 하위 클래스에서 확장/구현이 필요

     

    인터페이스와 추상클래스 차이점

    • 가장 큰 차이점은 사용 목적에 중점을 두고 봐야한다.
    • 인터페이스
      • 다중상속이 가능
      • 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함
      • 모든 메소드가 추상 메소드로만 이루어져 있는 것
      • implements라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현
    • 추상클래스
      • 다중상속이 불가능
      • 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용
      • 클래스 내 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우
      • extends 키워드를 사용해 자신의 기능들을 하위 클래스로 확장

     

    추상클래스를 사용하는 경우

    • 상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할때
    • 멤버에 private, default, protected 접근자 선언이 필요한 경우
    • non-static, non-final 필드 선언이 필요한 경우 (인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
    • 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을때
    • 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
    • 객체의 공통점을 찾아 상속 관계를 타고 올라갔을 때, 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.
    abstract class Exam {
        /* 
        Exam 시험 클래스에서 공통적으로 보는 kor, eng, math 멤버 필드를
        상속(extends)을 통해 상위 클래스로 묶음
        */
        int kor;
        int eng;
        int math;
    
        /*
        메서드도 통합하며 추상화(abstract)를 해주면서 나중에
        다른 종류의 Exam 클래스를 추가/확장 하는데 있어 유연한 구조적인 객체 지향 설계
        */
        abstract void total();
        abstract void avg();
    }
    
    class NewlecExam extends Exam {
        int com;
    
        void total(){}
        void avg(){}
    }
    
    class YBMExam extends Exam {
        int toeic;
    
        void total(){}
        void avg(){}
    }

     

    인터페이스를 사용하는 경우

    • 어플리케이션의 기능을 정의해야 하지만 구현 방식이나 대상에 대해 추상화 할 때
    • 서로 관련성이 없는 클래스들을 묶어주고 싶을때 (자유롭게 / 형제 관계)
    • 다중 상속을 통한 추상화 설계를 해야할때
    • 특정 데이터 타입이 어디서 구현되는지 신경쓰지 않은 경우
    • 클래스와 별도로 구현 객체가 같은 동작을 한다는 것을 보장하기 위해
    abstract class Creature { }
    
    abstract class Animal extends Creature { }
    abstract class Fish extends Creature { }
    
    // 수영 동작 추상 메소드를 따로 인터페이스를 만들어 넣는다.
    interface Swimmable {
        void swimming();
    }
    
    class Tiger extends Animal { }
    class Parrot extends Animal { }
    
    // 인터페이스를 구현함으로써 동작이 필요한 클래스에만 따로 상속에 구애받지않고 묶음
    class People extends Animal implements Swimmable{
        @Override
        public void swimming() {}
    }
    
    // 인터페이스를 구현함으로써 동작이 필요한 클래스에만 따로 상속에 구애받지않고 묶음
    class Whale extends Fish implements Swimmable{
        @Override
        public void swimming() {}
    }
    • swimming 인터페이스를 추상메소드로 구현한다면, Creature 추상 클래스에 추상 메소드를 추가하고 이를 상속하는 모든 자손/자식 클래스에서 반드시 메소드를 구체화 해야한다는 규칙 때문에 실제로 수영을 못하는 호랑이(Tiger)와 앵무새(Parrot) 클래스에서도 메소드를 구현해야 하는 강제성이 생기게 된다.
    // 추상 클래스 (조상 클래스)
    abstract class Creature { 
    	abstract void swimming(); // 수영 동작을 하는 추상 메소드
    }
    
    // 추상 클래스 (부모 클래스)
    abstract class Animal extends Creature { }
    abstract class Fish extends Creature { }
    
    // 자식 클래스
    class Parrot extends Animal {
        // 앵무새는 수영을 할수 없지만 상속 관계로 인해 강제적으로 메소드를 구현해야하는 사태가 일어난다.
        void swimming() {} 
    }
    class Tiger extends Animal {
        // 호랑이는 수영을 할수 없지만 상속 관계로 인해 강제적으로 메소드를 구현해야하는 사태가 일어난다.
        void swimming() {} 
    }
    class People extends Animal {
    	void swimming() {
        	// ...
        } 
    }
    
    class Whale extends Fish {
    	void swimming() {
    		// ...
        } 
    }

     

     

    출처)

    https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-vs-%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4-%EC%B0%A8%EC%9D%B4%EC%A0%90-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#%EC%B6%94%EC%83%81%ED%81%B4%EB%9E%98%EC%8A%A4%EB%A5%BC_%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94_%EA%B2%BD%EC%9A%B0

Designed by Tistory.