[목차]
- 기본생성자
- super
기본생성자
- 자기자신을 메인에서 인스턴스화 시키는 것도 가능합니다.
// 어떠한 생성자도 만들어지지 않은 상태일 때 자바는 기본 생성자를 만들어줍니다.
// 기본생성자는 class이름과 같으면서 매개변수가 없는 것이 기본 생성자 입니다.
public class ConstructorDemo {
public static void main(String[] args) {
// 이 메소드의 해당하는 메소드를 자바가 자동으로 만들기 때문에 가능합니다.
ConstructorDemo c = new ConstructorDemo()
}
}
에러코드
public class ConstructorDemo {
// 어떠한 생성자가 개발자의 의해서 명시적으로 만들어지게 되면
// 자바는 기본적으로(암시적으로) 만들어주지 않습니다.
public ConstructorDemo(int param1) {}
public static void main(String[] args) {
// new ConstructorDemo 생성자가 호출이 되어야하는데
// 이 인스턴스는 인자가 없는데 ConstructorDemo는 인자가 없는 생성자는 가지고 있지 않으며
// 자바는 자동으로 만들어주지 않았기 때문에 에러가 발생합니다.
ConstructorDemo c = new ConstructorDemo()
}
}
해결방법
public class ConstructorDemo {
public ConstructorDemo() {}
public ConstructorDemo(int param1) {}
public static void main(String[] args) {
// public ConstructorDemo() {}: 인자가 없는 기본 생성자를 명시적으로 선언해주면
// new ConstructorDemo()라는 생성자가 호출될 때 public ConstructorDemo() {} 명시적으로
// 선언해준 이 값이 실현이 되기 떄문에 에러가 발생하지 않습니다.
ConstructorDemo c = new ConstructorDemo()
}
}
super
에러코드
class Calculator {
int left, right;
// Calculater는 기본생성자가 아닌 명시적으로 정의되어 있습니다.
// 자바가 자동으로 만들어주지 않음
// 해결 방법Calculater 기본 생성자를 정의해주면 됩니다.
// public Calculater(){}
public Calculater(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
// SubstractionableCalculator에 부모클래스인 Calculater의 생성자를 자동으로 호출하도록 되어있습니다.
class SubstractionableCalculator extends Calculator {
public SubstractionbleCalculater(int left, int right) {
this.left = left;
this.right = right;
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculaterConstructorDemo5 {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}
해결방법(Super)
- super란 부모클래스를 의미합니다.
- this가 자기자신을 의미하는 것과 똑같은 원리입니다.
- super()가 있으면 부모클래스의 생성자라는 뜻 입니다.
- 하위클래스가 상위클래스를 참조할 수 있는 방법입니다.
- 하위클래스의 초기화 코드는 super() 다음에 나타나야 합니다. 먼저 초기화 코드를 작성하면 오류 발생
- 하위클래스가 인스턴스가 된다는 것은 상위클래스가 인스턴스가 되었다는 뜻 입니다.
상위클래스가 미리초기화가 다 끝난 상태에서만 초기화를 할 수 있습니다.
class Calculator {
int left, right;
public Calculater(){}
public Calculater(int left, int right) {
this.left = left;
this.right = right;
}
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
class SubstractionableCalculator extends Calculator {
// 하위클래스에서 super(left, right);값을 주고 있습니다.
// left, right을 주게 되면 SubstractionbleCalculater의 첫 번쨰 두 번째 매개변수가 super에 들어감
public SubstractionbleCalculater(int left, int right) {
super(left, right);
}
public void substract() {
System.out.println(this.left - this.right);
}
}
public class CalculaterConstructorDemo5 {
public static void main(String[] args) {
SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
c1.sum();
c1.avg();
c1.substract();
}
}