본문 바로가기
Java

[Java OOP 기초] 생성자

by jphwany 2022. 5. 25.

생성자 (Constructor)

객체 생성의 역할을 하는 클래스의 구성요소
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메소드라고 할 수 있다

new 를 사용해 객체 생성할 때 호출되는 것

인스턴스 생성을 담당하는 건 new이며 생성자는 인스턴스 변수들을 초기화하는데 사용되는 메소드다

생성자의 이름은 반드시 클래스 이름과 같아야하는데,
만약 그렇지 않으면 그 메소드는 더이상 생성자로서의 기능을 수행할 수 없다

또한 생성자는 리턴 타입이 없다 
없는데도 메소드에서 리턴 값이 없을 때 사용하는 void를 사용하지 않는다

무언가를 리턴하지 않음  을 의미하는 void 와는 다르게 생성자는 그냥 리턴 타입 자체가 없기 때문이다

클래스명(매개변수) { // 생성자 기본 구조
...생략...
}

 

클래스명과 같은 이름의 생성자명을 작성하고 리턴 타입이 없기 때문에 리턴 타입엔 아무 것도 적지 않는다
매개변수는 있어도 없어도 상관없다

이 생성자 역시 메소드 처럼 오버로딩이 가능하기 때문에 
한 클래스 내 여러 생성자가 존재할 수 있다


기본 생성자와 매개변수가 있는 생성자

 

생성자의 존재를 모른채 new 를 사용해서 객체를 만들었지만 (생성자를 호출하여)

모든 클래스에는 반드시 1개 이상의 생성자가 있어야 한다

그런데 여태까진 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있었는데

그 이유는, 생성자가 클래스 안에 포함되어 있지 않았을 땐
자바 컴파일러가 기본 생성자를 자동으로 추가해줬기 때문이다

기본생성자는 매개변수가 없는 생성자를 의미한다
매개변수가 있는 생성자는 메소드처럼 매개변수를 통해 호출 시 해당 값을 받아 인스턴스를 초기화 하는데 사용된다

인스턴스를 계속 만들어야 하는 경우,
인스턴스 마다 각각 다른 값을 가지고 초기화 할 수 있어서 유용하다고 볼 수 있다

public class Com_const {
    public static void main(String[] args) {

        Comconst comconst = new Comconst(
                "AMD Ryzen 3", "Windows 10", "gtx 1060 ti");

        System.out.println(
       "내 컴퓨터는 " + comconst.getCPUName() + " 라는 CPU를 사용하고 "
       + "운영체제는 " + comconst.getOsName() + ", " + comconst.getVgaName()
               + " 이라는 그래픽 카드를 장착하고 있다");
    }
}

class Comconst{
    public String CPUName;
    public String os;
    public String vga;


    public Comconst(String CPUName, String os, String vga){
        this.CPUName = CPUName;
        this.os = os;
        this.vga = vga;
        
    // 인스턴스 변수로 CPUName, os, vga 가 선언되어 있고
    // 생성자 매개변수로도 똑같은 이름으로 선언되어 있다
    // 이러면 구분하기 어려워지기 때문에 구분하는 용도로 this를 써서 구분한다
    // 그런거 없이 os = os 이래버리면 둘 다 지역변수로 간주된다
    // this는 인스턴스 자신을 가리키고 참조변수를 통해 인스턴스 멤버에 접근할 수 있었던 것 처럼
    // this를 통해 인스턴스 자신의 변수에 접근할 수 있는 것
    // 참고로 static 메소드에서는 this를 사용할 수 없다
    // static 메소드에는 참조할 인스턴스가 없기 때문이다

    }

    public Comconst(String CPUName){
        this("default CPU", "default OS", "default VGA");
    }


    public String getCPUName(){
        return CPUName;
    }


    public String getOsName(){
        return os;
    }

    public String getVgaName(){
        return vga;
    }
}


Comconst 인스턴스를 생성할 때 매개변수가 있는 생성자를 사용하게 되면 
인스턴스를 만든 후 인스턴스 필드 값을 일일이 설정해줄 필요없이
생성과 동시에 원하는 값으로 설정해줄 수 있기 때문에 편리하다

코드 내용에 주석을 보면 흐름을 이해할 수 있다


this() , this


this() 는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우

Comconst 클래스의 생성자를 호출하는건 this(), 그 효과는 Comconst() 생성자를 호출하는 것과 동일

하지만 주의 사항이 있는데

1. 생성자의 내부에서만 사용가능
2. 생성자 첫 줄에 위치

그리고 계속 실수하면서 깨달은 것
* 생성자 내에서 자기 자신을 호출하면 에러가 난다
Recursive constructor invocation


this 는 인스턴스 변수와 생성자 매개변수가 이름이 같게 정의될 때 구분하기 위함으로 쓰이는데
지역변수로 간주되는걸 방지하는 행위

원래 모든 메소드에는 자신이 포함된 클래스의 객체를 가리키는 this 라는 참조변수가 있는데
일반적으로 컴파일러가 this. 을 추가해주기 때문에 생략하는 경우가 대부분이다

this는 인스턴스 자신을 가리키고, 참조변수를 통해 인스턴스 멤버에 접근할 수 있었던 것 처럼
this 를 통해 인스턴스 자신의 변수에 접근할 수 있는 것이다

this. 은 위 코드를 다시 보면 이해하기 수월하다

댓글