java

java_6_ 클래스 구성 (생성자)

-JUNHEOK- 2021. 10. 14. 12:20

 

 

생성자

 

객체 생성시에 자동을 호출되는 메소드이다. 

new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

new 연산자는 힙영역에 객체를 생성되고 객체의 주소가 리턴된다. 리턴된 객체의 주소는 클래스 타입 변수에 저장되어

객체에 접근할 때 이용된다.

 

Void A() {
}

리턴 타입이 있을 시에 생성자가 될 수 없다. 기본 메소드이다. 

 

 

 

기본생성자 (default constructor) 

 

컴파일시에 생성자가 없으면 매개변수 없는 생성자를 자동 포함시킨다. 

 

클래스이름() {}

A() {}

 

 

기본생성자는 항상 만들어주는 것을 장려한다. 컴파일러가 자동생성하는 것으로 의지할 수 있지만, 제대로된 클래스라면 기본 클래스를 만들어 준다. 

 

자동으로 생성 =  클래스에 생성자를 선언하지 않아도 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있다.

그러나 클래스에 명시적으로 선언한 생성자가 한개라도 있으면, 컴파일러는 기본 생성자를 추가하지 않는다. 

명시적으로 생성자를 선언하는 이유는 객체를 다양하게 초기화하기 위해서이다. 

 

 

 

package oop;   

class Rectangle {
	int width;
	int height;
	int area;

	Rectangle() {}
	Rectangle(int width, int height) {
		this.height = height;
		this.width = width;
	}
	Rectangle(int length) {
		//this.height = length;  //중복코드
		//this.width = length;
		this(length, length);  //this생성자호출: 현재객체가 갖는 다른 생성자를 호출한다. 
	}							//			 생성자에서만 호출할 수 있다. 생성자의 처음에 와야한다. 
	void makeArea() {
		this.area = width * height;
	}
	void printInfo() {
		System.out.println("가로" + width + ",세로" + height + "인사각형의 면적은 " + area + "입니다");
	}
}

public class Constructor {
	public static void main(String[] args) {
		//완성하고 실행했을 경우 출력결과가 가로3, 세로4인 사각형의 면적은 12입니다.	
									// 가로가 5인 사각형의 면적은 25입니다.
		Rectangle r1 = new Rectangle(3,4); //가로길이가 3, 세로길이가 4인 사각형객체
		Rectangle r2 = new Rectangle(5); //가로길이와 세로길이 5인 사각형객체 
		
		r1.makeArea();  //사각형의 면적을 계산한다.
		r1.printInfo();  //"가로3, 세로4인 사각형의 면적인 12입니다"를 출력한다.
		r2.makeArea();	//사각형의 면적을 계산한다.
		r2.printInfo();	//"가로5, 세로5인 사각형의 면적은 25입니다"를 출력한다.
	}
}

 

 

int width;
int height;
int area;

위 코드를  아래  그림과 같이 힙(heap) 안에 Rectangle 이 할당되고 그 안에  width, weight, area 와 데이터 타입이 int이기 때문에 0이 적재된다. 메소드는 선언부만 적제된다. 

 

 

Rectangle r2 = new Rectangle(5);

r2 가 heap영역에 있는 Rectangle를  그림과 같이 대입할 수 있도록 한다. 

5 의 값을 heap 에 있는 Rectangle(int) 에 값이 들어가며 classArea로 가서 호출이 이뤄진다. 

 

 

 

this 생성자 호출

this 생성자 호출은 현재 객체가 갖는 다른 생성자 호출을 할 수 있다.

 

 

Rectangle() {}
	Rectangle(int width, int height) {
		this.height = height;
		this.width = width;
	}
	Rectangle(int length) {
		//this.height = length;  //중복코드
		//this.width = length;
		this(length, length);  //this생성자호출: 현재객체가 갖는 다른 생성자를 호출한다. 
	}							//			 생성자에서만 호출할 수 있다. 생성자의 처음에 와야한다.

  Rectangle(int length) 에 5가 들어간다. 여기서 위의 메소드와 중복된 코드를 볼 수 있다.  이부분의 코드를 수정하자면 

 

 

this(length, length);

이러한 코드로 바뀌게 할 수 있다. 그렇게 되면 Rectangle(int width, int height) 로 가서 호출을 할 수 있게 된다. 

 

 

 

 

결과값

가로3,세로4인사각형의 면적은 12입니다
가로5,세로5인사각형의 면적은 25입니다