Java:: 인터페이스와 추상화

suragryen·2024년 5월 9일

추상화👩🏻‍🔬

  • 공통의 속성이나 동작을 묶어서 상위수준의 개념을 형성하는 것(클래스간의 연관 관계를 구축하는것에 초점을 둔다)
  • 상속을 통해 추상화를 구현한다
  • ex) 포유류(추상화) → 고래, 강아지, 사람
  • 다중상속이 불가능하여 단일 상속만 가능함.

인터페이스👩🏻‍🔬

  • 인터페이스는 구현된 메서드가 없고 메서드의 시그니처만을 정의한다. 구현클래스에서는 인터페이스에서 정의한 메서드를 반드시 구현해야 함
  • 다중상속을 지원하므로, 여러 인터페이스의 기능을 클래스에서 사용할 수 있다.
  • 날 수 있는(Swimmable), 헤엄칠 수 있는(Flyable) 인터페이스:
    • 날 수 있는 동물과 헤엄칠 수 있는 동물은 서로 다른 특성을 가질 수 있습니다. 날 수 있는 동물은 날개를 가지고 있고, 헤엄칠 수 있는 동물은 지느러미를 가지고 있을 수 있습니다. 이러한 특성을 인터페이스로 정의할 수 있습니다. 클래스에서는 날 수 있는 인터페이스와 헤엄칠 수 있는 인터페이스를 구현하여 각 동물이 날 수 있는지, 헤엄칠 수 있는지 결정할 수 있습니다.
  • 부모, 자식 관계에 얽매이지 않고 공통 기능이 필요할 때 마다 추상 메서드를 정의해놓고 구현하는식으로 추상 클래스보다 자유롭게 뗐다 붙였다 가능.
  • 보통 xxxable 이런 형식으로 인터페이스의 네이밍 규칙을 따른다.

사용예시

동물 클래스

abstract class 동물 {
    abstract void 소리내기();
    abstract void 이동하기();
}

동물 인터페이스

interface 비행할수있는 {
    void 날기();
}

interface 수영할수있는 {
    void 헤엄치기();
}
classextends 동물 implements 비행할수있는 {
    void 소리내기() {
        System.out.println("짹짹");
    }
    
    void 이동하기() {
        System.out.println("날기");
    }

    void 날기() {
        System.out.println("날아다니다");
    }
}
  • 새 클래스에 동물을 extends하고 비행할 수 있는을 implements 해서 구현했다.
class 물고기 extends 동물 implements 수영할수있는 {
    void 소리내기() {
        System.out.println("물보다는 소리가 안나지요!");
    }
    
    void 이동하기() {
        System.out.println("헤엄치기");
    }

    void 헤엄치기() {
        System.out.println("헤엄치다");
    }
}
  • 물고기 클래스에 동물 클래스를 extends하고 수영할 수 있는을 implements 해서 구현함.

추상화

1)상속 받을 클래스들이 공통으로 가지는 메소드와 필드가 많아 중복 멤버 통합을 할 때

중복되는 멤버를 통합 해주는 기능은 본래 추상 클래스의 기능이라기 보단 그냥 클래스의 기능이라고 하는게 옳다.다만 같은 추상화 개념인 인터페이스와 차이점을 두기 위해, 상수 밖에 정의 못하는 인터페이스에서는 할 수 없는 기능이 추상 클래스 중복 멤버 통합이라고 보면 된다.

중복되는 멤버를 통합 해주는 기능은 본래 추상 클래스의 기능이라기 보단 그냥 클래스의 기능이라고 하는게 옳다.다만 같은 추상화 개념인 인터페이스와 차이점을 두기 위해, 상수 밖에 정의 못하는 인터페이스에서는 할 수 없는 기능이 추상 클래스 중복 멤버 통합이라고 보면 된다.

출처:

https://inpa.tistory.com/entry/JAVA-☕-인터페이스-vs-추상클래스-차이점-완벽-이해하기

[Inpa Dev 👨‍💻:티스토리]

class NewlecExam {
    int kor; // 중복되는 멤버
    int eng; // 중복되는 멤버
    int math; // 중복되는 멤버
    int com;

    void total(){} // 중복되는 멤버
    void avg(){} // 중복되는 멤버
}

class YBMExam{
    int kor; // 중복되는 멤버
    int eng; // 중복되는 멤버
    int math; // 중복되는 멤버
    int toeic;

    void total(){} // 중복되는 멤버
    void avg(){} // 중복되는 멤버
}

abstract class Exam {
    int kor;
    int eng;
    int math;

    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(){}
}
  • 멤버에 public 이외의 접근자(protected, private) 선언이 필요한 경우
  • non-static, non-final 필드 선언이 필요한 경우 (각 인스턴스에서 상태 변경을 위한 메소드가 필요한 경우)
  • 요구사항과 함께 구현 세부 정보의 일부 기능만 지정했을 때
  • 하위 클래스가 오버라이드하여 재정의하는 기능들을 공유하기 위한 상속 개념을 사용할 때
  • 추상 클래스는 이를 상속할 각 객체들의 공통점을 찾아 추상화시켜 놓은 것으로, 상속 관계를 타고 올라갔을 때 같은 부모 클래스를 상속하며 부모 클래스가 가진 기능들을 구현해야할 경우 사용한다.

profile
블로그 이사중 ☃︎

0개의 댓글