생성자
객체 생성시에 자동을 호출되는 메소드이다.
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입니다
'java' 카테고리의 다른 글
java_7_예약어 (접근제어자) & 캡슐화 (0) | 2021.10.18 |
---|---|
java_6_ static (0) | 2021.10.14 |
java_5_ 클래스 구성 (필드 , 메소드, 오버로딩) (0) | 2021.10.13 |
Selection Sort & Bubble Sort (0) | 2021.10.13 |
java_4_객체와 클래스 (메모리영역) 실습 (0) | 2021.10.12 |