우당탕탕 개발 블로그 도전기

[Java] 생성자 함수와 'this' 본문

Java

[Java] 생성자 함수와 'this'

나루나른 2024. 3. 23. 18:31

https://narunarus.tistory.com/11

 

03.20~03.21[Java]

03.20(수) ● Java 생성자 함수 Java에서 생성자 함수(Constructor)는 객체가 생성될 때 자동으로 호출되는 특별한 유형의 메서드이다. 주로 객체를 초기화하는 데 사용함. 객체의 field(변수)에 초기값을

narunarus.tistory.com

 

생성자 함수란?

Java에서 생성자 함수(Constructor)는 객체가 생성될 때 자동으로 호출되는 특별한 유형의 메서드이다. 주로 객체를 초기화하는 데 사용함. 객체의 field(변수)에 초기값을 할당하는 작업을 수행한다. 생성자는 기본적으로 클래스의 이름과 동일한 이름을 가지며, 리턴 타입을 지정하지 않음.

overroding이 가능하며, 같은 이름의 생성자를 여러개 정의해 이를 통해서 다양한 방식으로 객체를 초기화 할 수 있다.

 

생성자의 특징으로는

1. 클래스의 이름과 동일 :  생성자의 이름은 클래스 이름과 동일해야한다.

 

2. 리턴 타입이 기본적으로 없다 :

생성자는 리턴 타입을 갖지 않으며, 심지어 return할 값이 없다는 의미인 'void' 조차 사용하지 않음.

 

3.  자동 호출 : 객체가 생성될 때 자동으로 호출된다.

상속으로 보는 자동 호출의 예)

class Animal {
    Animal() {
        System.out.println("Animal 생성자가 호출되었습니다.");
    }
}

class Dog extends Animal {
    Dog() {
        // 여기에서 super()가 자동으로 호출됨
        System.out.println("Dog 생성자가 호출되었습니다.");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog myDog = new Dog(); // Dog 객체를 생성합니다.
        // 출력:
        // Animal 생성자가 호출되었습니다.
        // Dog 생성자가 호출되었습니다.
    }
}

 

자바 콘솔창에서의 출력 결과

Dog 클래스의 객체를 생성할 때, Dog 클래스의 생성자가 자동으로 Animal 클래스의 생성자를 호출한다. (super()를 통해)  super는 기본적으로 생략이 가능하며, 이는 Java에서 상속 구조에 있는 객체를 생성할 때 부모 클래스의 생성자가 먼저 호출되어야 하는 것을 의미한다.

 

4. 오버로딩 가능

같은 이름의 생성자를 여러 개 정의할 수 있으며, 이를 통하여 다양한 방식으로 객체를 초기화할 수 있다.

 

오버로딩(Overloading)이란?

같은 이름의 메서드를 한 클래스 내에 여러 개 정의하는 것을 의미, 각 메서드는 매개변수의 타입, 개수, 순서가 달라야한다. 오버로딩을 사용하면 같은 기능을 하는 메서드에 대해 다양한 유형의 매개변수를 제공할 수 있어 프로그램의 가독성과 재사용성이 향상된다.

오버로딩의 규칙

  1. 메소드 이름이 같아야 한다.
  2. 매개변수의 리스트가 달라야 한다. 이는 매개변수의 개수나 타입, 혹은 이들의 순서가 다를 수 있음을 의미함.
  3. 반환 타입, 접근 지정자, 예외는 오버로딩을 구분하는 데 영향을 주지 않는다. 즉, 이들은 오버로딩된 메소드들 사이에 달라도 되며, 이러한 차이만으로는 오버로딩이라고 볼 수 없다.

오버 로딩의 예)

public class Calculation {

    // 첫 번째 add 메서드: 두 정수의 합을 계산
    //add 메서드의 첫 번째 오버로딩으로 두 개의 int 타입 매개변수를 받아 이들의 합을 int 타입으로 반환
    public int add(int a, int b) {
        return a + b; //a+b의 합을 반환함
    }

    // 두 번째 add 메서드: 세 정수의 합을 계산 (오버로딩)
    //두 번째 오버로딩, 세 개의 int 타입 매개변수를 받아서 이들의 합을 int 타입으로 반환함.
    //첫번 째 add 메소드와 이름은 같지만 매개변수의 개수가 다르다.
    public int add(int a, int b, int c) {
        return a + b + c;
    }

    // 세 번째 add 메서드: 두 실수의 합을 계산 (오버로딩)
    //두개의 double 타입 매개변수를 받아와 이들의 합을 double형으로 반환한다.
    //다른 두개의 add 메소드와 이름은 같지만, 매개변수의 타입이 다름
    public double add(double a, double b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
    	//Caluclation 클래스의 인스턴스를 생성 후 , calc를 참조변수로 가르킴
        Calculation calc = new Calculation();
        
        //각각의 calc 참조변수에 합을 더한다.
        System.out.println(calc.add(2, 3)); // 두 정수의 합
        System.out.println(calc.add(2, 3, 4)); // 세 정수의 합
        System.out.println(calc.add(2.5, 3.5)); // 두 실수의 합
    }
}

 

예시에서는 'add'라는 공통의 이름을 가진 메소드 이지만, 각각 다른 자료형과 매개변수의 값을 가지며 다른 동작을 하는 것을 알 수 있다.(Overroading 의 특징 중 재사용성의 증가를 나타냄)

 

 

'this' 란?

'this'  현재 객체, 즉 현재 인스턴스를 가리키는 데 사용된다. this는 주로 현재 클래스의 인스턴스 변수나 메서드를 다른 메서드나 생성자에서 참조할 때 사용함.

 

this는 주로 다음과 같은 상황에서 유용하다.

1. 현재 클래스의 필드(멤버 변수)와 매개변수 이름이 같을 때 구별하기 위해

2. 현재 클래스의 다른 생성자를 호출할 때

3. 메서드에서 현재 객체를 반환할 때

public class Person {
    private String name;
    private int age;

    // 생성자에서 this 키워드 사용
    public Person(String name, int age) {
    	//매개변수로 받은 name, age를 현재 필드의 name과 age에 할당함
        //여기서 this의 경우는 현재 생성되고 있는 Person 객체를 가리킨다.
        this.name = name;
        this.age = age;
    }

    // 메서드에서 다른 메서드 호출에 this 키워드 사용
    public void printInfo() {
    
    //printInfo 메서드 내에서 this를 명시하지않고 printName()과 printAge() 메서드를 호출 
    //여기서 this는 생략 가능하다. this.printName()과 this.printAge()로 작성해도 동일하게 
    //현재 인스턴스의 printName과 printAge 메서드를 호출함.
        printName();
        printAge();
    }

    public void printName() {
        System.out.println(this.name);
    }

    public void printAge() {
        System.out.println(this.age);
    }

    // this를 반환하는 메서드
    public Person updateAge(int age) {
    
    //pdateAge 메서드는 age 필드의 값을 업데이트하고, 현재 객체(this)를 반환함
        this.age = age;
        return this;
    }

    public static void main(String[] args) {
    	//Person 객체를 생성하여 생성 초기값을 John Doe, 30으로 지정함
        Person person = new Person("John Doe", 30);
        person.printInfo(); // 초기값 John Doe와 30을 출력
        person.updateAge(31).printInfo(); // 나이를 31로 업데이트하고, 다시 정보를 출력함
    }
}

 

 

이 예제를 통해  this 키워드가 현재 객체의 인스턴스 변수에 접근하기 위해 어떻게 사용되는지 보여준다.