JAVA

생성자와 this 개념정리

solytory 2025. 6. 24. 11:40

생성자(Constructor)란?

생성자는 객체가 생성될 때 호출되는 특별한 메서드로, 객체의 초기상태(속성)를 설정하는 역할을 해준다.

 

생성자 특징 7가지

1. new 연산자에 의해서 호출이 된다.

2. 자신이 가지고가 쓴 멤버들을 메모리에 올려 객체를 생성하는 역활을 한다.

3. 메서드의 이름은 클래스이름과 동일해야 한다.

4. 접근제한자가 public인 경우에만 호출이 된다. 

5. 모든 클래스는 기본생성자(default constructor)를 가지고 있다.

6. 객체의 초기화를 위해서 사용된다.

7. 리턴 타입이 없다. (즉, void를 사용하지 않는다.)

 

// class로 Car 설계
public class Car {
    String color; // 자동차의 색상
    int speed; // 자동차의 속도
    int wheelCount; // 바퀴 갯수
    void drive() {
        System.out.println("자동차가 달립니다.");    // 자동차의 동작
    }
    void stop() {
        System.out.println("자동차가 멈춥니다.");    // 자동차의 동작
    }
}

// 생성자로 Car 실체 생성
public class CarSample {
    public static void main(String[] args) {
        Car c = new Car(); // 인스턴스 생성
    }
}

 

위에 코드를 통해 알 수 있는 부분은

1. Car class에서 Car라는 메서드가 있는가?  -> 존재하지 않음

2. 근데 어떻게 생성자를 통해 Car()라는 메서드를 호출할 수 있는가? -> 기본생성자가 존재하기 때문

 

즉 우리가 코드상으로 확인이 되지 않아도 생성자를 통해 생성된 인스턴스에는 클래스명과 같은 생성메서드가 존재하고 이를 코드로 보면 아래와 같다.

public class Car {
    String color; // 자동차의 색상
    int speed; // 자동차의 속도
    int wheelCount; // 바퀴 갯수
    public  Car(){
        
    }
    void drive() {
        System.out.println("자동차가 달립니다.");    // 자동차의 동작
    }
    void stop() {
        System.out.println("자동차가 멈춥니다.");    // 자동차의 동작
    }
}

 

위에 코드에서 보는 것처럼 Car(){}라는 기본생성자가 존재하며 리턴타입이 존재하지 않아서 void 등 타입값을 작성하지 않아도 된다는 것을 알 수 있다.

 

 

this란?

this는 현재 생성되고 있는 객체(인스턴스) 자신을 가리키는 참조 변수(예약어)다. 

즉, 객체가 생성자로 인해 인스턴스화되었을 때 자기 자신의 메모리 주소를 가지고 있는 키워드라고 말할 수 있다.

 

this의 4가지 역할

1. 멤버 변수와 매개변수 이름이 같을 때 구분자 역할을 해준다. 

 - 기본값을 지정해주지않는 것도 필요해서 메서드 오버로딩을 통해 기본생성자 메서드 2개 작성

// 클래스
public class Car {
    String color;
    Car() {
    }
    // 매개변수 이름이 멤버 변수와 같을 때
    Car(String color) {
        this.color = color; // this.color: 멤버 변수, color: 매개변수
    }

    void printColor() {
        System.out.println("자동차 색상: " + color);
    }
}

// 객체 실체화
public class CarSample {
    public static void main(String[] args) {
        Car c = new Car(); 
        c.colorPrint(); // null
        Car c2 = new Car("red");
        c2.colorPrint();  // red

    }
}

 

 

 

2. 자기 자신의 메모리를 가리킨다.

// 클래스 
public class Car {
    void printThis() {
        System.out.println("나의 주소값: " + this); // this: 자기 자신의 참조값
    }
}

// 객체
public class CarSample {
    public static void main(String[] args) {
        Car c = new Car(); 
        c.printThis(); // 결과 -> 나의 주소값: Car@5acf9800
    }
}

 

 

3. 생성자에서 다른 생성자를 호출할 경우 사용한다.

// 클래스
public class Car {
    String color;
    int speed;

    // 기본 생성자 → 다른 생성자를 호출
    Car() {
        this("흰색", 0); // 아래 생성자를 호출
    }

    // 매개변수 있는 생성자
    Car(String color, int speed) {
        this.color = color;
        this.speed = speed;
    }

    void printInfo() {
        System.out.println(color + " 자동차, 속도: " + speed);
    }
}

//객체
public class CarSample {
    public static void main(String[] args) {
        Car c = new Car(); // 인스턴스 생성
        Car c2 = new Car("파란색", 1000);
        c.printInfo(); // 결과 -> 흰색 자동차, 속도: 0
        c2.printInfo();// 결과 -> 파란색 자동차, 속도: 1000
    }
}

 

 

4. 인스턴스 자신의 주소를 반환할 때 사용한다. (메서드 체이닝)

- setSpeed 메서드에 매개변수를 통해 speed의 값을 100으로 지정하고 그 값을 가지고 있는 주소를 반환받을 수 있으며 2번째 (.)을 사용한 메서드 체이닝으로 사용할 수 있다. 

// 클래스
public class Car {
    int speed;

    // this를 리턴하면 메서드 체이닝 가능
    Car setSpeed(int speed) {
        this.speed = speed;
        return this;
    }

    Car accelerate() {
        this.speed += 10;
        return this;
    }

    void run() {
        System.out.println("현재 속도: " + speed + "km/h");
    }
}


//객체
public class CarSample {
    public static void main(String[] args) {
        Car c = new Car(); // 인스턴스 생성
        c.setSpeed(100);
        c.run(); // 결과 -> 현재 속도: 100km/h
        c.setSpeed(100).accelerate().run(); // 결과 -> 현재 속도: 110km/h
    }
}

 

참고 블로그 : https://choicode.tistory.com/24