반응형
- 상속
- 연관된 일련의 클래스들에 대한 공통규약
- 하위클래스가 상위클래스의 특성을 가진 채 그 기능을 확장하는 것
- 하위(서브, 자식)클래스 – 상위(슈퍼, 부모)클래스
- 상속 개념의 활용
- 상속의 효과
- 개발 생성산 향상, 코드 중복 제거, 유지 보수에 도움 , 다형성 구현 가능
- 상속의 대상 : 필드, 메소드 (생성자는 상속 대상이 아님)
- 정적 멤버(static이 붙은 것)는 상속되지 않는다.
- 그러나 지금은 상속된 것처럼 생각하고 사용해도 큰 문제가 없다.
- 상속 대상 제한
- 상위 클래스의 private 접근 갖는 필드와 메소드 제외
- 상위 클래스가 다른 패키지에 있을 경우, default 접근 갖는 필드와 메소드 도 제외
- public, protected : 무조건 상속
- default : 상위클래스와 하위클래스의 패키지가 같으면 상속
- 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() 가 상위에도 있으나 하위것을 사용
반응형
'학습 > JAVA' 카테고리의 다른 글
7. 상속(Inheritance) (Override 불가, 다형성, List<E>) (0) | 2022.10.12 |
---|---|
7. 상속(Inheritance) (Override, Annotation, toString()) (1) | 2022.10.11 |
6. 클래스(정적(static), 인스턴스, 싱글톤(singleton), 상수, 접근 제한자, Getter & Setter (1) | 2022.10.07 |
6. 클래스(메소드, 인스턴스 멤버와 this) (0) | 2022.10.06 |
6. 클래스(생성자) (0) | 2022.10.05 |
댓글