상속
자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정,
선택된 부모 클래스는 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)); //재정의된 메소드 호출
}
}
실행 결과

'Coding > JAVA' 카테고리의 다른 글
[명품자바 예7-3] 문자열 입력받아 ArrayList에 저장 (0) | 2022.05.10 |
---|---|
[명품자바] 07. 제네릭과 컬랙션 실습문제 4번 문제풀이 (0) | 2022.05.10 |
[명품 자바] 추상클래스 구현 연습 예제 5-7 (0) | 2022.04.26 |
[명품자바] 05장 상속 실습문제 5번/6번/7번 (0) | 2022.04.19 |
[명품자바] 05 상속 개념/ 예제 (0) | 2022.04.19 |