Skip to main content

[Java] 생성자(Constructor)

·2 mins· loading · loading ·
CS Java
Soeun Uhm
Author
Soeun Uhm
problem-solving engineer, talented in grit.
Table of Contents

생성자 ?
#

생성자는 인스턴스 초기화 메서드 이다. 생성자도 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴 값이 없다.

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

생성자도 오버로딩이 가능하므로, 하나의 클래스 내에 여러 개의 생성자가 존재할 수 있다.

public class Card {
    int height; //인스턴스 변수
    int width;

    Card(int height, int width) { // 생성자
        this.height = height;
        this.width = width;
    }

    public void getCardInfo() { // 인스턴스 메서드
        System.out.println("height: " + this.height + " width: " + this.width);
    }
}
public class CardTest {
    public static void main(String[] args) {
        Card myCard = new Card(3, 5); //myCard 객체 초기화
        myCard.getCardInfo(); // 객체를 통해 인스턴스 메서드 접근
        myCard.height = 4; // 객체를 통해 인스턴스 변수 접근
        myCard.getCardInfo(); // height : 4, width : 5
    }
}

생성자 내에 this.height = height 가 보일 것이다. 변수명이 똑같은 것 같지만, 앞에 height 와 뒤의 height 는 다르다. 앞의 height 는 Card 클래스 내부에 인스턴스 변수인 height 를 나타낸다. 뒤의 height 는 Card 생성자 안에 int height 라고 정의된 것을 받아온 것이다. 이것을 좀 더 명확하게 나타내보자.

아래 처럼 나타낼 수 있지만, 그냥 인스턴스 변수 앞에 this. 를 붙여서 나타내는 것이 더 일반적이다. this 는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스 멤버에 접근할 수 있는 것처럼, this 를 통해 인스턴스 멤버에 접근할 수 있다. this 를 사용할 수 있는 것은 인스턴스 멤버 뿐이다. 왜냐하면, static 메서드는 인스턴스가 생성하지 않고도 호출될 수 있기 때문에, static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수 있기 때문이다.

public class Card{
    int instanceHeight;
    int instanceWidth;

    Card(int myHeight, int myWidth) { // 생성자
        this.instanceHeight = myHeight;
        this.instanceWidth = myWidth;
    }

    public void getCardInfo() { // 인스턴스 메서드
        System.out.println("height: " + this.instanceHeight + " width: " + this.instanceWidth);
    }
}

생성자라는 이름 때문에 헷갈리지 말아야 할 것이, new 가 새로운 객체를 생성한는 것이지, 생성자가 인스턴스를 생성하는 것이 아니다! 위의 코드에서 Card myCard = new Card(3,5) 을 보자.

  1. 연산자 new 에 의해서 메모리(heap)에 Card 클래스의 인스턴스가 생성된다.
  2. 생성자 Card() 가 호출되어 수행된다.
  3. 연산자 new 의 결과로, 생성된 Card 의 인스턴스 주소가 반환되어 참조변수 myCard 에 저장된다.

기본 생성자(default constructor)

사실 우리는 새로운 인스턴스를 생성하지 않고도, 프로그래밍을 해왔다. 이 이유는 클래스에는 기본 생성자가 있기 때문이다. 기본 생성자가 컴파일러에 의해 추가되는 경우는, 클래스에 정의된 생성자가 하나도 없을 때 뿐이다.

인스턴스를 생성할 때 생각해볼 점

  1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
  2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

Related

[Java] 클래스 메서드 vs. 인스턴스 메서드
·2 mins· loading · loading
CS Java
static method vs. instance method 는 언제 써야 할까?
[Java] 클래스 변수 vs. 인스턴스 변수 vs. 로컬 변수
·3 mins· loading · loading
CS Java
Java 3가지 변수의 종류
[Java] Enum
·3 mins· loading · loading
CS Java
관련된 상수의 집합인 Enum