1.  상속  inheritance

✏️  부모가 자식에게 물려주는 행위를 말함

  

  👾  상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여 개발 시간을 단축시킨다.

  👾  자식 클래스에 새로운 코드가 추가되어도 부모 클래스는 아무런 영향을 받지 않는다.

         but, 조상클래스가 변경되면 자손클래스는 자동적으로 영향을 받게 됨. ( = 조상 클래스의 모든 멤버를 상속 받음 )

  👾  부모 클래스를 확장(extend) 한다는 의미로 상속에 사용되는 키워드가 'extends'이다.

  👾  자식 클래스의 인스턴스를 생성하면 부모 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성됨


  
class Person { // 사람 클래스
void breath() {
System.out.println("숨쉬기");
}
void eat() {
System.out.println("밥먹기");
}
void say() {
System.out.println("말하기");
}
}
class Student extends Person{ // 사람 클래스를 상속한 학생 클래스
void learn(){
System.out.println("배우기");
}
}
class Teacher extends Person{ // 사람 클래스를 상속한 선생 클래스
void teach(){
System.out.println("가르치기");
}
}

  
public class Test {
public static void main(String[] args) {
Student student = new Student(); // 학생 인스턴스 student 생성
student.breath(); // 사람 클래스의 breath 메서드를 상속 받았음.
student.learn();
student.say();
Teacher teacher = new Teacher(); // 선생 인스턴스 teacher 생성
teacher.eat(); // 사람 클래스의 eat 메서드를 상속 받았음
teacher.teach();
teacher.say();
Person person = new Person();
person.breath();
// person.learn(); // 자식 클래스의 메서드나 멤버 변수는 사용하지 못함.
}
}

 


1)  클래스 상속

  ⚒️  자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 extends 뒤에 기술

  ⚒️  다른 언어와 달리 자바는 다중 상속 허용 X. 단 하나의 부모 클래스만 상속 받을 수 있다!


  
public class Phone {
//필드 선언
public String model;
public String color;
//메소드 선언
public void bell() {
System.out.println("벨이 울립니다.");
}
public void sendVoice(String message) {
System.out.println("자기: " + message);
}
public void receiveVoice(String message) {
System.out.println("상대방: " + message);
}
public void hangUp() {
System.out.println("전화를 끊습니다.");
}
}

  
public class SmartPhone extends Phone {
//필드 선언
public boolean wifi;
//생성자 선언
public SmartPhone(String model, String color) {
this.model = model;
this.color = color;
}
//메소드 선언
public void setWifi(boolean wifi) {
this.wifi = wifi;
System.out.println("와이파이 상태를 변경했습니다.");
}
public void internet() {
System.out.println("인터넷에 연결합니다.");
}
}

  
public class SmartPhoneExample {
public static void main(String[] args) {
//SmartPhone 객체 생성
SmartPhone myPhone = new SmartPhone("갤럭시", "은색");
//Phone으로부터 상속받은 필드 읽기
System.out.println("모델: " + myPhone.model);
System.out.println("색상: " + myPhone.color);
//SmartPhone의 필드 읽기
System.out.println("와이파이 상태: " + myPhone.wifi);
//Phone으로부터 상속받은 메소드 호출
myPhone.bell();
myPhone.sendVoice("여보세요.");
myPhone.receiveVoice("안녕하세요! 저는 홍길동인데요.");
myPhone.sendVoice("아~ 네, 반갑습니다.");
myPhone.hangUp();
//SmartPhone의 메소드 호출
myPhone.setWifi(true);
myPhone.internet();
}
}

 


2)  부모 생성자 호출

  ⚒️  자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.

 

  ⚡️ 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다.

  ⚡️ super()는 컴파일 과정에서 자동 추가되는데, 이것은 부모의 기본 생성자를 호출한다.

         ➡️  만약 부모 클래스에 기본 생성자가 없다면 자식 생성자 선언에서 컴파일 에러가 발생

         ➡️  기본 생성자는 없고 매개변수를 갖는 생성자만 있다면 super(매개값, ...) 코드를 직접 넣어야 함


  
// 자식 생성자 선언
public 자식클래스(...) {
super(); // 생략 가능
...
}
public 자식클래스(...) {
super(매개값, ...); // 생략 불가
...
}

 

기본 생성자를 가지고 있는 경우

  
public class Phone {
//필드 선언
public String model;
public String color;
//기본 생성자 선언
public Phone() {
System.out.println("Phone() 생성자 실행");
}
}

  
public class SmartPhone extends Phone {
//자식 생성자 선언
public SmartPhone(String model, String color) {
super();
this.model = model;
this.color = color;
System.out.println("SmartPhone(String model, String color) 생성자 실행됨");
}
}

  
public class SmartPhoneExample {
public static void main(String[] args) {
//SmartPhone 객체 생성
SmartPhone myPhone = new SmartPhone("갤럭시", "은색");
//Phone으로부터 상속 받은 필드 읽기
System.out.println("모델: " + myPhone.model);
System.out.println("색상: " + myPhone.color);
}
}

  
// 실행 결과
Phone() 생성자 실행
SmartPhone(String model, String color) 생성자 실행됨
모델: 갤럭시
색상: 은색

 

매개변수를 갖는 생성자가 있는 경우

  
public class Phone {
//필드 선언
public String model;
public String color;
//매개변수를 갖는 생성자 선언
public Phone(String model, String color) {
this.model = model;
this.color = color;
System.out.println("Phone(String model, String color) 생성자 실행");
}
}

  
public class SmartPhone extends Phone {
//자식 생성자 선언
public SmartPhone(String model, String color) {
super(model, color);
System.out.println("SmartPhone(String model, String color) 생성자 실행됨");
}
}

  
public class SmartPhoneExample {
public static void main(String[] args) {
//SmartPhone 객체 생성
SmartPhone myPhone = new SmartPhone("갤럭시", "은색");
//Phone으로부터 상속 받은 필드 읽기
System.out.println("모델: " + myPhone.model);
System.out.println("색상: " + myPhone.color);
}
}

  
// 실행 결과
Phone(String model, String color) 생성자 실행
SmartPhone(String model, String color) 생성자 실행됨
모델: 갤럭시
색상: 은색

 

 

 

* 내용 참고 - 책 '이것이 자바다'

+ Recent posts