생성자 (Constructor)

 

 

“ 인스턴스가 생성될 때 인스턴스를 초기화 하는 메소드 “

 

 

클래스 구성요소 중 하나로 클래스를 생성하는 역할

생성자가 인스턴스를 만드는 명령어는 아님

new 키워드가 클래스의 인스턴스를 만들때 사용됨

 

클래스 이름(){

}

 

 

🌟 생성자도 오버로딩이 가능함

 

 

메소드와 다른점

 

1. 리턴을 하지 않는다

2. 생성자 이름은 반드시 클래스 이름과 동일해야 한다

     ➡️ 클래스명과 다르면 일반 메소드가 된다

 

 

 

생성자가 왜 필요한가?

 

➡️ 클래스를 처음 만들 때 멤버 변수나 상수를 초기화해서 여러개의 객체를 생성할 때 시간을 단축!

 

 

 

 

기본 생성자 / 매개변수가 있는 생성자

 

 

기본 생성자(default constructor)

 

➤ 모든 클래스 내부에는 생성자가 반드시 1개 이상 있어야 함

➤ 생성자가 없는 클래스는 프로그램 실행할 때 컴파일러가 자동으로 기본 생성자 생성

         → 생성자를 작성한 경우에는 디폴트 생성자 제공하지 않음

➤ 기본 생성자 직접 작성해도됨 ‘클래스() {}’

➤ 매개변수와 구현코드가 없음

 

 

매개변수가 있는 생성자

 

➤ 매개변수를 통해서 생성과 동시에 속성 값을 같이 넣어줄 수 있다.

➤ 기본 생성자로 만들고 ‘객체이름.변수’로 속성값 하나하나 지정해주는 것 보다 훨씬 편리함

 

 

 

 


 

 

 

this

 

▶️ this는 생성된 인스턴스 스스로를 가르키는 예약어

▶️ this는 쓰임새가 총 3가지 있음

 

 

1. 자신의 인스턴스 변수를 가르키는 this

 

인스턴스 변수와 지역변수 이름을 같게 하면 혼동됨

 

휴대폰을 예시로 들어서  클래스를 작성해보았다.

 

public class Phone {
	// 필드
	private String company;
   	private static int serialNum = 10000;
  	private String modelName;
   	private int modelNum;
	
	// 생성자
	Phone(String company, String modelName){
		// 잘못된 예시
		company = company;	
		modelName = modelName;
		modelNum = Phone.serialNum;
		Phone.serialNum += 1000;
	}
    
	// 메소드
	public String getCompany() {
        return company;
	}
	public String getModelName() {
        return modelName;
	}
	public int getModelNum() {
        return modelNum;
	}
}

 

Phone의 생성자를 보면 지역 변수와 인스턴스 변수 이름이 같다.

이런식으로 작성하면 컴파일러는 양쪽 다 지역변수로 생각한다.

 

main 클래스를 만들고 출력해보자

 

public class PhoneTest {
    public static void main(String[] args) {
        Phone iPhone11Max = new Phone("Apple", "iPhone11Max");

        System.out.println(iPhone11Max.getModelName() + "의 정보");
        System.out.println("제조사 : " + iPhone11Max.getCompany());
        System.out.println("모델넘버 : " + iPhone11Max.getModelNum());    }
}

 

<실행 결과>

null의 정보
제조사 : null
모델넘버 : 10000

 

실행 결과를 보면 지역 변수명과 인스턴스 변수명이 같은 변수는 인스턴스의 변수에 제대로 값이 저장이 안되서 null로 뜨는 것을 확인할 수 있다.

자바에서는 일반적으로 인스턴스 변수와 생성자의 지역변수 명을 똑같이 작성하는데

이럴때 인스턴스 변수와 지역변수를 컴파일러가 구분할 수 있게 'this.변수명' 을 사용한다.

이때 사용하는 this는 자신의 인스턴스를 가르킨다.

지역 변수가 아닌 인스턴스 내에 있는 해당 변수를 사용하는 것이다.

 

클래스의 생성자 부분을 이렇게 고치고 실행해보자

Phone(String company, String modelName) {
	this.company = company;
	this.modelName = modelName;
	this.modelNum = Phone.serialNum;
	Phone.serialNum += 1000;
}

 

<실행 결과>

iPhone11Max의 정보
제조사 : Apple
모델넘버 : 10000

this를 사용해서 구분해주면 지역변수가 인스턴스 변수에 올바르게 대입된 것을 확인할 수 있다.

 

 

 

2. 생성자에서 다른 생성자를 호출하는 this()

 

this()는 객체 내부에서 같은 객체 내부의 생성자를 호출하는 메소드이다.

반드시 생성자 내부에만 사용하고 생성자의 첫 줄에 위치해야한다.

생성자가 여러개 있으면 원하는 생성자의 매개변수에 맞춰서 괄호()안에 넣어주면 된다.

 

예시)

public class ThisExample {
    int num;
    String name;
    public ThisExample() {
        this(1, "None");
    }
    public ThisExample(int num, String name) {
        this.num = num;
        this.name = name;

    }
}

this(1, "None") 은 ThisExample(int num, String name) 생성자를 호출

num 변수에 1을, name변수에 "None"을 대입시킨다.

 

public class ThisTest {
    public static void main(String[] args) {
        ThisExample example1 = new ThisExample();
        ThisExample example2 = new ThisExample(10, "김철수");

        System.out.println(example1.name + ", " + example1.num);
        System.out.println(example2.name + ", " + example2.num);
    }
}

 

<실행 결과>

None, 1
김철수, 10

 

 

 

3. 자신의 주소를 가르키는 this

 

객체 내부에서 this 는 인스턴스의 주소를 가르키는 역할도 한다.

주소를 리턴하는 경우는 잘 사용하지 않는다.

 

 

ThisExample 클래스에 주소를 리턴하는 메소드를 작성해 보았다.

ThisExample address() {
   return this;
}

 

 

public static void main(String[] args) {
        ThisExample example3 = new ThisExample();
        System.out.println(example3.address());
        System.out.println(example3);
}

객체를 그대로 출력해도 주소값을 얻을 수 있다.

 

<실행결과>

constructor.ThisExample@6ad5c04e
constructor.ThisExample@6ad5c04e

실행해보면 인스턴스가 저장된 주소가 출력된다.

주소 앞에 constructor은 패키지 이름이고 ThisExample은 클래스 이름이다.

 

 

읽어주셔서 감사합니다 ❤️