생성자

생성일: 2021년 9월 7일 오전 11:32

생성자란?

생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드' 이다.

생성자의 조건

  1. 생성자의 이름은 클래스의 이름과 같다.
  2. 생성자는 리턴 값이 없다.

생성자의 생성

생성자는 다음과 같이 정의한다.

클래스이름 (타입 변수명, ... ) {
    // 보통 초기화 코드
}

Book(){
    pageNumber = 0;
}

생성자 라는 이름은 생성자가 인스턴스를 생성한다. 라고 오해하기 쉽지만

new라는 연산자가 인스턴스를 생성하는 것이기 때문에 햇갈리면 안된다.

생성자는 new할 때 그저 호출 되는 메소드라고 생각하는 것이 편하다

생성자의 오버로딩

생성자는 오버로딩이 가능하다. 그렇기 떄문에 생성자는 여러개를 만들 수 있다.

이러한 생성자들은 2가지로 나뉜다.

기본생성자

기본생성자는 아무런 매개변수도 없는 생성자 이다.

클래스이름() {

}

만약, 클래스가 생성자를 정의하지 않으면 컴파일러가 제공하는 기본생성자를 통해 자동으로 추가를 해준다.

이러한 추가를 해주느 생성자는 안에 아무런 내용이 없는 기본생성자이다

매개변수가 있는 생성자

매개변수가 있는 생성자는 생성과 즉시 특정한 값으로 초기화를 시켜주고 싶을 때 사용한다.

생성자로 변수를 생성하고 메소드를 이용하여 특정한 값을 추가하기 보단

생성즉시 값을 넘겨서 초기화하는것이 더 효율적이고 코드도 간결하기 때문이다.

생성자 안에서 다른 생성자 추가하기

생성자 안에서 다른 생성자를 한다는것은 잘 이해가 되지 않는데 사용하는 기능이라고한다.

메소드도 재귀함수기능이 있듯이 이를 그냥 사용하면 되지 않겠냐 생각을 했는데

그렇지않고 this()를 사용하여 다시 호출 해주면 된다.

class Book{

    int pageNumber;

    Book(){
        this(1);
    }
    Book(int pageNumber){
        this.pageNumber = pageNumber;
    }

}

생성자의 활용

생성자를 이용하여 생성과 동시에 인스턴스를 복사 할 수 있다.

생성할 때 매개변수로 인스턴스를 받고 복사하면 된다.

class Book{

    int pageNumber;

    Book(){
        this(1);
    }

    // 첫번째 방법
    Book(Book book){
        pageNumber = book.pageNumber;
    }

    // 두번째 방법
    Book(int pageNumber){
        this.pageNumber = pageNumber;
    }

    Book(Book book){
        this(book.pageNumber);
    }

}

첫번째 방법은 바로 인스턴스의 변수를 꺼내서 복사하는 방법이다.

두번쨰 방법은 생성자안의 생성자를 통해서 인스턴스를 복사하는 법이다.

멤버변수의 초기화 시기와 순서

클래스 변수의 초기화 시점 : 클래스가 처음 로딩될 때 단 한번 초기화 된다. (static변수)

인스턴스 변수의 초기화 시점 : 인스턴스가 생성될 때 마다 생성자를 통해 각 인스턴스 별로 초기화가 이루어짐

클래스변수의 초기화순서 : 기본값 → 명시적초기화 → 클래스 초기화 블럭

인스턴스변수의 초기화순서 : 기본값 → 명시적초기화 → 인스턴스 초기화 블럭 → 생성자

명시적 초기화

명시적 초기화는 선언과 동시에 초기화하는 것이다.

class Book(){
    int pageNumber = 1;
}

인스턴스 초기화 블럭

생성자를 오버로딩하면서 인스턴스를 초기화 할때 인스턴스들의 초기화가 중복되는 내용들이 있을 것이다.

이때 인스턴스 초기화 블럭을 사용하면 해결할 수 있다.

class Book(){
    **{
        pageNumber = 1;
    }**
}

이런방식으로 class 안에서 {}를 사용해서 초기화를 진행하면 된다.

클래스 초기화 블럭

클래스 초기화 블럭은 인스턴스 초기화 블럭과 비슷하다.

인스턴스 초기화 블럭과 마찬가지로 {}를 사용하지만 {}앞에 static이라는 키워드를 붙여주면된다,

 class Book(){
    static{
        pageNumber = 1;
    }
}

Reference

  • 자바의 정석

'Java > Java' 카테고리의 다른 글

[Java/Study] 오버라이드  (0) 2021.09.07
[Java/Study] 상속  (0) 2021.09.07
[Java/Study] 변수와 메서드  (0) 2021.09.07
[Java/Study] 클래스와 객체  (0) 2021.09.06
[Java/Study] 자료형  (1) 2021.09.05

+ Recent posts