본문 바로가기
국비지원/JAVA

[JAVA] 12-2. 상속 (Inheritance)

by cosmog 2022. 10. 6.
반응형
상속 (Inheritance)
  • 기존 클래스를 확장하여 새로운 클래스를 이끌어낸다.(추상적인 이론)
  • 코드를 '재사용' 한다는 것이 키포인트
  • 아래와 같이 각 클래스의 중복되는 속성들을 하나의 클래스로 정의하고 그것을 부모 클래스로 하여 나머지 클래스들은 상속을 받아서 사용하면 중복되는 코드들을 줄일 수 있다.

아래와 같이 상속을 받지 않고 코드를 짜면 보기에는 편하지만 각각의 클래스에 중복된 코드들이 많이 있다.

상속을 사용하지 않은 코드 (중복된 코드들)

위 코드를 아래와 같이 중복된 속성은 Person Class에 정의 하고 그것을 상속받아서 사용한다면 중복된 코드들을 모두 삭제할 수 있다. (but, 관계에 복잡도는 발생한다. 부모와 자식간의 관계를 이해하여야 한다.)

extends를 사용하여 person class를 상속받았다.

student class에 age와 name은 없지만 Person class를 상속받았기때문에 해당 변수들도 사용가능하다.

Quiz - 상속을 사용하여 문제풀기

 

🔆 main클래스

package quiz03;

public class MainClass {

	public static void main(String[] args) {
		
		//Dmb폰 객체 생성
		DmbPhone dp = new DmbPhone("햅틱", "메탈그레이", 10);

		//Phone클래스에서 상속받은 멤버 변수에 접근
		System.out.println("모델: " + dp.model);
		System.out.println("색상: " + dp.color);
		//DmbPhone에서 선언한 멤버 변수에 접근
		System.out.println("채널: " + dp.channel);

		//Phone에서 상속받은 메서드 호출
		dp.powerOn();
		dp.ring();
		dp.sendVoice("여보세요??");
		dp.recieveVoice("안녕하세요? XX보험입니다.");
		dp.hangUp();

		//DmbPhone에서 선언한 메서드 호출
		dp.turnOnDmb(); //기능: TV를 켭니다 출력
		dp.changeChannel(7); //기능: channel변수를 전달받은 변수로 변경후 출력
		dp.turnOffDmb(); //기능: TV를 끕니다 출력
		dp.powerOff();

	}

}

🔆Phone(부모 클래스)

package quiz03;

public class Phone { //부모클래스
	
	String model;
	String color;
	int channel;
	
	void powerOn() {
		System.out.println("전원을 켭니다.");
	}
	
	void powerOff() {
		System.out.println("전원을 끕니다.");
	}
	
	void ring() {
		System.out.println("벨이 울립니다.");
	}
	
	void sendVoice(String message) {
		System.out.println("나: " + message);
	}
	
	void recieveVoice(String message) {
		System.out.println("상대방: " + message);
	}
	
	void hangUp() {
		System.out.println("전화를 끊습니다.");
	}
}

🔆DmbPhone(자식 클래스)

package quiz03;

public class DmbPhone extends Phone{
	//DmbPhone은 Phone클래스를 상속 받습니다.
	//channel 변수를 생성하고, color, model, channel을 초기화 하는 생성자를 작성하세요.
	//메인메서드가 정상적으로 실행되도록 메서드를 추가하세요.
	
	DmbPhone(String pModel, String pColor, int pChannel){
		model = pModel;
		color = pColor;
		channel = pChannel;
	}
	
	void turnOnDmb() {
		System.out.println("기능 : TV를 켭니다.");
	}
	
	int changeChannel(int pChannel) {
		channel = pChannel;
		System.out.println("채널이 "+channel+"번으로 변경되었습니다");
		return channel;
	}
	
	void turnOffDmb() {
		System.out.println("기능 : TV를 끕니다.");
	}

}

🔆결과값

모델: 햅틱
색상: 메탈그레이
채널: 10
전원을 켭니다.
벨이 울립니다.
나: 여보세요??
상대방: 안녕하세요? XX보험입니다.
전화를 끊습니다.
기능 : TV를 켭니다.
채널이 7번으로 변경되었습니다
기능 : TV를 끕니다.
전원을 끕니다.

 

Quiz - 상속을 사용하여 문제풀기2

 

🔆main클래스

package quiz04;

public class MainClass {
	
	public static void main(String[] args) {
		
		Wizard p1 = new Wizard("마법사법사");
		p1.info();
		p1.iceArrow();
		
		Warrior p2 = new Warrior("검사");
		p2.info();
		p2.bash();
		p2.bash();
		p2.bash();
		p2.bash();
		p2.bash();
		p2.bash();
		p2.bash();
	}

}

🔆 Player (부모클래스)

package quiz04;

public class Player {
	
	String name;
	int hp;
	int mp;

	void info() {
		System.out.println("====현재 상태===");
		System.out.println("캐릭명:" + name);
		System.out.println("hp:" + hp);
		System.out.println("mp:" + mp);
	}
}

🔆 Warrior (자식클래스)

package quiz04;

public class Warrior extends Player{
	//Player클래스로 상속관계를 만들어 주세요
	//전사는 생성될 때 ★이름만 매개변수로 받고, hp = 100, mp = 50이 됩니다.
	//전사는 강력한 bash()를 가지고 있습니다
	//bash()는 호출될떄마다 mp를 -10씩 감소시킵니다
	
	Warrior(String pName){
		name = pName;
		hp = 100;
		mp = 50;
	}
	
	void bash() {
		System.out.println("** bash 기술 사용으로 mp -10되었습니다 **");
		mp -= 10;
		info();
	}

}

🔆 Wizard (자식클래스)

package quiz04;

public class Wizard extends Player{
 	//Player클래스로 상속관계를 만들어 주세요
	//마법사는 생성될 때 ★이름만 매개변수로 받고, hp = 50, mp = 100이 됩니다.
	//마법사는 강력한 iceArrow()를 가지고 있습니다
	//iceArrow()는 호출될떄마다 mp를 -20씩 감소시킵니다
	
	Wizard(String pName){
		name = pName;
		hp = 50;
		mp = 100;
	}
	
	void iceArrow() {
		System.out.println("** iceArrow 기술 사용으로 mp -20되었습니다 **");
		mp -= 20;
		info();
	}

	
}

🔆 결과값

====현재 상태===
캐릭명:마법사법사
hp:50
mp:100
** iceArrow 기술 사용으로 mp -20되었습니다 **
====현재 상태===
캐릭명:마법사법사
hp:50
mp:80
====현재 상태===
캐릭명:검사
hp:100
mp:50
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:40
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:30
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:20
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:10
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:0
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:-10
** bash 기술 사용으로 mp -10되었습니다 **
====현재 상태===
캐릭명:검사
hp:100
mp:-20
반응형