프로그래밍/JAVA

18 생성자

윤지(●'◡'●) 2021. 4. 7. 17:05
반응형

 


생성자(constructor)

 

자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자라는 메소드를 제공한다.

자바에서 생성자의 이름은 해당 클래스의 이름과 같아야 합니다. ex) Car 클래스의 생성자의 이름은 Car

class Car{
	Car(){	} // 생성자

}

 

클래스 선언시 자동으로 생성자가 하나 만들어지고 코드상에는 나타나지 않는다.
이런 생성자를 기본생성자 라고 하며, 만약 직접 생성자를 선언하면 기존에 있던 기본 생성자는 사라지게 된다.

 

 

생성자의 목적

 

1. 클래스의 필드를 똑같이 복사해서 메모리에 할당해주고 할당된 필드의 주소값을 가지고 온다. 

   이 주소값을 객체에 넣어두고 사용한다(객체화)

2.  초기화의 목적

 

이전 포스팅에서 만든 TV클래스를 생각해보면, 생성자는 객체를 만들기만 했고 초기화는 따로 진행했었다.

// 객체 생성
Tv tv1 = new TV();
// 초기화
tv1.brand = "삼성";
tv1.power = "On";
tv1.channel = 7;

하지만 생성자를 이용한다면 한줄로 생성과 초기화를 할 수 있다.

TV tv1 = new TV("삼성","On",7);

 

생성자 호출과 정의

 

생성자 호출은 위에서 보여준 예제처럼 하면된다.

클래스이름 변수명 = new 클래스이름(매개변수...);
TV tv1 = new TV("삼성","On",7);

 

생성자 또한 메소드이므로 사용을 위해 먼저 정의되어야 한다. 일반 메소드와 차이는 리턴 타입이 없다는 것이다.

class TV{
	String brand;
	String power;
	int channel;
	// 정의
	TV(String brand, String power, int channel) {		
			this.brand = brand;
			this.power = power;
			this.channel = channel;
		}
}

 

여기서 처음 보는것이 등장하는데 바로 this 이다

 

this

 

클래스 선언시 내부적으로 선언되어 생성되며, 클래스 필드에서 하나의 메소드로 여러 객체를 다루어야 한다.
만약 메소드 내에서 필드를 사용하고자 할 때 어떤 객체의 필드인지를 구분할 수가 없다. 

따라서 객체를 생성하거나 마침표를 찍고 필드에  접근하는 순간 그 객체를 this 변수가 받는다. 

결과적으로 클래스 선언시 this.필드명으로 접근하면 여러 객체도 하나의 메소드에서 구분하여 다룰 수 있게된다.

 

public class Test {
	public static void main(String[] args) {
		TV tv1 = new TV("삼성", "On", 7);
        	TV tv2 = new TV("LG", "Off", 5);
       		System.out.println("tv1의 정보 : " + tv1.brand + ","+ tv1.channel+ ","+tv1.power);
		System.out.println("tv2의 정보 : " + tv2.brand + ","+ tv2.channel+ ","+tv2.power);
	}
	
}class TV{
	String brand;
	String power;
	int channel;

	TV(String brand, String power, int channel) {		
			this.brand = brand;
			this.power = power;
			this.channel = channel;
		}
}

 

예를들어, 위와 같은 예제에서 tv1 객체 초기화를 할 때는 this가 tv1를 가르키고, tv2는 this가 tv2 가르킨다고 보면된다.

출력해보면 알맞게 값이 들어간 것을 알 수 있다 :)

 

tv1의 정보 : 삼성,7,On
tv2의 정보 : LG,5,Off

 

이전 포스팅에서 만들었던 TV예제를 생성자를 넣어 수정해보자 ヾ(•ω•`)o

public class Test {

	public static void main(String[] args) {
		TV tv1 = new TV("삼성","On",7);
		TV tv2 = new TV("LG","Off",5);
		System.out.println("tv1의 정보 : " + tv1.brand + ","+ tv1.channel+ ","+tv1.power);
		System.out.println("tv2의 정보 : " + tv2.brand + ","+ tv2.channel+ ","+tv2.power);
	}
}

class TV{
	// TV의 속성(멤버변수)
		String brand;
		String power = "Off";
		int channel;
		
		public TV() {} 
		
		public TV(String brand, String power, int channel) {
	
			this.brand = brand;
			this.power = power;
			this.channel = channel;
		}

	// TV의 기능(메소드)
		void powerOn() {
			power = "On";
		}
		
		void powerOff() {
			power = "Off";
		}
		
		void channelUp() {
			++channel;
		}
		
		void channelDown() {
			--channel;
		}
}


 

위 코드를 그림으로 그려보자

 

반응형