rhanziy

Java - 추상클래스와 인터페이스 본문

Java

Java - 추상클래스와 인터페이스

rhanziy 2023. 4. 10. 15:32

추상클래스와 인터페이스를 구현한 패키지 구조

 

 

추상 클래스(Abstract Class)는 추상 메서드를 선언해 놓고 상속을 통해 자식 클래스에서 메서드를 완성하도록 유도하는 클래스이다. 이러한 특성 탓에 미완성 설계도 라고 표현하기도 한다. 추상클래스는 상속을 위한 클래스이기 때문에 따로 인스턴스를 생성할 수 없다.

 

package Chap_08.camera;

public abstract class Camera {
	public void takePicture() {
		System.out.println("사진을 촬영합니다.");
	}
	
	public void recordVideo() {
		System.out.println("동영상을 녹화합니다.");
	}
	
	
	public abstract void showMainFeature(); // 구현해야하는 메소드
}

카메라 클래스에서 공통으로 사용할 메소드와, 자식클래스에서 구현해야 할 메소드를 정의한다.(showMainFeature())

카메라 클래스는 추상클래스이다. public abstract class Camera << 

 

public class FactoryCam extends Camera {

    @Override
	public void showMainFeature() {
		System.out.println("화재 감지");
	}
    
}

그럼 카메라 클래스를 extends한 자식 클래스 FactoryCam에서는 필수적으로 showMainFeature()를 오버라이딩해야함.

 

public class AbstractClass {
	public static void main(String[] args) {
		// 데이터 추상화(Data Abstraction)
		// abstract
		// 추상 클래스(아직 완성되지 않은 클래스)
		// 추상 메소드 (추상 클래스에서만 사용 가능한, 껍데기만 있는 메소드)
		
		// Camera camera = new Camera(); 추상클래스이기에 객체를 만들 수 없다.
		
		
		Camera factoryCam = new FactoryCam(); // 부모클래스 이름을 통해서도 관리 가능
		factoryCam.showMainFeature();
		factoryCam.takePicture();
		
	}
}

실행할 main메소드가 있는 클래스에서 확인해보면 추상클래스는 객체를 만들 수 없다.

대신 자식클래스에서 부모클래스에 정의해놓은 메소드들에 접근이 가능하다.

 

 


 

인터페이스는 추상 클래스보다 추상화 정도가 높아 추상 클래스와 다르게 구현부가 있는 일반메서드, 일반 변수 멤버 등을 가질 수 없다. 즉, 인터페이스는 구현된 게 아무것도 없는 기본 설계도라고 할 수 잇다. 인터페이스 또한 인스턴스를 생성할 수 없다. 다중 상속(구현)이 가능하다.

 

 

상속에 얽매히지 않는 인터페이스에 추상 메소드를 선언하고 이를 구현(implements) 하면서 자유로운 타입 묶음을 통해 추상화를 이루게 한다.

 

 

  • 추상 클래스 : 자식 클래스 is kind of 부모 클래스 
  • 인터페이스 : 자식 클래스 is able to 부모 인터페이스

 

package Chap_08.detector;

public interface Detectable {
	void detect();
}

인터페이스는 new Interface로 생성하고, 인터페이스의 모든 멤버 변수는 public static final, 즉 상수이다.

public static final은 자동으로 컴파일 시 생성되므로 생략가능.

인터페이스의 모든 메서드는 public abstract, 즉 추상 메서드이다. 마찬가지로 public abstract는 생략 가능하다.

 

인터페이스는 추상 클래스보다 상대적으로 자유로운 관계 묶음이 가능하다. 서로 관련성이 없는 클래스들이더라도 같은 동작을 한다면 하나의 인터페이스로 묶을 수 있다. 심지어 다중 상속도 가능하기 때문에 다양한 인터페이스를implements(구현)해서 기능을 구현할 수 있다.

 

is able to 관계에 있을 때 인터페이스를 사용할 수 있다. 이러한 이유 때문인지 인터페이스명은 ~able로 끝나는 경우가 많다. 어떤 기능 또는 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해서다.(Detectable)

 

 

public class FactoryCam extends Camera implements Detectable, Reportable {
	
	private Detectable detector;
	private Reportable reporter;
	

	public void setDetector(Detectable detector) {
		this.detector = detector;
	}

	public void setReporter(Reportable reporter) {
		this.reporter = reporter;
	}


	@Override
	public void showMainFeature() {
		// TODO Auto-generated method stub
		System.out.println("화재 감지");
	}

	@Override
	public void report() {
		// TODO Auto-generated method stub
		detector.detect();
	}

	@Override
	public void detect() {
		// TODO Auto-generated method stub
		reporter.report();
	} 
	
	
}

Camera클래스를 부모 클래스로 가지고있고, Detect/Report 기능이 있는 FactoryCam클래스의 코드

setters를 통해 정의된 다양한 기능을 조립해서 쓴다.

 

package Chap_08.detector;

public class AdvancedFireDetector implements Detectable {

	@Override
	public void detect() {
		// TODO Auto-generated method stub
		System.out.println("향상된 성능으로 화재를 감지합니다.");
	}

}


package Chap_08.reporter;

public class VideoReporter implements Reportable {

	@Override
	public void report() {
		// TODO Auto-generated method stub
		System.out.println("직전 30초 영상과 함께 신고를 진행합니다.");
	}

}

Detectable, Reportable인터페이스를 implements한 각 기능의 메소드들 코드. interface도 똑같이 오버라이딩을 통해 정의를 한다.

 

package Chap_08;

import Chap_08.camera.FactoryCam;
import Chap_08.detector.AdvancedFireDetector;
import Chap_08.detector.Detectable;
import Chap_08.detector.FireDetector;
import Chap_08.reporter.VideoReporter;

public class Interface {
	public static void main(String[] args) {
		// 인터페이스
	
		FactoryCam factoryCam = new FactoryCam();
		factoryCam.setDetector(advancedFireDetector);
		factoryCam.setReporter(videoReporter);
		
		
		factoryCam.detect();
		factoryCam.report();
		
	}
}

 

인터페이스 메인메소드에서 실행하는 코드.

 


 

  추상클래스 인터페이스
다중상속 X O
추상 메서드 0개이상 전부
일반 메서드 O X (Java8부터는 default, 정적메서드 구현 가능)
필드 일반변수, 상수 모두 가능 상수(static final)만 가능
상속 키워드 extends implements
접근제어자 제한 없음 public

인스턴스를 생성할 수 없다.

상속받은 클래스는 반드시 추상메서드를 구현해야 한다.

 

정리하자면 추상 클래스는 is kind of 관계로 관련성이 높은 명확한 계층 구조의 추상화에 사용되며, 인터페이스는 is able to 관계로 관련성이 낮더라도 기능에 따른 추상화가 필요하거나 다중 상속(구현)이 필요할 때 사용된다.

 

 

 

참고

https://code-lab1.tistory.com/287

 

'Java' 카테고리의 다른 글

Java - 제네릭 클래스  (0) 2023.04.11
Java - 제네릭스  (1) 2023.04.11
2023.04.06. 작은실습  (0) 2023.04.06
Java - Enum 열거형  (0) 2023.04.06
23.04.03. 작은 실습  (0) 2023.04.03
Comments