ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 추상 클래스와 인터페이스의 개념 및 차이
    Java 2024. 5. 8. 08:32

    추상 클래스 (Abstract Class)

    • 주로 클래스들의 공통되는 필드와 메서드를 정의한 클래스이다.
    • 추상 메소드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이다.
    • 인스턴스를 직접 생성할 수 없고, 하위 클래스에 의해 확장 및 구현되어야 한다.
    • 추상클래스는 메서드의 선언만 있고 구현이 없는 추상 메서드를 포함할 수 있다.
    • 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다.

    추상 클래스의 특징

    • 추상 클래스는 클래스 앞에 abstract 키워드를 이용해서 정의한다.
    • 추상클래스는 미완성의 추상 메서드를 포함할 수 있다.
    • 추상 메소드란, 내용이 없는 메서드이다. 즉, 구현이 되지 않은 메서드이다.
    • 추상 클래스는 인스턴스를 생성할 수 없다, 자체적으로 객체를 생성할 수 없다.
    • 따라서, 상속을 통해 자식 클래스에서 인스턴스를 생성해야 한다.

    Ex)

    public abstract class (클래스명) {
    	public abstract void (메서드명)
    }

     

     

     

     

    추상 클래스를 상속받은 클래스는 추상 클래스가 갖고 있는 추상 메서드를 반드시 구현(Overriding) 해야 한다.

    추상 클래스를 상속받고, 추상 클래스가 갖고 있는 추상 메서드를 구현하지 않으면 해당 클래스도 추상 클래스가 된다.

     

    Ex)

    Public class (클래스명) extends (추상클래스명) {
    	@Override
        public void (메서드명)() {
        	---
        }
    }

     

     

     

     

    추상 클래스는 객체를 생성할 수 없다. 

     

    Ex)

    public class (추상 클래스명) { 
        public static void main(String[] args) {
            (추상 클래스를 상속받은 클래스) (추상 클래스를 상속받은 클래스) = new (추상 클래스를 상속받은 클래스)();
            (추상 클래스를 상속받은 클래스).(메서드명)();
            (추상 클래스를 상속받은 클래스).(메서드명)();
            
            // 추상 클래스는 인스턴스화 시킬 수 없다.
            //(추상 클래스명) (추상 클래스명) = new (추상클래스명)();
        }   
    }

     

     

     

    추상 클래스 사용 이유

     

    1. 공통 필드와 메소드 통일 목적

    • 공통적으로 작성되어야 하는 내용들이 생길 때 서로 다른 메서드 명이나 필드 명을 사용하게 된다면 유지보수 및 관리 등 문제가 발생하게 된다.
    • 따라서 추상클래스를 사용함으로써 공통된 내용들을 추출하여 통일된 내용으로 작성하도록 규격화하는 것이다.
    • 상속받은 클래스들은 자기 클래스의 필요한 메서드나 필드만 추가로 정의하고, 추상 메서드를 오버라이딩하여 클래스마다 다르게 실행될 로직을 작성해 주면 된다.
    • 따라서, 필드와 메서드 이름을 통일하여 유지보수성을 높이고 통일성을 유지할 수 있다.

    2. 실체 클래스 구현시, 시간절약

    • 실제 프로젝트에서 AA(Application Architecture)가 설계해 놓은. 추상 클래스를 상속받으면, 프로젝트에서 공통적으로 들어가야 하는 필드와 메서드가 오버라이딩 된다
    • 강제로 주어지는 필드와 메서드를 가지고 자신만의 스타일대로 구현하면 된다
    • 설계시간이 절약되고, 구현에만 집중할 수 있다.

    3. 객체지향적인 설계

    • 소스 수정시 다른 소스의 영향도를 적게 가져가면서 변화에는 유연하게 만들기 위해 추상클래스를 사용하기도 한다.
    • 추상클래스를 상속받아서 미리 정의된 공통 기능들을 구현하고, 실체클래스에서 필요한 기능들을 클래스별로 확장시킬 수 있다.
    • 추상 클래스를 상속받은 실체 클래스들 반드시 추상메서드를 재정의(Overriding)해서 실행 내용을 작성해야 한다.
    • 코드 수정 시, 영향도를 적게 가져가면서 유지보수성을 높일 수 있다.
    • 규격에 맞게 소스가 구현되어 있기 때문에 해당 규격에 대한 구현부만 수정하면 손쉽게 기능 수정이 가능하기 때문이다.

    인터페이스 ( interface )

    • interface 키워드를 사용하여 선언하는 인터페이스 상수(static final)와 추상 메서드(abstract method)의 집합이다.
    • 클래스와 다르게 다중상속 구현이 가능하다.
    • 인터페이스는 추상 클래스보다 추상화 정도가 높으며 추상 클래스와는 다르게 구현부가 있는 일반 메서드, 일반 멤버 변수를 가질 수 없다는 특징이 있다.
    • 인터페이스의 모든 메서드는 'public abstract'로 선언해야 하며, 이를 생략할 수 있다. 또한 모든 멤버 변수는 'public static final'으로 선언해야 하며, 마찬가지로 이를 생략할 수 있다 (생략할 수 있는 이유는 컴파일 시 자동으로 생성해 주기 때문이다.)

    Ex)

    interface (인터페이스명) {
    	...
        public static (상수이름) = (값);
        
        public abstract void 메서드이름();
        
        public default void 메서드이름() {};
    }

     

     

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

     

    • 추상 클래스는 extends(상속, 확장의 느낌) 키워드 그대로 자신의 기능들을 하위로 확장시키는 것으로 볼 수 있다.
    • 인터페이스는 implements(상속, 구현의 느낌) 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 동일한 기능으로 구현하는 것으로 볼 수 있다.
    • 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로 상속 관계를 타고 올라갔을 때, 같은 부모 클래스를 상속하며, 부모 클래스가 가진 기능들을 구현해야 하는 경우에 사용한다.
    • 반면 인터페이스는 상속 관계를 타고 올라갔을 때, 다른 부모 클래스를 상속하더라도 같은 기능이 필요한 경우에 사용된다.

     

    • 즉, 자바의 특성상 한 개의 클래스만 상속이 가능하기 때문에 해당 클래스의 구분을 추상 클래스 상속을 통해서 해결하고, 할 수 있는 공통된 기능들을 인터페이스의 다중 상속을 통해 구현한다.
    • 상위 클래스는 다중 상속이 불가능하기 때문에 하나의 클래스에서 하위 클래스에 물려줄 특성이 풍부할수록 좋고, 인터페이스는 다중 상속이 가능하기 때문에 각각의 인터페이스는 목적에 맞는 최소한의 메서드(구현을 강제할)를 선언하는 것이 좋다.

     

    Summary

    • 추상 메스드를 선언하여 상속을 통해서 자손 클래스에서 완성하도록 유도하는 클래스이며 상속을 위한 클래스이기 때문에 따로 객체를 생성할 수 없다
    • 인터페이스도 추상클래스처럼 다른 클래스를 작성하는데 도움을 주는 목적이다.
    • 클래스와 다르게 다중상속(구현)이 가능하다.
    • 한 개의 클래스만 상속이 가능하기 때문에 해당 클래스의 구분을 추상 클래스 상속을 통해서 해결
    • 공통된 기능들을 인터페이스의 다중 상속을 통해 구현한다.
kimjihoon