[Java] 자바의 정석 6장 (3) - 생성자, 변수 초기화

토닉·2021년 8월 31일
0

Java

목록 보기
9/13
post-thumbnail

생성자

정의

  • 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
  • iv 를 처음 설정할 수 있다.
  • 인스턴스 생성시 수행할 작업을 설정할 수 있다.
class Time {
	int hour;
	int minute;
	int second;
}

public class Test {
	public static void main(String[] args){
		// 인스턴스 생성
		Time t1 = new Time();
		// 인스턴스 변수 초기화
		t1.hour = 12;
		t1.minute = 24;
		t1.second = 36;
	}
}

위처럼 작성하면 생성과 초기화가 분리되어 있어서 불편합니다.

class Time {
    int hour;
    int minute;
    int second;
    
    Time(int hour, int minute, int second) { // 생성자
        this.hour = hour;
        this.minute = minute;
        this.second = second;
    }
}

위처럼 생성자를 작성하면 인스턴스를 생성함과 동시에 인스턴스 변수를 초기화(설정) 할 수 있습니다.

규칙
1. 이름이 클래스 이름과 같아야 한다.
2. 리턴값이 없다.(void를 안붙인다.)
3. 생성자가 하나도 없을 경우 컴파일러가 자동으로 기본 생성자를 만들어 준다.
4. 생성자는 여러 개 만들 수 있다.(단 오버로딩 규칙에 적합할 때)
5. 기본 생성자를 자동으로 만들어 주지만 직접 작성하는 습관을 들이는 것을 추천한다!

class Card {
	
	Card(){} // 매개변수 없는 생성자

	Card(String kind, int number){ // 매개변수 있는 생성자
		// 인스턴스 초기화 작업
	}
}

생성자 this()

정의

  • 생성자에서 다른 생성자 호출할 때 사용
  • 다른 생성자 호출시 첫 줄에서만 사용 가능

목적

  • 여러 개의 생성자에 중복된 코드를 없애기 위해서
class Test {
	public static void main(String[] args) {
		MyCar c1 = new MyCar();
		MyCar c2 = new MyCar("black");
		MyCar c3 = new MyCar("red", "stick", 2);
		System.out.println("c1");
		c1.printIV();
		System.out.println("c2");
		c2.printIV();
		System.out.println("c3");
		c3.printIV();
	}
}

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

	MyCar() {
		this("white", "auto", 4); // 생성자 호출( default 값 )
	}

	MyCar(String color) {
		this(color, "auto", 4); // 생성자 호출( 특정 변수 수정 )
	}

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

	void printIV(){
		System.out.println("color = " + color);
		System.out.println("gearType = " + gearType);
		System.out.println("door = " + door);
	}

}

>> c1
>> color = white
>> gearType = auto
>> door = 4
>> c2
>> color = black
>> gearType = auto
>> door = 4
>> c3
>> color = red
>> gearType = stick
>> door = 2

MyCar() MyCar(String color) 에 작성된 this(매개변수1,매개변수2,매개변수3)
MyCar(String color, String gearType, int door)를 뜻합니다.

참조변수 this

this()와는 생김새가 비슷할 뿐 완전히 다른 것이다.

정의

  • 인스턴스 자신을 가리키는 참조변수
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
class Car {
	String color;
	String gearType;
	int door;
	
	Car(String color, String gearType, int door){
		// this.변수는 인스턴스 변수 / 변수는 매개변수(지역변수)
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

만약 생성자 안에서 this로 변수를 구분하지 않는다면 매개변수와 인스턴스 변수를 구분하지 못할 것 입니다.
이를 구분하기 위해 인스턴스 변수에 this를 붙입니다.

변수 초기화

클래스 변수(cv) 와 인스턴스 변수(iv) 의 초기화 방법은 3가지가 있습니다.
1. 자동 초기화( x )
2. 간단 초기화( = )
3. 복잡 초기화( {}, static {} )

class Data {
	int x;
	int y = x; // x == 0

	void method1() {
		int i;
		int j = i; // 에러.. 지역변수를 초기화하지 않고 사용
	}
}

지역 변수는 직접 초기화(간단 초기화)를 하지 않으면 사용할 수 없다.
반면 cv, iv는 자동으로 초기화 값이 할당되어 사용할 수 있다.

자료형 별 초기화 값

멤버변수의 초기화

1. 명시적 초기화(=)<단순 초기화>

class Car {
	int door = 4; // 기본형 변수의 초기화
	Engine e = new Engine(); // 참조형 변수의 초기화
}

2. 초기화 블럭<복잡 초기화>

  • 인스턴스 초기화 블럭(iv) : {}
  • 클래스 초기화 블럭(cv) : static {}

인스턴스 변수 초기화 시점: 인스턴스가 생성될 때 마다

클래스 변수 초기화 시점: 클래스가 처음 로딩될 때 딱 1번(메모리에 올라갈 때)

3. 생성자(iv)<복잡 초기화>

class Test {
	static int cv = 1; // 명시적 초기화
	int iv = 1; // 명시적 초기화
	
	static { // 클래스 초기화 블럭
		cv = 2;
	}
	
	{ // 인스턴스 초기화 블럭
		iv = 2;
	}
	
	Test { // 생성자(iv 초기화)
		iv = 3;
	}

}

초기화 순서

1. cv -> iv
2. 자동 -> 간단 -> 복잡

profile
우아한테크코스 4기 교육생

0개의 댓글