본문 바로가기

국비교육/국비교육 복습

day12_oop.inherit5 : 상속받은 클래스로부터 다시 상속을 받는 경우 + 접근제한 protected (★)

다음 요구사항에 맞게 클래스 구조를 설계하고 객체 생성 후 가진 모든 기능을 실행하는 코드를 작성

요구사항

  • 각종 파일들을 유형별로 구현
    • MP3
      • 파일명을 가지고 있어야 한다(fileName)
      • 파일크기를 가지고 있어야 한다(fileSize)
      • 재생시간을 초단위로 가지고 있어야 한다(duration)
      • 실행 기능을 가지고 있어야 한다(execute)
      • 빨리감기 기능을 가지고 있어야 한다(forward)
      • 되감기 기능을 가지고 있어야 한다(rewind)
    • AVI
      • 파일명을 가지고 있어야 한다(fileName)
      • 파일크기를 가지고 있어야 한다(fileSize)
      • 재생속도를 가지고 있어야 한다(speed)
      • 실행 기능을 가지고 있어야 한다(execute)
      • 빨리감기 기능을 가지고 있어야 한다(forward)
      • 되감기 기능을 가지고 있어야 한다(rewind)
    • PPT
      • 파일명을 가지고 있어야 한다(fileName)
      • 파일크기를 가지고 있어야 한다(fileSize)
      • 프레젠테이션 페이지 수를 가지고 있어야 한다(pageSize)
      • 실행 기능을 가지고 있어야 한다(execute)
      • 파일 정보 확인 기능을 가지고 있어야 한다(information)
  • 모든 기능들은 실행 시 간단한 텍스트 메세지가 출력되어야 한다
    • 예를 들어 MP3의 빨리감기 기능을 실행하면 "빨리감기 실행"과 같은 메세지가 출력되어야 한다.
  • 모든 유형별 파일들을 객체 생성하고 보유한 기능들을 실행하세요

 

** 분석

1) 슈퍼 클래스의 멤버필드는 fileName, fileSize이며 메소드는 execute()이다

2) MP3 클래스와 AVI 클래스는 모두 forward()와 rewind() 메소드를 가진다

3) forward()와 rewind() 메소드를 갖는 Media 클래스를 만들어 MP3 클래스와 AVI 클래스에 상속한다 

4) MP3 클래스의 고유 멤버필드는 duration

    AVI 클래스의 고유 멤버필드는 speed

    PPT 클래스의 고유 멤버필드는 pageSize, 메소드는 information()

 

 

File 클래스 (슈퍼 클래스)

package day12_oop.inherit5;

// 슈퍼 클래스
public class File {

	// 멤버 필드
	protected String fileName;		// 상속관계인 클래스에서만 호출할 수 있도록 protected로 설정
	protected long fileSize;
	
	// getter & setter
	public String getFileName() {
		return this.fileName;
	}
	
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	
	public long getFileSize() {
		return this.fileSize;
	}
	
	public void setFileSize(long fileSize) {
		if(fileSize < 0) {	// 파일 크기는 0보다 작을 수 없다
			return;
		}
		this.fileSize = fileSize;
	}
	
	// 생성자 - 파일명(fileName)은 무조건 입력하도록
	public File(String fileName){
		this.setFileName(fileName);
	}
	
	// 메소드
	public void execute() {
		System.out.println(this.fileName + " 실행");
	}
}

 

- 슈퍼 클래스의 필드를 서브 클래스에 상속하려면 접근제한을 protected로 설정해야 한다

 

Media 클래스

package day12_oop.inherit5;

public class Media extends File {
	
	// 멤버 필드
	
	// 생성자
	Media(String fileName) {
		super(fileName);
	}

	// 메소드
	public void forward() {
		System.out.println("빨리감기");
	}
	
	public void rewind() {
		System.out.println("되감기");
	}
}

 

MP3 클래스

package day12_oop.inherit5;

public class MP3 extends Media {

	// 멤버 필드
	private int duration;
	
	// getter & setter
	public int getDuration() {
		return this.duration;
	}
	
	public void setDuration(int duration) {
		if(duration < 0) {	// 재생 시간은 0보다 작을 수 없다
			return;
		}
		this.duration = duration;
	}
	
	// 생성자 - 파일명(fileName)만 입력하는 경우, 파일크기(fileSize)나 재생시간(duration)은 자료형의 기본값으로 설정
	public MP3(String fileName) {
		super(fileName);
	}
	
	// 생성자 - 파일명(fileName), 파일크기(fileSize), 재생시간(duration)을 입력하는 경우
	public MP3(String fileName, long fileSize, int duration) {
		super(fileName);
		this.setFileSize(fileSize);
		this.setDuration(duration);
	}
	
	// 메소드
}

 

AVI 클래스

package day12_oop.inherit5;

public class AVI extends Media {

	// 멤버 필드
	private double speed;
	
	// getter & setter
	public double getSpeed() {
		return this.speed;
	}
	
	public void setSpeed(double speed) {
		if(speed < 0) {		// 재생 속도는 0보다 작을 수 없다
			return;
		}
		this.speed = speed;
	}
	
	// 생성자 - 재생 속도(speed)를 입력하지 않을 경우 자동으로 x1이 되도록
	public AVI(String fileName, long fileSize){
		super(fileName);
		this.setFileSize(fileSize);
		this.setSpeed(1);
	}
	
	// 생성자 - 재생 속도(speed)를 직접 입력할 수 있도록
	public AVI(String fileName, long fileSize, double speed) {
		super(fileName);
		this.setFileSize(fileSize);
		this.setSpeed(speed);
	}
	
	// 메소드
}

 

PPT 클래스

package day12_oop.inherit5;

public class PPT extends File {
	
	// 멤버 필드
	private long pageSize;
	
	// getter & setter
	public long getPageSize() {
		return this.pageSize;
	}
	
	public void setPageSize(long pageSize) {
		if(pageSize < 0) {	// 페이지 수는 0보다 작을 수 없다
			return;
		}
		this.pageSize = pageSize;
	}
	
	// 생성자 - 페이지 수(pageSize)를 입력하지 않으면 자동으로 1이 되도록
	public PPT(String fileName, long fileSize) {
		this(fileName, fileSize, 1);
	}
	
	// 생성자 - 페이지 수(pageSize)를 입력하는 경우
	public PPT(String fileName, long fileSize, long pageSize) {
		super(fileName);
		this.setFileSize(fileSize);
		this.setPageSize(pageSize);
	}
	
	// 메소드
	public void information() {
		System.out.println("<파일 정보>");
		System.out.println("파일명 : " + super.fileName);
		System.out.println("파일 크기 : " + super.fileSize + " bytes");
		System.out.println("페이지 수 : " + this.pageSize);
	}
}

- PPT의 메소드를 작성하기 위해 슈퍼 클래스의 멤버필드 fileName, fileSize를 상속받기 위해서

  슈퍼 클래스의 해당 멤버필드의 접근 제한이 protected(상속 클래스 내에서만 접근 허용)이 되어 있어야 한다 

  (슈퍼 클래스의 멤버필드나 메소드의 접근 제한이 private라면 해당 멤버필드나 메소드는 상속을 할 수 없다)

 

** 생성자 오버로딩시 발생하는 문제점?

** Recursive constructor invocation PPT(String, long, long) 오류? (재귀 생성자 호출 오류??)

public PPT(String fileName, long fileSize) {
	this(fileName, fileSize, 1);
}
	
public PPT(String fileName, long fileSize, long pageSize) {
	this(fileName, fileSize, pageSize);
}

 

메인 메소드

package day12_oop.inherit5;

public class Test01 {

	public static void main(String[] args) {
		
		// 객체 생성
		MP3 a = new MP3("MP3파일", 1L*1024L*1024L, 180);
		AVI b = new AVI("AVI파일", 100L*1024*1024);
		PPT c = new PPT("PPT파일", 5L*1024L*1024L, 25);
		
		// 기능 출력
		a.execute();
		a.forward();
		a.rewind();
		
		b.execute();
		b.forward();
		b.rewind();
		
		c.execute();
		c.information();
	}
}