개발자 미니민의 개발스터디

[JAVA] 자바 - 생성자 + 객체 생성 순서는?

by mini_min

[JAVA]
자바 - 생성자

메소드 배우면서 생성자가 객체 생성에 매우매우 중요하더라! 메소드에서 중요한 생성자에 대해 정리해보자.

 

✔️ 생성자란?

일단 특징, 리턴 타입이 없고 클래스와 이름이 동일하다.

또한, 모든 클래스는 하나 이상의 생성자가 존재한다. 생성자를 만들지 않으면 컴파일러는 아무런 기능도 하지 않는 '디폴트 생성자'가 자동으로 만들어진다.

 

디폴트 생성자 = 매개변수 즉 '인자'가 없음❌. 빈 깡통

 

◾ 생성자 만들기

new 연산자 다음에 호출!

= 이렇게 만들어진 생성자는 객체를 생성하고 초기화 작업을 담당한다.

주의 : 생성자는 일반 메소드처럼 호출할 수 없음.

public void disp() {
		// Test1(); 	//컴파일 오류. 생성자는 일반 메소드처럼 호출 불가
		System.out.println("a : " + a);
	}

// 생성자를 보통의 메소드처럼 호출하면 컴파일 오류가 발생한다.

 

 

 

✔️ 인자가 있는 생성자란?

생성자가 없으면 컴파일시 자동으로 '디폴트 생성자'가 만들어진다. 하지만, 만약 생성자가 1개라도 있다면 '디폴트 생성자'는 만들어지지 않는다.

 

어떠한 클래스에 인자가 있는 생성자 단 1개가 존재한다면, 어떻게 될까? 디폴트 생성자는 인자가 없는 생성자다.

 

💡 인자가 있는 생성자가 1개라면, 객체를 생성하고 초기화할 때, 인자가 없는 생성자는 오지 못한다!!
= 생성자에 인자가 있을 때, 인자가 없는 객체를 생성하지 못한다.
class Demo2 {
	private int a;
	
	public Demo2(int n) {
		a = n;
	}
	
	public void write() {
		System.out.println("a : " + a);
	}
	
}



// Demo2 obj = new Demo2(); //컴파일오류. 인자가 없는 생성자가 없음
		
		Demo2 obj = new Demo2(10); 
		obj.write();

위와 같이,  Demo2 클래스에 생성자는 단 1개, 인자가 있는 생성자다. (디폴트 생성자는 만들어지지 않음)

때문에, main 에서 Demo2 생성자로 객체를 만들 때, 인자가 없는 선언문은 오지 못한다. new Demo2( 인자 필수 ) !

 

 

 

✔️ 객체 생성 순서

public static void main(String[] args) {
		
		
		Test2 t = new Test2();
			//객체 메모리 할당 -> a를 0으로 초기화 -> a를 5로 초기화
		
		t.disp();
        

class Test2 {
	private int a = 5;
	public void disp() {
		System.out.println("a : " + a);
	}
}

 ◾ 객체 생성 순서
 1) new 연산자에 의해서 객체의 메모리 할당
  : a 필드가 heap 메모리 공간에 메모리를 할당 받는다.
 2) a 필드는 디폴트 값(0)으로 초기화가 된다.
 3) 생성자 몸체를 실행하여 a 필드는 5로 초기화가 된다. 
   생성자 몸체는 객체가 생성될 때 단 한번만 실행된다.
 

 

 

✔️ 생성자 중복 정의 가능?

= Yes, 생성자는 중복 (=이름이 동일하게) 정의 가능하다. 다만, 인자는 달라야겠지?

class Test3 {
	private int a;
	
	// 생성자 중복 정의 가능
	public Test3() {		//인자 없음
		a = 10;
	}
	
	public Test3(int n) {	//인자 하나인 생성자
		a = n;
	}
	
	public void disp() {
		System.out.println("a : " + a);
	}
	
	
}


public static void main(String[] args) {
		Test3 t1 = new Test3();
		Test3 t2 = new Test3(30);
		
		
		t1.disp();
		t2.disp();

	}

}

◾ 보이는 것처럼, 생성자 2개가 있는데 하나는 인자가 없고, 하나는 인자가 int 1개인 생성자이다. main 에서 객체 2개를 만들었는데 하나는 인자 없는 생성자로 만들었고, 하나는 인자 1개가 있는 생성자로 만들었다.

이렇게 생성자에 어떤 인자를 주느냐에 따라 결과가 다르게 나올 수 있으니 주의하자. 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기