[JAVA]생성자

진섭·2023년 5월 11일
0
post-thumbnail

생성자

자바의 정석 책과 안드로이드 앱스쿨에서 공부한 내용을 정리한 내용입니다.

 

생성자란?

생성자는 쉽게 풀어쓰면 인스턴스가 생성될 때 호출되는 인스턴스를 초기화 해주는 메서드이다. 저희가 인스턴스를 생성할 때 Tv t = new Tv(); 이런식으로 생성을 하는데 TV()가 생성자 메서드를 호출하는 것이다.
이게 무슨 말이냐? 할 수 있는데 컴파일러가 클래스에 생성자가 없을 경우에는 자동적으로 매개변수가 없는 생성자를 만들어 주기 떄문에 가능한 일이다.
생성자는 다음과 같은 조건을 가지고 있다.
1. 생성자는 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴이 없다.

이제 다시 Tv t = new Tv(); 이 부분을 설명을 하자면
1. new에 의하여 메모리에 Tv클래스의 인스턴스가 생성이 되고
2. 생성자 Tv()는 컴파일러가 생성자가 없다면 자동으로 만들어 준 Tv()를 호출 하고
3. 연산자 new의 결과로,생성된 Tv인스턴스의 주소가 반환되어 참조변수 t에 저장이 된다.

인제 생성자를 사용을 해보자면 아래의 코드 처럼 작성을 해주면 됩니다.

class Car{
	String color;//색상
	String gearType;//변속기의 타입
	int door; //문의 갯수
	
	Car(){}//컴파일러가 자동으로 만들어주는 기본 생성자
	Car(String c, String g, int d){
		color =c;
		gearType =g;
		door =d;
	}
}

이렇게 생성자를 만들어 놓고 main()에서 아래와 같은 코드로 값을 초기화 해줄 수 있어요.

Car c = new Car("white","auto",2);

당연한 애기지만 Car 클래스안에 Car 메서드가 2개가 있는게 가능한 이유는 오버로딩의 개념이 있기 떄문에 가능해요.

 

this(), this

같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자간에도 서로 호출이 가능하다 합니다. 아래와 같은 조건을 만족해야 합니다.

  1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.그 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들이 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이죠.
public class MainClass {

	public static void main(String[] args) {
		Car c1 = new Car();
		Car c2 = new Car("blue");
		
		System.out.println(c1.color +" "+ c1.gearType+" "+c1.door);
		System.out.println(c2.color +" "+ c2.gearType+" "+c2.door);
	}

}

class Car {
	String color;
	String gearType;
	int door;

	Car() {//c1
		this("white", "auto", 4);
	}

	Car(String color) {//c2
		this(color, "auto", 4);
	}

	Car(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}

}

먼저 Car 클래스 부터 살펴보면 color, gearType,door 색상,기어타입,문 갯수 이렇게 멤버변수로 속성을 정해주었고

매개변수가 없는 Car()에서 this()를 통해 Car(String color, String gearType, int door)를 호출 하였습니다. 그러면 main()으로 올라가 Car c1 = new Car();와 같이 생성자 Car()를 사용해서 Car 인스턴스를 생성한 경우에 인스턴스변수는 "white", "auto", 4 값을 가지게 됩니다.
두 번째 코드는 Car c2 = new Car("blue");는 blue의 값이 color의 매개변수를 만나 blue, "auto", 4 값을 가지게 된다.

정리를 하자면 this는 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.모든 인스턴스메서드에 지역변수로 숨겨진채로 존재한다.
this().this(매개변수)는 생성자,같은 같은 클래스의 다른 생성자를 호출할 때 사용한다.

0개의 댓글