[Java] 생성자와 this,this()

peace w·2023년 10월 30일
0

Java

목록 보기
5/6

생성자

  • 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
  • 인스턴스 생성 시 수행할 작업에 사용됨

특징

  • 생성자의 이름클래스 이름동일해야 한다.
  • 생성자는 다른 멤버함수(메소드)와는 다르게 리턴 타입이 없다.(반환값이 없으므로 void를 붙이지 않음)
  • 생성자는 클래스에 최소 1개는 있어야 하며, 생성자 코드가 없을 경우 컴파일러가 기본생성자를 자동으로 생성한다.
    (기본생성자 : 매개변수가 없는 생성자)
  • 하나의 클래스 안에 같은 이름의 생성자를 매개변수 조건에 따라 여러개를 작성할 수 있다. (오버로딩이 가능)

※ 주의: 생성자 코드가 1개라도 작성되어 있다면, 컴파일러는 기본생성자가 없다고 하더라도 기본생성자를 자동으로 생성하지 않는다.

class Data_1 {
	int value;
    // Data_1() {} 기본 생성자를 자동으로 추가해줌
}
class Data_2 {
	int value;
    // Data_2() {} 기본 생성자를 넣어줘야함
    Data_2(int x){
    	value = x;
    }
}
class test {
	public static void main(String[] args) {
    	Data_1 d1 = new Data1();
        Data_2 d2 = new Data2();	// 컴파일 에러 발생
    }
}

// The constructor Data_2() is undefined
// 첫번째 클래스는 생성자가 없어서 기본생성자를 자동으로 추가해주지만,
// 두번째 클래스는 생성자가 1개 있기 때문에 기본생성자가 추가해주지 않음. 그래서 직접 넣어야됨.

-> 따라서 기본생성자를 항상 넣어주는 습관이 필요하다

매개변수가 있는 생성자

class Car {
	String color; // 인스턴스 변수
    String gearType;
    int door;
    
    Car() {} // 기본생성자
    Car(String c, String g, int d) { // 매개변수가 있는 생성자
    	color = c;
        gearType = g;
        door = d;
    }
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 생성자가 없다면 이렇게 인스턴스 변수를 초기화해야하지만

Car c = new Car("white", "auto", 4);
// 생성자를 만들면 간단하게 쓸 수 있다.

생성자 this()

  • 같은 클래스에서 생성자가 다른 생성자를 호출할 때 사용(클래스 이름 대신 this 사용 하는 것.)
  • 코드의 중복 제거를 위함.
  • 다른 생성자 호출 시, 반드시 첫 줄에서만 가능
class Car {
	String color;
    String gearType;
    int door;
    
    Car() {
    	color = "white"; // 디폴트 값이 된다.
        gearType = "auto";
        door = 4;
    }
    
    Car(String c, String g, int d) {
    	color = c;
        gearType = g;
        door = d;
    }
}

위에 있는 Car() 생성자와 아래에 있는 Car(String c, String g, int d) 생성자 간의 코드가 중복된다. 이 중복을 줄이기 위해 위에 있는 생성자에서 아래에 있는 생성자를 호출하도록 바꿔보자.

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

this() 생성자를 사용해서 코드의 중복을 제거한 모습이다.

참조변수 this

  • 생성자 this()와 전혀 다름
  • 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음.
  • 선언하지 않아도 인스턴스 메서드(생성자 포함)에서 사용 가능
  • 클래스 메서드(static 메서드)에서는 사용 불가
  • 지역변수와 인스턴스 변수를 구별할 때 사용
  • 같은 클래스 안에서는 생략가능하나, 지역변수와 인스턴스 변수가 이름이 같다면 this를 써서 구별을 해주어야 함.
class MyMath2 {
	long a, b; // 인스턴스 변수, this.a, this.b 이나 생략가능
    
    MyMath2(int a, int b) { //  생성자
    	this.a = a; // this.a 인스턴스 변수, a 지역변수
        this.b = b; // this.b 인스턴스 변수, b 지역변수
    }
    long add() { // 인스턴스 메서드
    	return a + b; // return this.a+ this.b;
    }
    static long add(long a, long b) { // 클래스 메서드(static 메서드)
    	return a + b; // this. 사용 불가
    }
}

[자바의 정석 - 기초편]ch6-32~35 생성자, 기본 생성자
[자바의 정석 - 기초편] ch6-36,37 생성자 this(), 참조변수 this
[Java] 자바 - 생성자의 목적, 특징, 사용법 (Constructor)

profile
더 성장하자.

0개의 댓글