Java

Java, 상속(inheritance) / error 고치기

greenyellow-s 2024. 7. 15. 18:23

 

상속(inheritance)

is~ a 관계, ~이다

 

자식은 부모의 역할을 대신 할 수 있다.

자바에서는 단일 상속 밖에 안된다. (다중 상속을 해결하기 위해 나온것이 interface)

 

Super class : 상속해 주는 클래스(부모)
Sub class : 상속받는 클래스(자식)

 

 

class aa{
         private int a;
         public void sub(){   }


class bb extends aa{ // aa의 역할을 bb가 상속받았다.
          private int b;
          public void div(){   }
}

aa가 부모이고 bb가 자식으로 aa의 역할을 bb가 상속받아서 aa에 대한 것들을 사용할 수 있게 되었다.

 

하지만 aa클래스에서 a변수를 private로 잡아두어서 bb에서는 가져다가 사용할 수가 없다.

왜냐하면 private는 자기 자신 클래스 내에서만 사용이 가능하기 때문이다.

 

결국 상속된 자식은 부모가 private으로 걸어놓으면 가져다가 사용할 수 없으므로

protected 접근 제어자를 사용하여 상속받은 자식 한해서만 사용이 가능하도록 선언한다.

 

접근 제어자


private(본인만) < default( 같은 패키지 안에서만 ) < protected (상속받은 자식까지만) < public( 다 가능)

 

class aa{

         protected int a;

         public void sub(){   }

}

 

로 고치면 a도 이제 bb클래스에서 사용 가능하다.


 

상속된 클래스에서 참조값 호출하기

 

1. 자신의 참조값으로 호출
this.weight = weight;

2. 부모의 참조값으로 호출
super.weight = weight; 

3. 부모 생성자 호출
super(weight, height);

 

아무말 안하면 기본 생성자로 가지만
super를 쓰면 부모 생성자에서 해당되는 생성자를 호출한다.

 

super(weight, height); -> public Super(double weight, double height){  }
super(); -> 기본 생성자 public Super() {  }


에러사항

 

[Error 1]

public class Super {
	protected double weight, height;
	
	public Super(double weight, double height){
		this.weight = weight;
		this.height = height;
	}
}

public class SubMain extends Super { // error!
...
	public SubMain(String name, int age, double weight, double height) {
		this.name = name;
		this.age = age;
		this.weight = weight;
		this.height = height;
    }
...
}

[에러문구]
Implicit super constructor Super() is undefined for default constructor. Must define an explicit constructor

 

생성자가 없을 때는 기본 생성자를 자동으로 생성해주지만

위에 코드처럼 생성자가 있는 경우 기본 생성자를 자동으로 생성해주지 않는다.

따라서 에러가 발생한 것이다.

 

[해결방안]

기본 생성자를 Super클래스에 생성해주면 된다.

 

public class Super {
	protected double weight, height;
	
	public Super() { //기본 생성자 }
    
	public Super(double weight, double height){
		this.weight = weight;
		this.height = height;
	}
}

[Error 2]

public class Super {
	protected double weight, height;
	
	public Super(double weight, double height){
		this.weight = weight;
		this.height = height;
	}
}

public class SubMain extends Super { // error!
...
	public SubMain(String name, int age, double weight, double height) {
		this.name = name;
		this.age = age;
		
		super(weight, height); // 부모 생성자 호출
    }
...
}

[에러문구]
Constructor call must be the first statement in a constructor

 

super()는 무조건 첫번째 줄에 입력해야된다.

 

[해결방안]

첫번째 줄로 이동

super(weight, height);

this.name = name;
this.age = age;