ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 19 - 생활코딩 자바강의 정리(상속과 생성자)
    TIL 2023. 2. 6. 20:54

    [목차]

    1. 기본생성자
    2. 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();
        }
    }
Designed by Tistory.