인터페이스와 추상 클래스

유경우·2024년 2월 20일
0

CS

목록 보기
9/21
post-custom-banner

들어가기 전

지난번 포스팅에서 OOP와 OOP의 5대 원칙에 대해 알아보았습니다.
그 과정에서 인터페이스라는 개념이 등장하였는데요.
이 인터페이스라는 개념이 등장 할 때 따라오는 개념이 추상 클래스입니다.
둘은 무슨 관계이길래 같이 언급되는 걸까요?

공통점

  1. 추상 메서드: 인터페이스와 추상 클래스 모두 하나 이상의 추상 메서드를 포함할 수 있으며, 이는 하위 클래스에서 반드시 구현해야 합니다.

    abstract class 클래스명{
    //어떤 기능을 수행할지 설명 기입
    abstract void 메서드명();
    }

  2. 인스턴스화 금지: 직접적으로 인스턴스를 생성할 수 없으며(new 생성자 X), 반드시 구현체나 하위 클래스를 통해 인스턴스를 생성해야 합니다.

  3. 다형성의 기반: 둘 다 다형성을 제공하는 기반이 됩니다.
    인터페이스나 추상 클래스 타입의 참조 변수를 사용하여 다양한 구현체나 하위 클래스의 인스턴스를 참조할 수 있습니다.

차이점

  1. 구현과 상속: 인터페이스는 implements 키워드를 사용하여 구현되며, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다. 추상 클래스는 extends 키워드를 사용하여 상속되며, 자바에서는 단일 상속만을 지원합니다.
인터페이스 
public string str implements strInterface () {} ...
추상클래스
public string str extends strAbstractClass () {} ...
  1. 메서드 구현: 인터페이스는 Java 8부터 기본 메서드와 정적 메서드를 포함할 수 있지만, 모든 메서드가 기본적으로 추상 메서드입니다. 추상 클래스는 추상 메서드와 함께 구현된 메서드도 포함할 수 있습니다.
interface Printable {
    // 추상 메서드
    void print();

    // 기본 메서드
    default void printTwice() {
        print();
        print();
    }

    // 정적 메서드
    static void printStatic() {
        System.out.println("Printing from Static Method.");
    }
  }

  class TextPrintable implements Printable {
        public void print() {
            System.out.println("Hello, World!");
        }
    }

  public class Main {
      public static void main(String[] args) {
          TextPrintable text = new TextPrintable();
          text.print();         // 출력: Hello, World!
          text.printTwice();    // 출력: Hello, World! Hello, World!
          Printable.printStatic(); // 출력: Printing from Static Method.
      }
  }
  1. 상태 저장: 추상 클래스는 필드를 통해 상태를 저장할 수 있지만, 인터페이스는 상태를 저장할 수 없습니다. 인터페이스는 상수(final 변수)만 포함할 수 있습니다.
abstract class Vehicle {
      protected int speed;  // 상태 저장

      Vehicle(int speed) {
          this.speed = speed;
      }

      // 추상 메서드
      abstract void accelerate();

      // 구현된 메서드
      void currentSpeed() {
          System.out.println("Current speed: " + speed + " km/h");
      }
  }

class Car extends Vehicle {
      Car(int speed) {
          super(speed);
      }

      void accelerate() {
          speed += 10;
          System.out.println("Accelerating car...");
      }
  }

public class Main {
      public static void main(String[] args) {
          Car myCar = new Car(50);
          myCar.currentSpeed();  // 출력: Current speed: 50 km/h
          myCar.accelerate();    // 출력: Accelerating car...
          myCar.currentSpeed();  // 출력: Current speed: 60 km/h
      }
  }

결론

인터페이스와 추상 클래스의 선택은 특정 상황과 설계 목표에 따라 달라집니다. 인터페이스는 다중 구현을 지원하고, 유연성이 더 필요한 경우에 적합합니다. 반면, 추상 클래스는 공통된 코드를 재사용하고 상태를 공유해야 할 때 유용합니다. 두 방식은 서로 배타적이지 않으며, 실제 프로젝트에서는 상황에 맞게 혼합하여 사용될 수 있습니다. 객체 지향 설계 원칙과 프로젝트의 요구 사항을 고려하여, 둘 중 하나 혹은 둘 다를 적절히 활용하여 설계의 유연성을 높이고, 코드의 재사용성을 증가시키는 것이 중요합니다.

###출처 : https://brunch.co.kr/@kd4/6
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
https://wildeveloperetrain.tistory.com/112
https://myjamong.tistory.com/150

profile
개발자
post-custom-banner

0개의 댓글