생성자

알파로그·2023년 3월 12일
0

JAVA 문법과 지식

목록 보기
3/9

✏️ 생성자

  • 생성자는 모든 Class 에 기본적으로 포함되어야 한다.
    • 만약 직접 코드로 생성자를 생성하지 않았다면 기본생성자가 생성된다.
      • 생성자를 별도로 생성하지 않아도 intstance 로 생성할 수 있는 이유
    • 디폴트 기본생성자는 생략되었기 때문에 코드상에서는 보이지 않는다.
  • 기본 생성자를 사용해서 필드값을 체워줄 경우 별도로 필드를 입력하지 않았을 때 null 값이 나오지 않게 된다.
Name name = new Name();
System.out.println(name.name); // null

class Name{
    String name;
}

//-------------------------//

Name name = new Name();
System.out.println(name.name); // no name

class Name{
    String name;

    Name (){
        this.name = "no name";
    }
}

✏️ 생성자 연쇄 호출

  • 모든 Class 는 extends 가 없다면 java 의 최상위 객체인 Object Class 를 상속하게된다.
    • extends Object 는 생략되어 있다.
  • 모든 Class 는 기본생성자가 생략된 상태로 존재하는데
    Class 를 상속할 경우 생략되어 있는 기본생성자도 당연히 생략된 상태로 자식 Class 로 상속되게 된다.

📍 super(); - 연쇄 호출

  • super(); 는 부모 Class 의 생성자를 호출하는 Class 이다.
    • 모든 생성자는 super(); 가 생략되어 있다.
  • super(); 는 생성자 호출시 가장 먼저 생성되어야 하는 method 이고,
    super(); 보다 먼저 시작되는 코드가 있을경우 컴파일 오류가 발생한다.
    - 즉 생성자가 호출되면 생성자 로직이 실행되기 전 super(); 에 의해 모든 부모 Class 의 생성자 (Object 까지) 가 호출되게 된다.
  • 연쇄호출을 이용한 코드
    • 사람 Class 에 생략된 기본 생성자를 통해 동물 Class 의 생성자가 호출된다.
    • 동물 Class 에 있는 inti method 가 실행된다.
    • 실질적으로는 사람 Class 내에서 동물 생성자가 실행되었기 때문에 사람 Class 의 init mtehod 가 override 되어 실행된다.
package org.example.testing;

public class Testing {
    // 문제 : 아래와 같이 출력되도록 해주세요. init() 메세드에 의해서 출력되어야 합니다.
    // 조건 : 사람 클래스의 생성자는 사용할 수 없습니다, 동물 클래스를 수정하여 문제를 풀어주세요.
    // 힌트 : 모든 생성자는 자신의 일을 하기 전에 super(); 부터 실행합니다.
    // 힌트 : 모든 생성자는 자신의 일을 하기 전에 부모클래스의 생성자 부터 실행합니다.
    public static void main(String[] args) {
        new 사람();
        // 출력 : 사람이 초기화 됩니다.
    }
}

class 동물 {
    // 수정가능지역 시작

    public 동물() {
        init();
    }

    void init() {
        System.out.println("사람이 초기화 됩니다.");
    }

    // 수정가능지역 끝
}

class 사람 extends 동물 {
    void init() {
        System.out.println("사람이 초기화 됩니다.");
    }
}

📍 this(); - 연쇄 호출 막기

  • 부모 Class 의 생성자를 호출 하는 super() 와 달리 this(); 는 자기 자신의 생성자를 호출한다.
    • super(); 나 this(); 두가지중 한가지를 선택해 주어야 한다.
  • this(); 를 사용해 연쇄 호출을 막고 본인의 생성자를 호출하는 코드
    • 기본생성자를 생성하면 super(); 가 자동으로 생성되어 부모 Class 의 생성자를 호출하게 된다.
    • 하지만 예제의 부모 Class 인 동물엔 기본 생성자가 없어 컴파일 에러가 발생하게된다.
    • 기본생성자에 this(); 를 생성해 자신의 생성자로 이동시키고 이곳에서 부모 생성자로 이동시켰다.

⚠️ 사실 this(); 를 쓰지않고 기본생성자에서 바로 부모 생성자로 넘기는게 더 간편하다.

package org.example.testing;

public class Testing {
    // 문제 : 아래가 오류없이 실행되도록 해주세요.
    // 조건 : 사람 클래스만 수정할 수 있습니다.
    public static void main(String[] args) {
        new 사람();
    }
}
class 동물 {
    동물(String 이름) {
        System.out.println("동물(String 이름) 실행됨!");
        System.out.println("이름 : " + 이름);
    }
    동물(String 이름, int 나이) {
        System.out.println("동물(String 이름, int 나이) 실행됨!");
        System.out.println("이름 : " + 이름);
        System.out.println("나이 : " + 나이);
    }
}

class 사람 extends 동물 {
    
    사람(){
        this(23);
    }

    사람(int age) {
        super("홍길동", age);
    }
}
profile
잘못된 내용 PR 환영

0개의 댓글