TIL/JAVA

[JAVA] 생성자

아람2 2024. 12. 11. 13:12
반응형

듣고 있는 강의 - 김영한의 실전 자바 기본편 

this 

this 는 인스턴스 자신을 가리킨다

매개변수의 이름과 멤버 변수의 이름이 같은 경우 this 를 사용해서 둘을 명확하게 구분해야 한다 

this 의 생략 

변수를 찾을 때 가까운 지역변수를 먼저 찾고, 없으면 그 다음으로 멤버 변수를 찾는다,

멤버 변수도 없으면 오류가 발생한다

package construct;

public class MemberThis {
    String nameField;
    
    void initMember (String nameParamenter) {
        nameField = nameParamenter; // this 생략되어 있음 
        // this.nameField = nameParamenter; // 와 같다 
    }
}

nameField 는 먼저 지역변수 (매개변수) 에서 같은 이름이 있는지 찾고, 매개변수가 없으므로 멤버 변수에서 찾는다 

nameParameter 도 먼저 지역변수 (매개변수) 에서 같은 이름이 있는지 찾고, 매개변수가 있으므로 매개변수를 사용한다 

this 를 사용해서, 지역 변수 (매개변수) 와 멤버 변수를 눈에 보이도록 구분해도 되지만,

요새 IDE 가 발전하면서 멤버 변수와 지역 변수를 색상으로 구분해 주기 때문에 반드시 사용할 필요는 없다 

왜 꼭 그렇게 해야 하지? 라는 본질적인 것에 대한 질문을 하면서 궁극적인 답, 더 나은 해답을 찾을 수 있을 것이다 

 

생성자 - 도입

package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    MemberConstruct(String name, int age, int grade) {
        System.out.println("생성자 호출 name = "+name+", age = "+age+", grade = "+grade);
        this.name = name;
        this.age = age;
        this.grade = grade; 
    }
}

객체를 생성하고 이후에 바로 초기값을 할당하기 위해 제공되는 개념,

생성자를 사용하면 객체를 생성하는 시점에 즉시 필요한 기능을 수행할 수 있다 

생성자와 메서드의 차이 

생성자 이름은 클래스 이름과 같아야 한다, 따라서 첫 글자도 대문자로 시작한다 

생성자는 반환 타입이 없다, 비워두어야 한다 

나머지는 메서드와 같다 

생성자 장점

InitMethod 처럼 초기화하는 메서드를 따로 만들거나 호출하지 않아도 된다 

객체를 생성할 때 직접 정의한 생성자가 있다면 직접 정의한 생성자를 반드시 호출해야 한다

-> 생성자를 사용하면 필수값 입력을 보장할 수 있다

 좋은 프로그램은 적절한 제약이 있는 프로그램이다 

기본 생성자 

매개변수가 없는 생성자를 기본 생성자라고 한다 

클래스에 생성자가 하나도 없으면 자바 컴파일러가 매개변수가 없고 코드가 없는 기본 생성자를 자동으로 만들어주고, 

생성자가 하나라도 있으면 기본 생성자를 만들어 주지 않는다 

🐣 기본 생성자를 자동으로 만들어주는 이유는, 생성자는 반드시 호출되어야 하기 때문이다 🐣 

public class MemberInit {
    String name;
    int age;
    int grade;

    MemberInit() {
        // 생성자 필요 
    }

생성자 - 오버로딩과 this() 

생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다 

package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    // 생성자 오버로딩 - 매개변수 3->2
    MemberConstruct(String name, int age) {
        this.name = name;
        this.age = age;
        this.grade = 50;
    }

    MemberConstruct(String name, int age, int grade) {
        System.out.println("생성자 호출 name = "+name+", age = "+age+", grade = "+grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

성적 입력이 필요하지 않은 경우에는 grade 가 없는 생성자를 호출할 수 있다 

/* Path - public class ConstructMain2 */
	...
	MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
        MemberConstruct member2 = new MemberConstruct("user2", 16);
        ...
        
// 출력 
이름 user1 나이 15 성적 90
이름 user2 나이 16 성적 50

this() 

생성자 내부에서 다른 생성자를 호출할 수 있다 

this 는 인스턴스 자신의 참조값을 가리킨다 

/* 첫번째 생성자 내부에서 두번째 생성자를 호출하는 메서드 */
package construct;

public class MemberConstruct {
    String name;
    int age;
    int grade;

    // 생성자 오버로딩 - 매개변수 3->2
    MemberConstruct(String name, int age) {
        this(name, age, 50); // this() 의 사용 
       // this(name, age, 50); 은 두번째 생성자를 호출하여 아래 3줄의 중복을 막았다
       // this.name = name;
       // this.age = age;
       // this.grade = 50;

    }

    MemberConstruct(String name, int age, int grade) {
        System.out.println("생성자 호출 name = "+name+", age = "+age+", grade = "+grade);
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

this() 의 규칙 

생성자 코드의 첫 줄에만 작성할 수 있다 

아래 사진에서는 생성자 코드의 첫 줄에 this 가 사용되지 않아서 컴파일 오류가 발생한다 

 

생성자는 객체 생성 직후 객체를 초기화하기 위한 특별한 메서드로 생각할 수 있다 

 


 

반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 접근 제어자  (1) 2024.12.25
[JAVA] 패키지  (1) 2024.12.19
[JAVA] 어노테이션 Annotation  (2) 2024.12.10
[JAVA] 객체 지향 프로그래밍  (5) 2024.12.06
[JAVA] 변수와 초기화  (0) 2024.12.02