본문 바로가기

Java

생성자

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

 

Java의 생성자


 

생성자
생성자는 객체 지향 프로그래밍에서 객체의 초기화를 담당하는 서브루틴을 가리킨다.
생성자는 객체가 처음 생성될 때 호출되어 멤버 변수를 초기화하고, 필요에 따라 자원을 할당하기도 한다.
객체의 생성 시에 호출되기 때문에 생성자라는 이름이 붙었다.
-위키백과-

위키백과에 정리가 너무 잘 되어있습니다.

생성자의 목적은, 객체의 필드를 초기화하는 데 있습니다.

 

그렇다면 초기화를 해주는 init함수라던지, 그런 것들로 초기화를 해도 되는데 왜 생성자를 사용할까요?

생성자를 사용하면, 생성과 동시에 초기화를 강제할 수 있습니다.

그러나 init함수를 사용하면, 강제할 수 없습니다. 그렇다면 초기화를 깜빡한다던가 하는 실수가 발생할 수 있겠죠?

그런 실수가 발생하면 껍질만 있는 객체가 생성될 수 있고, 프로그램이 커지면 그런 실수를 찾기도 힘들어집니다.



생성자 분석


 

public class MyClass {

    String className;

    //생성자
    MyClass(String className) {
        this.className = className;
    }
    
    public static void main(String[] args) {
        MyClass myClass = new MyClass("mine");
    }
}

1. 생성자는 '메서드'이다

2. 생성자의 이름은 클래스의 이름과 동일하다

3. 리턴 타입이 없다.

4. 목적은 필드 초기화이다

5. 객체가 생성될 때 호출된다.

 



 

디폴트 생성자


public class MyClass {

    String className;

    public static void main(String[] args) {
        //디폴트 생성자 호출
        MyClass myClass = new MyClass();
    }
}

//다음과 같은 코드를 클래스 안에 컴파일러가 삽입해준다
MyClass() {}

 

위의 코드를 보면, 따로 생성자를 만들어주지도 않았는데 빈 생성자 (매개변수를 받지 않는 생성자)를 호출하고 있는 것을 확인할 수 있습니다.

 

이처럼 프로그래머가 생성자를 아무것도 만들어주지 않으면, 컴파일러가 컴파일 시

(매개변수를 받지 않고, 아무 작업(초기화)도 하지 않는 생성자를 만들어줍니다.)

 

단, 프로그래머가 하나라도 생성자를 정의한다면 컴파일러가 디폴트 생성자를 만들어주지 않으니 주의하세요.



생성자 오버로딩


public class MyClass {

    String className;
    Integer classNum;

    //1번 생성자
    MyClass(String className) {
        this.className = className;
    }

    //2번 생성자
    MyClass(String className, Integer classNum) {
        this.className = className;
        this.classNum = classNum;
    }

    public static void main(String[] args) {
        //1번 사용
        MyClass myClass1 = new MyClass("1번생성자 사용");
        MyClass myClass2 = new MyClass("2번 생성자 사용", 2);
    }
}

 

위 코드를 보시면 생성자가 동시에 2개가 있는 것을 알 수 있습니다.

다른 점은, 생성자가 받고 있는 매개변수의 개수입니다.

이처럼 자바에서는 함수의 이름이 같더라도  매개변수가 다르면 다른 함수로 인식하기 때문에,

매개변수가 다른 생성자를 여러 개 정의할 수 있고 이것을 생성자 오버로딩이라고 합니다.

'Java' 카테고리의 다른 글

Java static / non-static  (0) 2021.05.06
Java의 패키지와 접근 지정자  (0) 2021.05.06
클래스와 객체(미완성)  (0) 2021.04.06
예외 처리  (0) 2021.04.06
자바 배열과 메모리  (0) 2021.03.30