본문 바로가기
Coding/JAVA

[혼공자바_07 상속] 예제 연습

by 찡콩찡 2022. 4. 27.
상속
자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정,
선택된 부모 클래스는 extends 뒤에 기술
class 자식클래스 extends 부모클래스 {
  // 필드
  // 생성자
  // 메소드
}

 

상속의 특징

  • extends 뒤에는 단 하나의 부모 클래스만 와야 한다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외
  • 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상 제외

 

Q1 . 핸드폰(CellPhone) 클래스를 상속해서 DMB(DmbCellPhone) 클래스를 작성하라. 

부모 클래스
package Inheritance;

//부모 클래스
public class CellPhone {
	//필드
	String model;
	String color;
	
	//생성자 
	public CellPhone() {
		System.out.println("CellPhone() 호출됨");
	}
	
	//메소드 
	void powerOn() {System.out.println("전원을 켭니다.");}
	void powerOff() {System.out.println("전원을 끕니다.");}
	void bell() {System.out.println("벨이 울립니다.");}
	void sendVoice(String message) {System.out.println("자기 :" + message);}
	void receiveVoice(String message) {System.out.println("상대방 : "+ message);}
	void hangup() {System.out.println("전화를 끊습니다.");}
	
}
자식 클래스
package Inheritance;
//자식 클래스
public class DmbcellPhone extends CellPhone {
	//필드
	int channel; //채널정보를 담아야 하므로 
	
	//생성자
	DmbcellPhone(String model, String color, int channel) { //매개변수
		super(); //작성하지 않아도 컴파일러는 자식클래스를 컴파일러할 때 이 super을 넣어준다. 
		this.model =model;    //this 선언: 현재 이 객체가 가지고 있는 멤버에 접근하겠다는 의미
		this.color =color;   //CellPhone 클래스로부터 상속받은 필드 
		this.channel = channel;
	}
	//메소드
	void turnOnDmb() {
		System.out.println("채널" + channel + "번 DMB 방송 수신을 시작합니다.");
	}
	void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널" + channel + "번으로 바꿉니다.");
	}
	void turnOffDmb() {
		System.out.println("DMB 방송 수신을 멈춥니다.");
	}

}
실행 코드
package Inheritance;

//자 이제 객체를 생성 후 사용해보자

public class DmbCellPhoneExample {
	public static void main(String[] args) {
		//DmbcellPhone 객체 생성
		DmbcellPhone dmbcellPhone= new DmbcellPhone("자바폰", "검정", 10);
		
		//cellPhone 클래스로부터 상속받은 필드
		System.out.println("모델 :" + dmbcellPhone.model );
		System.out.println("색상 :" + dmbcellPhone.color) ;
		
		//DmbcellPhone 클래스의 필드
		System.out.println("채널 : "+ dmbcellPhone.channel);
		
		//cellPhone 클래스로부터 상속받은 메소드 호출
		dmbcellPhone.powerOn();
		dmbcellPhone.bell();
		dmbcellPhone.sendVoice("여보세요");
		dmbcellPhone.receiveVoice("안녕하세요! 저는 효선인데요");
		dmbcellPhone.sendVoice("반가워요");
		dmbcellPhone.hangup();
		
		//DmbcellPhone 클래스의 매소드 호출
		dmbcellPhone.turnOnDmb();
		dmbcellPhone.changeChannelDmb(12);
		dmbcellPhone.turnOffDmb();
	}
}
결과 값

 

 

메소드 재정의 = 오버라이딩(Overiding) 
자식 클래스에서 부모 클래스의 메소드를 다시 정의 하는 것



메소드 재정의 할 때, 주의해야하는 규칙

  • 부모의 메소드와 동일한 리턴 타입 / 메소드 이름 / 매개 변수 목록을 가져야함
  • 접근 제한을 더 강하게 재정의할 수 없음
  • 새로운 예외(Exception)를 throws 할 수 없음

 

부모 클래스
package Method;

public class Calculator {
	double areaCircle(double r) { //외부로부터 반지름을 받음
		System.out.println("Computer 객체의 areaCircle() 실행");
		return 3.14159 * r *r; // (원의면적 구하는 공식) 정밀한 계산을 위해 수정: 재정의 할거임
	}
}
자식 클래스
package Method;

//자식 클래스 Calculator를 상속받는 Computer 클래스를 만들어봄

public class Computer extends Calculator{
	@Override //어노테이션이라고 부름, Calculator에서 정의한거 다시 선언=메소드 오버라이딩
	double areaCircle(double r) { 
		 System.out.println("Computer 객체의 areaCircle() 실행"); //실행내용 변경
		return Math.PI * r * r; //Math.PI 상수를 이용
	}

}
부모 클래스에 있는  return 3.14159 * r * r  값을 자식 클래스에서 return Math.PI * r * r  으로 재정의 함

※ Override 할 때, ctrl + space bar 클릭시 자동완성 기능을 사용하는 것을 추천

 

실행 코드 
package Method;

//실행 클래스 
public class ComputerExample {

	public static void main(String[] args) {
		int r =10;
		
		Calculator calculator = new Calculator(); //Calculator 객체를 만들었음
		System.out.println("원면적 : " + calculator.areaCircle(r));
		System.out.println();
		
		Computer computer = new Computer(); //computer객체를 만들었음
		System.out.println("원면적 : " + computer.areaCircle(r)); //재정의된 메소드 호출

	}

}
실행 결과