웹(WEB)/자바(JAVA)

[Java] 자바 생성자, this

마달랭 2024. 12. 28. 01:51
반응형

생성자

객체를 생성할 때 호출하는 메서드이다.

new 키워드와 함께 호출되는 함수를 의미한다.

일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업의 정리이다.

 

 생성자의 특징

  • 클래스 이름과 동일해야 한다.
  • 반환 타입이 없으며, void조차 사용하지 않는다.
  • 오버로딩이 가능하여 매개변수의 개수나 타입에 따라 여러 개의 생성자를 정의할 수 있다.
  • 생성자를 정의하지 않으면 컴파일러가 기본 생성자(매개변수가 없는 생성자)를 자동으로 추가한다.
  • 생성자는 호출 시 new 키워드와 함께 사용한다.

🔄 생성자 오버로딩 (Constructor Overloading)

class Car {
    String model;
    int year;

    // 기본 생성자
    public Car() {
        this.model = "Unknown";  // 다른 생성자 호출
        this.year = 2022;
        print();
    }

    // 매개변수가 하나인 생성자
    public Car(String model) {
        this.model = model;
        this.year = 2022;
        print();
    }

    // 매개변수가 두 개인 생성자
    public Car(String model, int year) {
        this.model = model;
        this.year = year;
        print();
    }

    private void print() {
        System.out.printf("model : %s, year : %d\n", model, year);
    }
}

public class Main {
    public static void main(String[] args) {
        Car car1 = new Car();                   // 기본 생성자
        Car car2 = new Car("Tesla");            // 매개변수 하나
        Car car3 = new Car("BMW", 2021);        // 매개변수 둘
    }
}

 

클래스 인스턴스를 생성할 때 전달한 매개변수에 따라 알맞는 생성자가 실행된다.

 

 

this

참조 변수로써 객체 자신을 가리킨다.

참조변수를 통해 객체의 멤버에 접근했던 것 처럼 this를 이용해 자신의 멤버에 접근 가능하다.

 

로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타낸다.

파이썬의 self와 동일한 기능을 한다고 보면 된다.

 

this는 객체에 대한 참조이므로 static 영역에서 this 사용이 불가하다.

이유: static 메서드는 객체 없이 호출되므로 인스턴스(객체) 참조가 없기 때문

 

 

this의 주요 사용 예시

1. 멤버 변수와 지역 변수 구분

public class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;  // this.name은 멤버 변수, name은 매개변수
        this.age = age;
    }
}
  • 지역 변수(매개변수)와 멤버 변수의 이름이 같을 때, this를 사용해 멤버 변수에 접근
  • this.name은 인스턴스 변수를 가리키고, name은 지역 변수(매개변수)
  • this가 없으면 지역 변수가 우선되어 멤버 변수가 초기화되지 않음.

 

2. 다른 생성자 호출 (생성자 체이닝)

 

class Car {
    String model;
    int year;

    public Car() {
        this("Unknown", 2020);  // 다른 생성자 호출
    }

    public Car(String model, int year) {
        this.model = model;
        this.year = year;
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println(car.model + " " + car.year);
    }
}

  • this()를 사용하여 같은 클래스 내의 다른 생성자를 호출할 수 있음
  • 기본 생성자가 호출되면, this("Unknown", 2020)를 통해 다른 생성자가 먼저 실행
  • this()는 생성자에서만 사용되며, 반드시 첫 줄에 위치해야한다.

 

3. 현재 객체의 참조를 반환

class Book {
    String title;

    public Book setTitle(String title) {
        this.title = title;
        return this;  // 현재 객체의 참조 반환
    }
}

public class Main {
    public static void main(String[] args) {
        Book book = new Book();
        book.setTitle("Java").setTitle("Python");  // 메서드 체이닝
        System.out.println(book.title);
    }
}

  • 메서드 체이닝 방식으로 메서드를 연속적으로 호출할 때 사용
  • setTitle 메서드가 this를 반환하므로, 연속적인 메서드 호출이 가능

 

4. 자기 자신의 인스턴스 참조 전달

class Printer {
    public void print(Person p) {
        System.out.println(p.name);
    }
}

class Person {
    String name = "Alice";

    public void callPrint() {
        Printer printer = new Printer();
        printer.print(this);  // 현재 객체(Person)를 넘김
    }
}

public class Main {
    public static void main(String[] args) {
        Person alice = new Person();
        alice.callPrint();
    }
}

  • 메서드에 현재 객체 자체를 인자로 넘길 때 사용
  • this를 사용해 현재 인스턴스를 메서드에 전달

 

5. 내부 클래스에서 외부 클래스 참조

class Outer {
    String message = "Hello from Outer";

    class Inner {
        String message = "Hello from Inner";

        public void printMessages() {
            System.out.println(this.message);       // 내부 클래스 변수
            System.out.println(Outer.this.message); // 외부 클래스 변수
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        Outer.Inner inner = outer.new Inner();
        inner.printMessages();
    }
}

  • 내부 클래스에서 외부 클래스의 인스턴스를 참조할 때 사용
  • Outer.this를 사용해 외부 클래스의 인스턴스에 접근

 

정리

 

  • this는 현재 객체 자신을 가리키는 참조 변수
  • 주로 멤버 변수와 매개변수를 구분하거나, 다른 생성자 호출현재 객체 반환 등에 사용됨
  • static 메서드에서는 사용 불가하며, this()는 생성자의 첫 줄에서만 호출할 수 있음

 

 

728x90
반응형