728x90
반응형
세상에는 다양한 종류의 도형이 있습니다. 직사각형이나, 사다리꼴, 삼각형 등등 다양한 종류가 있고 이들은 모두 도형이라는 특징을 가지고 있습니다. 각 도형을 자바에서 구현하기 위해 Polygon 클래스를 부모로 상속한다고 가정해봅시다. 만약 각 도형의 넓이를 구하는 메서드를 Polygon 클래스에 구현해두면 각 도형에 맞는 넓이를 구할 수 없을 것입니다. 그렇다고 각 도형 클래스에 따로 정의하면 메서드 이름을 따로 기억해야하는 번거로움이 있을 것 입니다.
이러한 문제 상황을 해결하기 위해 만들어진 것이 추상 클래스와 인터페이스입니다. 비슷한 행위를 하는 각 클래스에 동일한 메서드를 강제로 구현하도록 하는 추상클래스를 배워봅시다. 또한 공통의 부모를 가지지 않지만 같은 행동을 강제해야하는 경우 사용하는 인터페이스도 배워봅시다.
📌 추상클래스
📚 추상 클래스 (Abstract Class)
- 추상 클래스 : 추상 메서드를 하나 이상 포함하는 클래스
- 하위 클래스들에게 동일 인터페이스를 강제하여 인터페이스의 표준을 제공
추상 클래스의 특징은 다음과 같습니다.
- 불완전한 형태이므로 이 클래스 타입의 객체 생성은 불가능
- 상속시 super 클래스로써 존재
- 객체 할당 없이 참조변수 선언은 가능
📚 추상 메서드 (Abstract Method)
- 구현할 메서드의 코드 없이 선언(인터페이스)만 정의함
- 추상 메서드를 일반 클래스가 포함하면 컴파일 오류 발생
- 추상 클래스는 보통 하나 이상의 추상 메서드를 포함
- 언젠가는 일반 클래스가 상속받아 추상 메서드를 오버라이딩 해주어야 객체 생성 가능
- 즉 추상 클래스를 상속받은 클래스에서 메서드를 재정의 해주어야 객체 생성을 할 수 있음
📚 추상 메서드와 추상 클래스의 구조
📃 추상 메서드의 구조
[접근제한] abstract <반환타입> <메서드명> ();
📃 추상 클래스의 구조
[접근제한] abstract class <클래스명> {
// 멤버 선언
}
📚 추상 클래스의 구현 및 활용 예
- Line, Rect, Circle은 추상 클래스 Shape를 상속받은 서브 클래스
- draw( ) 를 오버라디이하여 구현함
- Line, Rect, Circle은 오버라이딩 이후 자신만의 객체를 생성할 수 있으나, Shape는 불가능
- Shape의 역할은 강제로 자식 클래스가 특정 메서드를 재정의(오버라이딩)하도록 함
📚 추상 클래스의 사용
📃 상위 클래스
- 하위 클래스들 사이에 공통으로 필요한 메서드는 추상 클래스에 추가
- 같은 이름, 같은 동작이 필요 -> 일반 메서드
- 같은 이름, 다른 동작이 필요 -> 추상 메서드
📃 하위 클래스
- 개별적 작성이 필요한 메서드 작성
- 상위 클래스의 추상 메서드를 오버라이딩
I.4의 draw 메서드는 부모 레벨에서 증의하기 어렵고 각 클래스별로 동작해야하므로 구현하기 복잡합니다. 그러므로 자식 레벨에서 스스로 처리해야합니다. 추상 메서드를 통해 하위 클래스에서 메서드의 구현을 강제시키고 안전한 접근을 하도록 할 수 있습니다.
📌 인터페이스
📚 인터페이스 (Interface)
강아지, 고양이와 같은 동물들은 소리를 내고, 사람들과 곤충들, 식물들도 제각기 소리를 냅니다. 이들을 구현할 때 하나의 추상 클래스를 상속받도록 하면 굉장히 복잡해질 것입니다. 이렇게 공통의 부모를 가지지 않지만 같은 행동을 강제화 해야할 때 사용하는 것이 인터페이스입니다.
- 클래스와 클래스 간의 상호 작용의 규격을 나타낸 것
- 인터페이스는 필요한 메서드들의 이름, 매개변수에 대해 서로 합의하는 것
- 자바에서는 다중 상속이 지원되지 않기에 추가로 제공
- 인터페이스는 다중 상속이 가능
📚 인터페이스의 정의
[접근지정자] interface <인터페이스명> {
상수선언 // 무조건 public static final 로 선언됨
추상메서드 선언 // 무조건 public abstract로 선언됨
default 메서드 // 무조건 public으로 선언됨
}
interface PhoneInterface {
public static final TIMEOUT = 10000; //상수 필드, public static final 생략 가능
public abstract void sendCall(); // 추상 메서드, public abstract 생략 가능
public abstract void receiveCall(); // 추상 메서드, public abstract 생략 가능
public default void printLogo() { // default 메서드, public 생략 가능
System.out.println("** Phone 9**")
};
}
- PhoneInterface는 클래스가 아니므로 객체 생성 불가
- 인터페이스는 변수는 선언할 수 없음, 변수처럼 선언하더라도 상수 취급됨
- public 영역에 있는 온전한 몸체를 가진 메서드는 default 키워드를 이용함
📚 인터페이스의 사용
[abstract] class <클래스명> implements <인터페이스1>[, 인터페이스2 ... ] {
// 멤버 재정의
// 클래스가 추상 클래스가 아니라면 추상 메서드 재정의 필요
}
- 참조변수 선언은 가능하나 객체 생성은 불가
- 인터페이스에 정의된 내용을 넘겨받기 위해 '구현(implements)' 하여 사용
- 인터페이스는 클래스는 아니기에 '상속'이 아님
- 클래스 정의시 implements로 구현을 명시
- 추상 메서드들은 구현 받은 클래스에서 전부 오버라이딩 필요
📚 인터페이스의 사용 예
- Animal 인터페이스를 만들어서 소리나는 모든 객체에 대해 메서드 구현을 강제시킴
- Animal을 implements 하여,sound라는 추상 메서드가 제공됨, 재정의를 통해 클래스가 만들어질 수 있음
- 인터페이스로 참조 변수를 만들어 배열을 만들 수 있음
- 다운 캐스팅이 필요하지 않음
📚 인터페이스의 목적
- 인터페이스는 클래스들에게 스펙을 제시
- 각 클래스들이 그 기능을 다르게 구현할 수 있도록 클래스 규격을 선언
- 다형성 실현을 위한 도구
다음과 같은 상황에서 사용하는 것이 인터페이스입니다.
- 전화 거는 행위는 모두 같이 행동
- 같은 객체는 아니기에 상속으로 구현 불가
📚추상 클래스와 인터페이스의 비교
📃 공통점
- 참조변수 생성에는 사용 가능하나 객체 생성은 불가
- 다른 클래스 생성시에 관여함(extends, implements)
- 다형성을 실현하기 위한 목적
📃 차이점
1) 추상클래스
- 모든 형태의 멤버 포함 가능
- 멤버 변수, public이 아닌 메서드 등
- 일반 클래스와 마찬가지로 단일 상속만 지원
2) 인터페이스
- 제한된 멤버만 포함 가능
- 멤버 변수, protected 멤버 포함 불가
- 다중 상속 지원
반응형
'코딩언어 > JAVA' 카테고리의 다른 글
[JAVA] 13. 제네릭과 컬렉션 (0) | 2022.11.05 |
---|---|
[JAVA] 12. 예외처리 (0) | 2022.11.04 |
[JAVA] 10. 상속과 다형성 (0) | 2022.10.30 |
[JAVA] 09. 클래스 상속 (0) | 2022.10.24 |
[JAVA] 08. 배열 (0) | 2022.10.22 |