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) 생성자 실행됨
모델: 갤럭시
색상: 은색
* 내용 참고 - 책 '이것이 자바다'
'Programming Language > JAVA' 카테고리의 다른 글
[Java] final 클래스와 final 메소드 · protected 접근 제한자 (0) | 2024.08.23 |
---|---|
[Java] 오버라이딩 Overriding (0) | 2024.08.11 |
[Java] Getter와 Setter · 싱글톤 패턴 (0) | 2024.08.11 |
[Java] final 필드와 상수 · 접근 제한자 (0) | 2024.08.11 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.08.10 |