글 작성자: 취업중인 피터팬
728x90
기본 환경
JDK : 1.8.0_261 버전
JRE : 1.8.0_261 버전
JAVA VERSION : 8 업데이트 261
Eclipse IDE VERSION : 2020-06버전

 

 

목표

컴퓨터와, 노트북, 테블릿피시로 상속으로 표현해보고 상속관계를 이해한다.

다음 게시물을 통해 상속과 소유 관계의 차이를 이해한다.


 

 

 

코드
package ex12inheritance;
/*
 Is-A 관계
 		: X Is a Y => X는 Y의 일종이다로 표현가능
 		-노트북은 컴퓨터의 일종이다.
 		-휴대폰은 전화기의 일종이다.
 		이와 같이 Is-A관계가 성립하는 객체를 상속으로 표현하기에 적합한다.
 */

/*
 컴퓨터를 표현 : 기본적인 검퓨팅 환경을 제공하여 입력된 내용을
 		계산한다.
 */

class Computer{
	String owner; //컴퓨터 소유주 이름
	
//	//기본 생성자
//	public Computer() {
//
//	}
	
	//생성자 메소드
	public Computer(String name) {
		owner = name;
	}
	
	/*
	 private 접근지정자로 선언된 맴버메소드는 외부클래스 혹은 
	 상속받은 클래스에서 접근이 불가능하므로, public으로 선언된
	 메소드를 통해서 간접 호출해야 한다.
	 상속관계라면 protected로 선언된 메소드로도 호출 할 수 있다.
	 */
	private void keyboardTouch() {
		System.out.println("키보드를 통해서 입력한 ");
	}
	
	private void calculate() {
		System.out.println("요청된 내용을 계산한다.");
	}
	/*
	 해당 메소드를 protected로 선언하면 상속관계의 하위 객체에서
	 호출 할 수 있다.
	 */
	public void calculateFunc() {
		keyboardTouch();
		calculate();
	}
	/*
	해당 메소드는 내부에서만 접근되므로 호출 순서를 지켜
	실행할 수 있도록 캡슐화 하여 정의하였다.
	 */
}

/*
 컴퓨터를 상속한 노트북 컴퓨터
 		: 컴퓨터가 가지고 있는 기본기능에 휴대이용 부분을 확장하여
 		정의함. 휴대이용을 위해 베터리 맴버변수가 추가됨.
 */
class NotebookComputer extends Computer{
	int battary;
	
	/*
	 부모 생성자 호출을 위해 사용하는 super()는 생략은 가능하지만
	 앞에 다른 문장이 먼저 오면 오류가 발생되므로 주의해야한다.
	 여기서는 부모의 인자생성자를 호출하고 있다.
	 */
	public NotebookComputer(String name, int initCharge) {
		/*
		 여기서 super()를 삭제하게 되면 에러가 발생한다.
		 부모 클래스에서 인자생성자를 정의하였기 때문에 기본 생성자는 
		 생성되지 않았기 때문이다.
		 */
		super(name);
		battary = initCharge;
	}
	
	//배터리 충전을 표현한 맴버메소드
	public void charging() {
		battary += 5;
	}
	
	//휴대하면서 컴퓨팅을 하는 것을 표현한 맴버메소드
	public void movigCal() {
		if(battary < 1) {
			System.out.println("배터리가 방전되어 사용불가");
			return;
		}
		System.out.println("이동하면서");
		
		/*
		 아래 메소드는 private으로 선언되었으므로 상속받은
		 자식 클래스에서도 접근은 불가능하다.
		 */
		//keyboardTouch();
		//calculate();
		
		calculateFunc();
		
		battary -= 1;
		
	}
}
/*
 태블릿 노트북 컴퓨터 : 컴퓨터의 기본 기능 및 휴대이용 기능 그리고 펜으로 드로잉
 				할 수 있는 기능까지 추가된 클래스
 */
class TableNotebook extends NotebookComputer{
	
	String regisPencil; //테블릿을 사용하기 위한 팬슬
	
	public TableNotebook(String name, int initCharge, String pen) {
		super(name, initCharge);
		regisPencil = pen;
	}
	
	//태블릿 사용을 위해 배터리양 체크 및 등록된 펜인지 확인
	public void write(String penInfo) {
		if(battary < 1) {
			System.out.println(" 베터리가 방전되서 사용 불가");
			return;
		}
		
		/*
		 A.compareTo(B) 
		 			: 문자열 A와 B를 비교하여 0이 반환되면 같은 문자열로 판단하고
		 			-1 혹은 1이 반환되면 서로 다른 문자열로 판단하는 String 클래스에
		 			정의된 메소드. 
		 */
		if(regisPencil.compareTo(penInfo) != 0) {
			System.out.println("등록된 팬이 아닙니다.");
			return;
		}
		movigCal();
		System.out.println("스크린에 펜으로 그림을 그리다.");
		battary -= 1;
		
	}
	
}

public class E04ISAInheritance {

	public static void main(String[] args) {
		
		NotebookComputer noteBook = new NotebookComputer("공유", 5);
		TableNotebook tablet = new TableNotebook("이동욱", 5, "ISE-1234");
		System.out.println("=======노트북컴퓨터 사용======");
		/*
		 베터리 소모되어 사용할 수 없는 상태가 되는지 확인하기 위해
		 movingCal()을 여러번 호출한다.
		 
		 */
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();
		noteBook.movigCal();

		System.out.println("==ISE-1234 펜으로 테블릿 사용 ==");
		tablet.write("ISE-1234");//정상 사용
		
		System.out.println("==XYZ-987 펜으로 테블릿 사용 ==");
		tablet.write("XYZ-987"); //사용 불가
	}

}

 

 

결과 값