본문 바로가기
Coding/Java

Java - 생성자 ( Constructor )

by ZaRi 2023. 6. 27.

 

 이제 자바에 대해 정리해 보려고 합니다. 자바의 문법은 거의 C언어와 같기에 자바가 가지는 특징인 객체 위주로 정리하겠습니다. 

 오늘은 자바의 생성자에 대해 알아보겠습니다.

 

 


생성자 ( Constructor )

생성자

: 객체가 생성될 때 호출되는 메소드, 객체를 초기화해줌.

 

선언 설명
public 클래스명() {
}
디폴트 생성자

주의)
- 생성자 이름은 소속된 클래스명과 같아야 함.
- 메소드와 다르게 리턴 타입과 리턴 값이 없음.
- 디폴트 생성자는 굳이 선언하지 않아도 자바 컴파일러가 생성해줌.
public 클래스명() {
    수행코드;
}
생성자
public 클래스명(파라미터, 파라미터,...) {
    수행코드;
}
생성자

주의)
- 파라미터가 존재하는 생성자 선언 시, 자바 컴파일러에서 자동으로 디폴트 생성자를 만들어 주지 않음.

 

 

호출 설명
클래스명 변수명 = new 클래스명() 객체 할당 시 생성자 앞에 new를 붙여서 호출함.
클래스명 변수명 = new 클래스명(파라미터, 파라미터,...)  

 

 

기본적인 생성자의 형태와 호출 방법에 대해 알아보았습니다.

 참고로 나중에 오버로딩에 대해 배우면 알게 되겠지만, 이런 생성자는 여러개 선언 가능합니다.

 

 

 

활용하기

  먼저 디폴트 생성자에 대해 알아보겠습니다.

 

class CakeStatus {
    public int radious, height = 10;

}

public class Cake {
    public static void main(String[] args) {
        CakeStatus ex = new CakeStatus();
        System.out.println(ex.height);
    }
}

 

 

 테스트를 위해 변수는 public으로 접근 제한자를 설정하였습니다. 

 위의 코드를 보면 우리가 객체를 초기화 할때 사용하는 생성자를 따로 선언하지 않았습니다.

 

 

 

10이-출력됨
결과1

 

하지만 보는 것과 같이 객체가 잘 생성되어 ex 객체의 height 라는 값이 잘 출력되는 모습입니다. 

이는 컴파일러가 디폴트로 생성자를 만들어 주었기에 객체가 오류없이 생성된 것입니다.

 

 

 그러면 이번에는 파라미터가 있는 생성자를 만들어보겠습니다.

 

 

 

class CakeStatus {
    public int radious, height = 10;

    public CakeStatus(int radious, int height) {
        this.radious = radious;
        this.height = height;
    }
}

public class Cake {
    public static void main(String[] args) {
        CakeStatus ex = new CakeStatus(5, 20);
        System.out.println(ex.radious);
        System.out.println(ex.height);
    }
}

 

 

 위 코드를 보면 생성자에 5랑 20을 넣어 객체의 멤버에 각각 값을 할당해주어 초기화 해주는 모습입니다.

 (tip. this는 객체 자신을 가리키는 레퍼런스 변수 입니다.)

 그러면 실행해 보겠습니다.

 

 

 

5와-20이-출력됨
결과2

 

 위와 같이 성공적으로 객체의 radious와 height 값이 각각 5와 20으로 초기화 되어진 것을 확인 할 수 있었습니다.

 

 

 

주의

 보통 디폴트 생성자 때문에 헷갈리는 경우가 많습니다. 

 아까 앞서 설명해 드렸지만 디폴트 생성자는 다른 생성자가 있다면 선언되지 않습니다.

 

 

class CakeStatus {
    public int radious, height = 10;

    public CakeStatus(int radious, int height) {
        this.radious = radious;
        this.height = height;
    }
}

public class Cake {
    public static void main(String[] args) {
        CakeStatus ex = new CakeStatus();
        System.out.println(ex.height);
    }
}

 

 이렇게 위에 코드처럼 생성자가 있는 상태로 디폴트 생성자를 호출하게 된다면, 다음과 같은 오류가 발생하게 됩니다.

 

오류 메세지
java: constructor CakeStatus in class CakeStatus cannot be applied to given types;
  required: int,int
  found: no arguments
  reason: actual and formal argument lists differ in length

 

 int 형 두개를 파라미터로 넣어줘야 한다면서 오류를 발생시키고 있습니다. 

 그렇기에 이런 경우에는 파라미터를 넣어주거나, 아니면 다음과 같이 새로 생성자를 만들어 줘야합니다.

 

 

 

class CakeStatus {
    public int radious, height = 10;

    public CakeStatus() {
    }

    public CakeStatus(int radious, int height) {
        this.radious = radious;
        this.height = height;
    }
}

public class Cake {
    public static void main(String[] args) {
        CakeStatus ex = new CakeStatus();
        System.out.println(ex.height);
    }
}

 

 그럼 이제 실행해보겠습니다.

 

 

10이-출력됨
결과3

 

 이번에는 오류 없이 10이 잘 출력되는 모습입니다.

 참고로 CakeStatus가 같은 이름으로 두개가 선언 되었는데 오류가 안나는 이유는, 메소드 오버로딩이기 때문입니다. 

 

 


 

 생성자에 대해 알아보았습니다. 자바를 하면서 정말 많이 쓰이기 때문에 잘 알아두시면 좋을 것 같습니다. 

 다음에는 메소드 오버로딩과 오버라이딩에 대해 알아보겠습니다.

댓글