Post

생성자와 this


생성자

  • 인스턴스(객체)가 생성될 때 호출되는 인스턴스(객체) 초기화 메서드
  • 인스턴스 초기화란 인스턴스 변수들을 초기화하는 것
  • 대부분 객체의 초기화를 목적으로 사용한다

인스턴스 생성 과정

graph LR
A(new연산자를 통해서 메모리heap영역에 인스턴스 생성)-->B(생성자가 호출되어 실행)-->C(new연산자 결과로 해당 객체의 주소가 변환되어 참조변수에 저장된다)

생성자의 제약조건

  • 생성자의 이름은 클래스의 이름과 같아야한다
  • 생성자는 다른 함수와는 다르게 리턴 값이 없다
  • 생성자는 객체가 생성될때 자동으로 한번 호출된다
  • 생성자는 매개변수 조건에 따라 여러개를 작성할 수 있다(오버로딩)

생성자의 종류

매개변수가 있는 생성자

1
2
3
4
5
6
7
8
9
10
11
12
class human {
    String name;
    String job;
    int age; 

    Car() {} // 기본 생성자
    Car(String c, String g, int d) { // 생성자    
        name = c;
        job = g;
        age = d;
    }
}

생성자를 사용하지 않고 객체에 데이터를 직접 넣을때

1
2
3
4
5
// 생성자를 사용하지 않았을 때
human h = new human();
h.name = "parkdongwon";
h.job = "student";
h.age = 16;        

생성자를 사용하여 객체에 데이터를 직접 넣을때

1
human h = new human("parkdongwon", "student", 16);

this

this는 객체 즉 자기자신을 나타낸다 this를 사용하는 경우는 아래와 같다

this를 사용하는 경우(클래스의 속성과 생성자/메소드의 매개변수의 이름이 같은 경우)

아래 소스와 같이 생성자에서 받는 매개변수의 이름과 클래스의 변수 이름이 같을 경우 java는 매개변수인지 클래스 변수인지 인식을 하지 못해서 값을 제대로 반영하지 못한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// this를 사용하지 않아서 이슈된 코드
public class human {
    public String name;
    public String job;
    public int age;

    public human(String name, String job, int age) {
        name = name;
        job = job;
        age = age;
    }

    public static void main(String[] args) {
        human h = new human("parkdongwon", "student", 16);
        System.out.println("name: " + h.name); // name: null
        System.out.println("job: " + h.job); // job: null
        System.out.println("age: " + h.age); // age: 0
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// this를 사용해서 정상화된 코드
public class human {
    public String name;
    public String job;
    public int age;

    public human(String name, String job, int age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }

    public static void main(String[] args) {
        human h = new human("parkdongwon", "student", 16);
        System.out.println("name: " + h.name); // name: parkdongwon
        System.out.println("job: " + h.job); // job: student
        System.out.println("age: " + h.age); // age: 16
    }
}

this를 사용하는 경우(클래스에 오버로딩된 다른 생성자 호출)

아래 소스와 같이 생성자가 여러개인 오버로딩된 경우 생성자가 다른 생성자를 호출할때는 this를 사용하여 호출한다

  • 오버로딩 이란 너무 많이 적재했다(Overloading)는 뜻을 가진 단어로 같은 이름의 메서드에 매개변수의 타입, 개수를 다르게 한 것을 말한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// this를 사용하는 경우 (클래스에 오버로딩된 다른 생성자 호출)
public class human {
    public String name;
    public String job;
    public int age;

    public human(String name, int age) {
        // human(String name, String job, int age)를 호출
        this(name, "student", age);
    }
    
    public human(String name, String job, int age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }

    public static void main(String[] args) {
        human h = new human("parkdongwon", "student", 16);
        System.out.println("name: " + h.name); // name: parkdongwon
        System.out.println("job: " + h.job); // job: student
        System.out.println("age: " + h.age); // age: 16
    }
}

객체 자신의 참조값을 전달하고 싶을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// this를 사용하는 경우 (객체 자신의 참조값을 전달하고 싶을 때)
public class human {
    public String name;
    public String job;
    public int age;
    
    public human(String name, String job, int age) {
        this.name = name;
        this.job = job;
        this.age = age;
    }
    //  어떤 메소드에서는 동작을 완료하고 리턴값으로 메소드의 매개변수로 객체, 자기 자신의 참조값을 전달하고 싶어하는 경우
    public human getHumanInstance() {
            return this;
        }   
}
This post is licensed under CC BY 4.0 by the author.