상속이란?
코드의 재활용을 위해 부모 - 자식 관계를 맺어 private,default인 메소드와 변수는 제외하고
public , protected 메소드와 변수를 물려받는 개념입니다.
상속에 예제를 들어봅시다.
# person class
class Person {
String name;
int age;
public Person() {
System.out.println("부모의 생성자입니다.");
}
public Person(String name , int age) {
this.name = name;
this.age = age;
System.out.println("부모의 매개변수 생성자 입니다.");
System.out.println("전달 받은 데이터 name : " + name);
System.out.println("전달 받은 데이터 age : "+ name);
}
public void print() {
System.out.println("print함수 name : " + this.name);
System.out.println("print함수 age : " + this.name);
}
}
부모 클래스는 다음과 같이 정의되어 있습니다.
* 여기서 생성자란 ? 클래스의 객체가 생성될때마다 호출되는 객체 초기화입니다.
* person p1 = new person() 과 같이 객체가 생성되는 순간 person() 을 호출하게 됩니다.
# child class
class child extends Person {
String hobby;
public child(){
super();
System.out.println("자식의 생성자입니다.");
}
public child(String name,int age) {
super(name,age);
System.out.println("자식의 변수 name : "+ super.name );
System.out.println("자식의 변수 age : "+ super.age);
}
public void sethobby(String hobby) {
this.hobby = hobby;
}
public String gethobby() {
return hobby;
}
public void print() {
System.out.println("print함수 hobby :" + this.hobby);
}
}
자식 클래스는 다음과 같이 정의되어 있으며 extends 라는 키워드를 통해 person을 상속받고 있습니다.
이제 객체를 생성하여 어떻게 동작하는지 확인해 봅시다.
# 부모의 빈 생성자 호출
Person p1 = new Person();
출력결과
부모의 생성자입니다.
객체를 만드는 순간 Person() 함수 안에 print구문이 실행됩니다.
#부모의 파라미터 생성자 호출
Person p2 = new Person("홍길동",20);
# 부모의 print함수 호출
p2.print();
출력결과
부모의 매개변수 생성자 입니다.
전달 받은 데이터 name : 홍길동
전달 받은 데이터 age : 홍길동
print함수 name : 홍길동
print함수 age : 홍길동
이번에는 객체를 만들때 파라미터를 주었기 때문에 매개변수가 존재하는 Person(String name, int age)가 실행됩니다.
또한 person 의 print함수를 호출하였는데 자세히 보시면 this 라는 키워드가 있습니다.
* this 는 '나의 객체' 를 의미합니다. 무슨 뜻이냐면 print 함수의 매개변수 name,age 와 person의 전역변수 name,age 를 구분하기 위해 전역변수인 name,age 를 '나'를 뜻하는 this를 붙혀 구분하도록 하기 위함입니다.
#자식의 빈 생성자 호출
child c1 = new child();
출력결과
부모의 생성자입니다.
자식의 생성자입니다.
상속 받은 자식의 객체를 생성하면 child() 생성자가 실행되는데 여기서 super()가 있습니다. 이는 생성할때 부모의 생성자도 같이 생성을 해야만 하기 때문에 작성을 해주셔야 하며 반드시 부모의 기본생성자 자가 존재해야만 합니다.
따라서 부모의 생성자도 실행하고 , 자식의 생성자도 실행하게 됩니다.
#자식의 파라미터 생성자 호출
child c2 = new child("홍머시기",5);
c2.sethobby("축구");
c2.print();
출력결과
부모의 매개변수 생성자 입니다.
전달 받은 데이터 name : 홍머시기
전달 받은 데이터 age : 홍머시기
자식의 변수 name : 홍머시기
자식의 변수 age : 5
print함수 hobby :축구
이번에는 매개변수가 존재하는 생성자를 호출했으며 c2의 전역변수 hobby를 저장하고 print를 출력하게 됩니다.
다만 여기서 알아두셔야 할 점은 부모가 상속해준 print와 자식이 정의한 print가 존재하게 됩니다.
이미 물려준 print가 있는데 자식이 다시 정의하는 것을 메소드 오버라이딩 이라고 합니다.
이 메소드 오버라이딩은 부모가 물려준 변수와 메소드를 자식인 나에게 알맞게 사용하기 위함입니다.
'개발 > 자바' 카테고리의 다른 글
Java - wrapper class (Integer,Float 등등) (0) | 2023.01.25 |
---|---|
Java - abstract class / method (0) | 2023.01.20 |
Java - 접근제한자 (0) | 2023.01.20 |
Java - 메소드 오버로딩 (0) | 2023.01.18 |
Java - static 키워드 (0) | 2023.01.18 |