인터페이스와 추상 클래스

이원석·2022년 4월 25일
0

Java

목록 보기
6/9
post-thumbnail

1. 추상 클래스(Abstract Class)


1-1. 추상 메서드(Abstract method)

추상 메서드는 abstract 키워드와 함께 원형만 선언되며, 메서드 내의 코드는 작성되지 않습니다.

public abstract String test(); // 추상 메서드 (O)
public abstract String test2() { return "Fail"; } // 추상 메서드 (X)

추상 클래스란 abstract 키워드가 선언된 클래스입니다. 추상화 메서드를 최소 한 개 이상 가지고 있는 클래스의 경우에는 반드시 추상 클래스로 선언하여야 하며 추상 메서드가 없어도 추상 클래스를 선언할 수 있습니다.

추상 클래스를 선언하는 목적은 보통의 클래스들과 달리 객체를 통한 인스턴스 생성이 아니며, 상속을 위한 부모 클래스로 활용하기 위함입니다. 추상 클래스에 추상 메서드가 없더라도 객체로 생성할 수 없습니다.

추상 클래스의 메서드들은 모두 추상화된 원형만 선언되어 있으므로 추상 클래스를 상속 받은 서브(자식) 클래스는 반드시 슈퍼(부모) 클래스의 모든 추상 메소드에 대해 오버라이딩 하여 구현이 강제됩니다.(추상 메서드의 구현영역은 자식 클래스에게 책임을 위임)

한 마디로, 추상 클래스 상속하는 자식 클래스가 추상 메서드를 구현하여 그 기능을 확장하는게 목적입니다.



public abstract class MyAbstractClass {
    public abstract void myAbstractMethod();
    
    public static void myStaticMethod() {
        System.out.println("This is a static method.");
    }
}

또한, 추상 클래스는 추상 메서드를 선언 가능함과 동시에 정적 메서드를 선언할 수 있습니다. 추상 메서드는 자식 클래스에서 반드시 구현해야 하며, 정적 메서드는 클래스 이름으로 바로 접근할 수 있습니다. (추상 클래스를 상속받은 자식 클래스에서도 클래스 명을 통해 접근할 수 있습니다. 하지만 정적 메서드는 오버라이딩 할 수 없습니다)

따라서, 추상 클래스에서 정적 메서드를 선언하는 것은 권장되는 방식은 아니지만, 문법적으로는 가능합니다.




2. 인터페이스


인터페이스는 추상 메서드와 상수만을 포함해야 하며, interface 키워드를 사용하여 선언합니다. 인터페이스 내의 모든 메서드는 추상 메서드로서 abstract public 속성이 default, 상수는 pulibc static final 속성이 default입니다.인터페이스를 구현하기 위해서는 implements를 통해 상속받으며, 서브(자식) 클래스에서 추상 메서드를 모두 오버리이딩 하여 구현해야 합니다. 또한, 인터페이스를 상속받아 새로운 인터페이스를 만들 수 있습니다.

인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요할 때, 기능을 각각 구현할 필요가 있을 경우 사용합니다.


interface Phone { 
	int buttons = 20;
    (abstract public) void sendCall();
    abstract public void receivceCall();
}

class SmartPhone implements Phone {
	public void sendCall() { ... }
    public void receiveCall() { ... }
    
    // 다른 메서드를 추가 작성
    public int getButtons() {
    	return this.buttons;
    }
}




3. 추상 클래스와 인터페이스


3-1. 공통점

  1. 추상 클래스나 인터페이스 둘다 객체를 생성할 수 없다. (인스턴스 생성 또한 불가능)
  2. 둘다 상속을 통한 자식 클래스에서의 구현이 목적이기 때문에 메서드의 원형만 선언을 한다.
  3. 두 방법 모두 추상화(abstraction)을 구현하는 방법입니다.

3-2. 차이점

  1. 서로 다른 목적을 가지고 있다.
    1-1. 추상 클래스는 추상 메서드를 자식 클래스가 오버라이딩하여 그 기능을 확장하는데에 목적이 있다. (상속을 위한 부모 클래스 - 전체적인 설계도 역활)
    1-2. 인터페이스는 서로 관련없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용한다. (구현 객체의 같은 동작을 보장)

  2. 추상 클래스는 클래스이지만 인터페이스는 아니다.
  3. 추상 클래스는 단일 상속이지만 인터페이스는 다중 상속을 지원한다.
  4. 추상 클래스는 "is a kind of" (상속받는 자식 클래스는 추상 클래스의 한 종류)
  5. 인터페이스는 "can do this" (상속받는 자식 클래스는 인터페이스의 기능이 필요)

  6. 구현 방법: 추상 클래스는 일반 클래스와 마찬가지로 필드, 생성자, 일반 메서드, 추상 메서드를 가질 수 있습니다. 반면에 인터페이스는 추상 메서드와 상수(constant)만을 가질 수 있습니다.

  7. 다중 상속: 추상 클래스는 다른 클래스를 상속할 수 있으며, 인터페이스는 다른 인터페이스만을 상속할 수 있습니다. 자바에서는 다중 상속을 지원하지 않기 때문에, 클래스는 하나의 추상 클래스만 상속할 수 있습니다. 그러나 인터페이스는 다중 구현(multiple implementation)을 지원하기 때문에, 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.

  8. 접근 제어: 추상 클래스의 필드와 메서드는 접근 제어자(access modifier)를 사용하여 접근 범위를 설정할 수 있지만, 인터페이스는 모든 필드와 메서드가 public으로 선언되며, 접근 제어자를 사용할 수 없습니다.

  9. 목적: 추상 클래스는 클래스 간의 상속 관계를 이용하여 공통된 기능을 구현하고, 확장성을 높일 수 있도록 하는 것이 주 목적입니다. 반면에 인터페이스는 서로 관련이 없는 클래스들 간에 공통점을 정의하여, 다형성을 구현하고, 코드의 재사용성을 높이는 것이 주 목적입니다.




따라서, 추상 클래스와 인터페이스는 모두 상속과 다형성(polymorphism)을 구현하기 위해 사용됩니다. 그러나 각각의 목적과 특성이 다르기 때문에 어떤 상황에서는 추상 클래스를, 또 다른 상황에서는 인터페이스를 사용해야 할 수 있습니다.

추상 클래스는 인스턴스를 생성할 수 없지만, 클래스의 일반 메서드와 추상 메서드를 모두 포함할 수 있습니다. 이는 추상 클래스를 이용하여 추상적인 개념을 나타내고, 이를 구체적인 클래스에서 구현하도록 하는 데 사용됩니다. 즉, 추상 클래스는 상속을 통해 자식 클래스에서 구현할 메서드의 목록을 정의하고, 구현하도록 강제할 수 있습니다.

인터페이스는 메서드의 목록만을 가질 수 있으며, 이 메서드들은 모두 추상 메서드입니다. 또한, 인터페이스는 필드를 가질 수 없고, 모든 메서드는 public으로 선언됩니다. 인터페이스는 구현 객체의 행동을 규정하는데 사용됩니다. 구현 객체는 인터페이스에서 정의된 모든 메서드를 구현하여야 하며, 이를 통해 다형성을 구현할 수 있습니다.





[참고문헌]
https://pathas.tistory.com/137
https://github.com/WeareSoft/tech-interview/blob/master/contents/java.md

0개의 댓글