생성자(Construct)와 this

최준호·2021년 7월 6일
0

java

목록 보기
6/25
post-custom-banner

생성자란

생성자란 메모리 내 객체가 생성될 때 자동적으로 단 한번 호출되어 객체의 구조를 인식하고 생성되는 객체의 멤버변수들을 초기화하는 데 목적을 둔 것을 말한다. 생성자의 특징으로는

  1. 반환 타입이 없다.
  2. 생성자명이 클래스명과 같다.
class Car{
    int speed;
    public void setSpeed(int s){
        speed = s;
    }
}
Car car = new Car();

new 연산자 뒤로 오는 것을 생성자란 것인데. 위 예문과 같이 전달되는 인자가 없는 생성자를 default 생성자라고 한다. 또한 생성자라는 형태의 메서드가 Car class 내부에 존재하지 않는데도 사용할 수 있는데 이는 개발자가 생성자를 class 내부에 단 1개도 정의하지 않았을 경우 컴파일러가 컴파일할 때 자동으로 정의해주기 때문이다. 하지만 개발자가 class의 생성자를 1개 이상 정의했다면 default 생성자를 자동으로 만들어주지 않는다.

생성자의 사용법

Car class는 클래스를 생성자로 생성한 뒤에 speed 변수의 값을 setSpeed를 통해 설정해줘야한다. 지금은 단 조그만 수정이고 나 혼자 개발한다면 기억하고 있으면 되겠지만 1개가 아닌 여러개의 필수값들이 존재하게되고 여러명이서 개발하는 과정이라 한다면 이 부분을 어떻게 다 지키면서 개발할 수 있을까? 그 방법은 생성자를 생성할때 매개변수를 필수값으로 입력받게 하면 된다.

class Car{
    private int speed;

    public Car(int s){
        speed = s;
    }
    public void setSpeed(int s){
        speed = s;
    }
}

위 Car class를 다음과 같이 수정한다면 컴파일러는 컴파일할 때 default 생성자를 만들지 않게 되고

Car car = new Car(50);

이렇게 car 객체를 생성할때 speed의 값을 입력해줘야하기 때문에 생성할때 무조건 초기화를 해줄 수 있다.

생성자가 필요한 이유는 객체가 생성될 때 단 한번 수행하는 부분이므로 멤버들의 초기화 작업과 반드시 또는 단 한번만 수행해야 하는 행위 등을 생서앚에 정의해 두는 것이다. 또한 생성자를 오버로딩하여 하나의 클래스 내에 여러 개의 생성자가 존재하는 것을 생성자 오버로딩이라고 한다.

  • 생성자 접근제한
    • public : 모두 사용
    • private : class 내부에서만 사용
    • protected : 상속관계에 있는 sub class에서만 사용
    • 의 방법으로 접근을 제한하여 사용할 수도 있다.
  • 생성자에 접근제한을 사용하여 접근을 제한할 수 있는데.

this와 this()

this는 특정 객체 내에서 현재 객체 자신을 의미하는 참조변수이다. 이는 자신의 객체 reference를 알릴 때 쓰이며 현재 객체의 멤버들을 접근할 때도 쓰인다.

class Test{
    public Test(){
        System.out.println("객체 생성시 > "+ this);
    }
    public static void main(String[] args){
        Test t = new Test();
        System.out.println("객체 생성후 > "+ t);
    }
}

위 코드를 실행하면 객체를 생성할때 사용되는 this와 객체를 생성한 뒤 t의 주소값이 일치하는 것을 확인할 수 있다. 자신이 객체가 되어 메모리에 존재할 자신의 위치값을 갖고 있는 것이 this고 class를 객체화 했을 경우의 주소값을 갖고 있는 것이 this다. 또한 this()의 존재 이유는 생성자 내에서 자기 자신 즉 오버로딩된 생성자를 또 불러야할 경우가 존재하는데.

class ThisConstrEx{

    String str;
    public ThisConstEx(){
        this(" ");
    }
    public ThisConstEx(int n){
        this(String.valueOf(n));
    }
    public ThisConstEx(char c){
        this(String.valueOf(c));
    }
}

이렇게 다음과 같이 사용할 수 있다. this()라는 것은 현 객체의 또 다른 생성자를 호출할 수 있는 유일한 방법이지만 this()는 무조건 생성자의 첫 행에서만 사용할 수 있다. 이 방법 외의 방법을 사용하면 컴파일에서 오류가 난다.

profile
해당 주소로 이전하였습니다. 감사합니다. https://ililil9482.tistory.com
post-custom-banner

0개의 댓글