코딩 이야기
JAVA 상속 본문
객체 지향 프로그래밍에서도 부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있습니다. 프로그램에서는 부모 클래스를 상위 클래스라고 부르고 자식 클래스를 하위 클래스 또는 파생 클래스라고 부릅니다.
클래스 상속
자식 클래스를 선언할 때 어떤 부모가 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스는 다음과 같이 extends 뒤에 기술합니다.
class 자식 클래스 extends 부모클래스{
//필드
//생성자
//메소드
}
자바에서 상속의 특징
1.여러 개의 부모 클래스를 상속할 수 없습니다. 그러므로 다음과 같이 extends 뒤에는 단 하나의 부모 클래스만 와야합니다.
class 자식클래스 extends 부모클래스1, 부모클래스2 {
}
(여러개의 부모클래스는 올 수 없다.)
2.부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속대상에서 제외됩니다. 그리고 부모 클래스와 자식 클래스가 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외됩니다.
부모클래스
package ch07;
public class CellPhone {
//필드
String model;
String color;
//생성자
//메소드
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 ch07;
public class DmbCellPhone extends CellPhone{
//필드
int channel;
//생성자
DmbCellPhone(String model, String color, int channel){
this.model = model;
this.color = color; // model와 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 ch07;
public class DmbCellPhoneExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
//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();
}
}
부모 생성자 호출
자바에서 자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성됩니다.
모든 객체는 클래스의 생성자를 호출해야만 생성됩니다. 부모 객체도 예외는 아닙니다. 그렇다면 부모 객체를 생성하기 위해 부모 생성자를 어디서 호출한 것일까요? 부모 생성자는 자식생성자의 맨 첫 줄에서 호출됩니다.
예를 들어 DmbCellPhone의 생성자가 명시적으로 선언되지 않았다면 컴파일러는 다음과 같은 기본 생성자를 호출합니다.
public DmbCellPhone() {
syper();
}
첫 줄에 super();가 추가된 것을 볼 수 있는데, spuer()는 부모의 기본생성자를 호출합니다. 즉 CellPhone 클래스의 다음 생성자를 호출합니다. Cellphone.java 소스 코드에서도 생성자가 선언되지 않았지만 컴파일러에 의해 기본생성자가 만들어 지므로 문제없이 실행됩니다.
public CellPhone(){
}
직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 다음과 같이 작성하면 됩니다.
자식클래스(매개변수선언, ...){
super( 매개값, ...);
...
}
super은 반드시 자식 생성자 첫 줄에 위치해야합니다.
부모 클래스
package ch07;
public class People {
public String name;
public String ssn;
public People(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
자식 클래스
package ch07;
public class Student extends People {
public int studentNO;
public Student(String name, String ssn, int studentNo) {
super(name , ssn);
this.studentNO = studentNo;
}
}
People 클래스는 기본 생성자가 없고 name과 ssn을 매개값으로 받아 객체를 생성시키는 생성자만 있습니다. 그렇기 때문에 People을 상속하는 Student 클래스는 생성자에서 super(name,ssn)으로 People 클래스의 생성자를 호출해야 합니다.
자식 객체 이용
package ch07;
public class StudentExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student student = new Student("홍길동", "123456-1234567",1);
System.out.println("name:"+student.name);
System.out.println("ssn:"+student.ssn);
System.out.println("studentNo:"+student.studentNO);
}
}
'JAVA' 카테고리의 다른 글
JAVA 타입변환과 다형성 (0) | 2023.02.13 |
---|---|
JAVA 메소드 재정의 (0) | 2023.02.13 |
JAVA 접근 제한자 (0) | 2023.02.10 |
JAVA 싱글톤 , final 필드와 상수 (0) | 2023.02.10 |
JAVA 인스턴스 멤버와 정적 멤버 (0) | 2023.02.09 |