[java] 추상 클래스와 인터페이스를 사용하여 언제 객체를 생성할 수 있는지

자바에서는 추상 클래스와 인터페이스를 사용하여 객체를 생성할 수 있는 상황에 제한을 둘 수 있습니다. 이를 통해 코드의 유연성과 확장성을 높일 수 있습니다. 아래에서는 추상 클래스와 인터페이스를 언제 사용하는지에 대해 알아보겠습니다.

추상 클래스(Abstract Class)

추상 클래스는 한 개 이상의 추상 메서드를 포함하는 클래스입니다. 추상 메서드는 구현 코드가 없는 메서드로, 자식 클래스에서 반드시 구현되어야 합니다. 추상 클래스는 다음과 같은 상황에서 객체 생성에 사용됩니다:

  1. 클래스 간의 관련성이 높고, 공통된 특성과 동작을 가지는 경우 추상 클래스를 사용합니다. 예를 들어, 동물 클래스에서 공통된 동작인 “움직이기”를 추상 메서드로 정의하고, 이를 상속받는 개와 고양이 클래스에서 구체적인 구현을 수행할 수 있습니다.
abstract class 동물 {
    abstract void 움직이기();
}

class  extends 동물 {
    void 움직이기() {
        System.out.println("네 다리로 걷기");
    }
}

class 고양이 extends 동물 {
    void 움직이기() {
        System.out.println("네 발로 걷기");
    }
}

동물  = new ();
.움직이기(); // 출력: 네 다리로 걷기

동물 고양이 = new 고양이();
고양이.움직이기(); // 출력: 네 발로 걷기
  1. 부분적으로 구현된 클래스로서 메서드 중 일부만 구현하고, 일부는 자식 클래스에서 구현하도록 하려는 경우 추상 클래스를 사용합니다. 이렇게 함으로써 자식 클래스의 구현이 보완될 수 있습니다.
abstract class 도형 {
    abstract void 그리기();
    
    void 크기변경() {
        // 구현 내용
    }
}

class  extends 도형 {
    void 그리기() {
        // 그리기 로직 구현
    }
}

도형  = new ();
.그리기(); // 원을 그립니다
.크기변경(); // 크기를 변경합니다

인터페이스(Interface)

인터페이스는 구현 코드를 가지지 않는 멤버(methods, properties, events)로만 구성된 형식입니다. 인터페이스는 다음과 같은 상황에서 객체 생성에 사용됩니다:

  1. 여러 클래스가 같은 동작을 가져야 하는 경우 인터페이스를 사용합니다. 이렇게 함으로써 다중 상속과 유사한 효과를 얻을 수 있습니다.
interface 비행 {
    void 날다();
}

class  implements 비행 {
    void 날다() {
        System.out.println("날개를 펄럭이며 날다");
    }
}

class 비행기 implements 비행 {
    void 날다() {
        System.out.println("엔진을 이용하여 날다");
    }
}

비행 새새 = new ();
새새.날다(); // 출력: 날개를 펄럭이며 날다

비행 비행기 = new 비행기();
비행기.날다(); // 출력: 엔진을 이용하여 날다
  1. 클래스와 완전히 다른 동작을 구현해야 하는 경우 인터페이스를 사용합니다. 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 동작을 구현해야 합니다.
interface 암호화 {
    void 암호화하기(String 데이터);
}

class AES암호화기 implements 암호화 {
    void 암호화하기(String 데이터) {
        // AES 암호화 로직 구현
    }
}

class MD5암호화기 implements 암호화 {
    void 암호화하기(String 데이터) {
        // MD5 암호화 로직 구현
    }
}

암호화 AES = new AES암호화기();
암호화 MD5 = new MD5암호화기();

추상 클래스와 인터페이스는 객체를 생성할 수 있는 다양한 상황에서 사용됩니다. 추상 클래스는 클래스 간에 상속 관계를 가지고 있고, 부분적으로 구현되어 사용될 때 적합합니다. 인터페이스는 클래스 간에 동작을 공유하거나 완전히 다른 동작을 구현할 때 사용됩니다. 상황에 맞게 적절한 선택을 하여 객체를 생성하는데 활용해 보세요.

참고 자료