[JAVA] 자바 - 상속과 생성자 (super, this)
by mini_min[JAVA]
자바 - 상속과 생성자
✔️ 상속에서 생성자
자바에서 오브젝트 클래스를 제외한 모든 클래스의 생성자 필수!
- this(인수) 를 이용해 본인 클래스에 정의된 다른 생성자 or
- super(인수) 를 이용해 상위 클래스 생성자를 반드시 호출해야한다!
+ 생성자 호출할 때는 무조건 최상단에서 한 번만 가능
💡 다른 생성자나 상위클래스 생성자를 호출하지 않으면 컴파일러가 자동으로 'super();' 를 추가해서 인자 없는 상위클래스 생성자를 호출한다.
⭐⭐ 상위클래스에 인자가 '있는' 생성자만 있을 경우, 반드시 하위클래스에서 'super(인자있음)' 생성자를 호출해야한다.
✔️ 하위클래스의 객체 만들기
◾ 상위클래스와 하위클래스가 있다는 전제하에, main 클래스에서 하위클래스 객체를 생성한다.
public static void main(String[] args) {
Test3 tt = new Test3();
tt.disp();
}
}
1) 상위클래스 필드 메모리 할당, 기본값으로 초기화, (초기화 블럭 실행)
2) 하위클래스 필드 메모리 할당, 기본값으로 초기화, (초기화 블럭 실행)
3) 상위클래스 생성자 몸체 실행
4) 하위클래스 생성자 몸체 실행
= 상위클래스부터 필드 메모리를 할당하고 생성자 몸체를 실행한다.
class Demo3 { //상위
int a = 10;
public Demo3() {
System.out.println("Demo3 생성자-인자없음");
}
public void print() {
System.out.println(a);
}
}
class Test3 extends Demo3 {
int x = 100;
//하위클래스의 생성자이며, 자기 자신의 생성자 또는 상위클래스의 생성자를 꼭 호출해야한다.
public Test3() {
super();
System.out.println("Test3 생성자");
}
public void disp() {
System.out.println(a + "," + x);
}
}
객체 생성된 하위클래스의 생성자는 Test3() 이다.
생성자 메소드 안에는 super(); <- 상위클래스 생성자가 있다.
상위클래스 생성자 실행 결과 : "Demo3 생성자-인자없" 출력
다시 하위클래스 생성자 실행 : "Test3 생성자" 출력
💡 하위클래스의 생성자에서 상위클래스의 생성자를 꼭 호출해야한다.
생성자 없으면 디폴트 생성자 만들어주니까 주의!!
✔️ 상위클래스에 인자있는 생성자만 있을 때
상위클래스에 인자가 있는 생성자 1개만 존재하는 경우, 하위클래스는 생성자를 만들고 인자가 있는 상위클래스 생성자를 'super(인자)' 형태로 반드시 호출해야한다.
class Demo4 {
int a;
public Demo4(int a) { //인자있는 생성자 1개뿐
this.a = a;
System.out.println("Demo4 생성자...");
}
public void print() {
System.out.println(a);
}
}
class Test4 extends Demo4{
int x = 10;
public Test4() {
super(5); // 슈퍼클래스의 생성자를 명시적으로 호출
System.out.println("Test4...");
}
public void disp() {
System.out.println(a+","+x);
}
}
💡 인자 있는 생성자 public Demo4(int a) 가 상위클래스에서 보일 때,
하위클래스의 생성자에 명시적으로 인자가 있는 슈퍼클래스의 생성자를 호출한다.
만약, public Test4() 생성자에 'super()' 를 호출하면 안된다. 상위클래스에 인자없는 생성자가 없기 때문에.
✔️ this 로 다른 생성자 호출
super 는 상위클래스 생성자 호출할 때 사용, 그럼 this는? this 는 같은 클래스 안에 있는 다른 생성자를 찾아서 호출한다. 그리고 그 생성자에 있는 super 나 this 를 통해 다른 생성자를 또 호출하거나, 상위클래스를 호출하겠지?
public static void main(String[] args) {
Test5 tt = new Test5(100);
}
}
class Demo5 {
int x;
public Demo5() {
x = 0;
System.out.println("상위-인자없는 생성자");
}
pulbic Demo5(int x) {
this.x = x;
System.out.println("상위-인자 하나 생성자");
}
public void print() {
System.out.println(x);
}
}
class Test5 extends Demo5 {
int a;
public Test5() {
//생략으로 super(); 호출
// 결과 : 인자없는 생성자
a = 0;
System.out.println("인자없는 생성자");
}
public Test5(int a){
this(a,10);
//this(인수) 호출로 super(인수) 호출불가
//this(인수) 가 가리키는 다른 생성자로 찾아간다.
System.out.println("인자하나인 생성자");
}
public Test5(int a, int x){
super(x);
this.a=a;
System.out.println("인자 둘인 생성자");
}
public void disp() {
System.out.println(x + "," + a);
}
}
💡 new Test5(100) 객체 생성시 발생과정
- 인자있는 Test5 하위클래스 생성자 실행
- this(인자) 만나고 Test5(int a, int x) 생성자 실행
- super(x) 만나고 인자있는 Demo5(int x) 생성자 실행
⭐ 출력 : 상위-인자 하나 생성자 !!!
⭐ 다시 돌아와 출력 : 인자 둘인 생성자!!!
⭐ 다시 돌아와 출력 : 인자하나인 생성자!!!
'Java' 카테고리의 다른 글
[JAVA] 자바 - 참조형 변수의 다형성, 업 캐스팅(up-casting) (0) | 2022.07.25 |
---|---|
[JAVA] 자바 - 메소드 오버라이딩(Method Overriding) ⭐⭐ (0) | 2022.07.25 |
[JAVA] 자바 - 상속 관계 정의 (super/sub 클래스) (0) | 2022.07.25 |
[JAVA] 자바 - Math 및 Random 클래스 (0) | 2022.07.25 |
[JAVA] 자바 - Date 클래스 (getTime, SimpleDateFormat) (0) | 2022.07.24 |
블로그의 정보
개발자 미니민의 개발로그
mini_min