본문 바로가기
학습/JAVA

7. 상속(Inheritance) (상속, 부모 생성자 호출 super())

by Elfen Lied 2022. 10. 11.
반응형

- 상속

  • 연관된 일련의 클래스들에 대한 공통규약
  • 하위클래스가 상위클래스의 특성을 가진 채 그 기능을 확장하는 것
    • 하위(서브, 자식)클래스 – 상위(슈퍼, 부모)클래스

 

- 상속 개념의 활용

  • 상속의 효과
    • 개발 생성산 향상, 코드 중복 제거, 유지 보수에 도움 , 다형성 구현 가능
  • 상속의 대상 : 필드, 메소드 (생성자는 상속 대상이 아님)
    • 정적 멤버(static이 붙은 것)는 상속되지 않는다.
    • 그러나 지금은 상속된 것처럼 생각하고 사용해도 큰 문제가 없다.
  • 상속 대상 제한
    • 상위 클래스의 private 접근 갖는 필드와 메소드 제외
    • 상위 클래스가 다른 패키지에 있을 경우, default 접근 갖는 필드와 메소드 도 제외
  1. public, protected : 무조건 상속
  2. default : 상위클래스와 하위클래스의 패키지가 같으면 상속
  3. private : 상속 불가

 

// 상위 클래스(슈퍼, 부모)
public class Cellphone {

	String model;
	String color;
	
	void powerOn() {
		System.out.println("전원 on");
	}
	void powerOff() {
		System.out.println("전원 off");
	}
	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("전화 끊음");
	}
}


// 하위 클래스(서브, 자식)
public class DmbCellphone extends Cellphone{

	int channel;
	
	public DmbCellphone(String model, String color, int channel) {
		this.model = model;
		this.color = color;
		this.channel = channel;
	}
	
	void turnOnDmb() {
		System.out.println("채널" + channel + "번 방송 수신" );
	}
	
	void changeChannelDmb(int channel) {
		this.channel = channel;
		System.out.println("채널을 " + channel + "번으로 변경");
	}

	void turnOffDmb() {
		System.out.println("DMB 종료");
	}
}


// 메인 클래스
public class DmbPhoneExample {
	public static void main(String[] args) {
		DmbCellphone dmbPhone = new DmbCellphone("자바폰", "검정", 10);
		System.out.println("모델 : " + dmbPhone.model);
		System.out.println("색상 : " + dmbPhone.color);
		
		dmbPhone.powerOn();
		dmbPhone.bell();
		dmbPhone.sendVoice("헤이");
		dmbPhone.receiveVoice("안녕하세요");
		dmbPhone.sendVoice("반갑습니다");
		dmbPhone.hangUp();
		
		dmbPhone.turnOnDmb();
		dmbPhone.changeChannelDmb(11);
		dmbPhone.turnOffDmb();
		
	}
}

자식 클래스에 extends 를 붙여 상속.

protected는 직접 extends 를 붙여 상속받은 클래스 내부에서만 사용가능 (외부 접근 불가)

 

 

 

- 하위클래스 생성자 호출

  • 하위클래스 생성자를 호출하여 하위객체를 생성하면 반드시 상위클래스의 생성자도 호출되고 상위객체도 생성된다
  • 컴파일러가 하위클래스의 생성자에 super()를 추가한다.
  • super()는 상위클래스의 기본 생성자를 호출한다.
// 부모 클래스
public class People {
	public People() {
		System.out.println("People객체 생성");
	}
}

// 자식 클래스
class Student extends People {
	public Student() {
		super(); // 부모 생성자 호출(생략 가능)
		System.out.println("Student객체 생성");
	}
}

//  메인 클래스
public class PeopleDemo {
	public static void main(String[] args) {
		// 자식객체를 생성하면 부모객체도 생성된다.
		// 자식(서브, 하위) 클래스 생성자 호출 -> 부모(슈퍼, 상위) 클래스 생성자 호출
		Student st = new Student();
	}
}

super() 메소드 (생략가능) - 반드시 클래스 첫줄에 작성할 것

 

 

- 하위클래스 생성자에서 상위클래스의 필드와 하위클래스가 가진 필드를 초기화해보자.

// 부모(상위)
public class People {
	public String name;
	public String ssn;
	
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}

	void printInfo() {
		System.out.println("이름 : " + name);
		System.out.println("주민번호 : " + ssn);
	}
}

=====================================================

// 자식(하위)
class Student extends People {
	int studentNo;
	
	public Student() {
		super("홍길동", "1234");
	}

	public Student(String name, String ssn) {
		super(name, ssn);
	}

	public Student(String name, String ssn, int studentNo) {
		super(name, ssn);
		this.StudentNo = studentNo;
	}
	
	void printInfo() {
		System.out.println("이름 : " + name);
		System.out.println("주민번호 : " + ssn);
		System.out.println("학생번호 : " + studentNo);
	}
	
}



public class PeopleDemo {
	public static void main(String[] args) {
		// 자식객체를 생성하면 부모객체도 생성된다.
		// 자식(서브, 하위) 클래스 생성자 호출 -> 부모(슈퍼, 상위) 클래스 생성자 호출
		Student st = new Student("짱구", "59195485", 10);
		st.printInfo();
	}
}

printInfo() 가 상위에도 있으나 하위것을 사용

 

 

반응형

댓글