티스토리 뷰

Programming/Java

JAVA 생성자(Constructor) 정의 및 예제

감성적인 개발자 2022. 3. 29. 00:08

생성자

생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드이다. 주로 인스턴스 생성 시 실행되는 작업이나 변수 초기화 작업에 사용된다.

class Card{
	private String cardName;
	
	public Card() {
    }
}

생성자의 조건은 클래스와 이름이 같으면서, 리턴 값이 없어야한다. 리턴 값이 없음에도 void형을 적지않는다. 생성자는 보통 public 접근제어자를 이용하는데, private으로 생성자를 만들면 다른 클래스에서 인스턴스를 생성할 수 없게된다. private생성자를 이용한 예제

 

생성자 오버로딩

class Card{
	private String cardName;
	
	//생성자1
	public Card() {
	}
	
	//생성자2
	public Card(String _cardName) {
		cardName = _cardName;
	}
}

생성자 또한 오버로딩이 가능하므로, 한 클래스 내에서 여러개의 생성자가 존재할 수 있다. 위의 생성자 두 개는 매개변수로 인해 구분되므로 오버로딩의 조건을 만족한다. 

 

기본 생성자

Class Card() {} //클래스
card() {} //컴파일러에 의해 추가된 기본 생성자

클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야하는데, 만약 명시하지 않을 경우 컴파일러가 기본 생성자를 추가하여 컴파일한다. 기본 생성자는 매개변수가 없고 아무작업도 하지 않는다. 

 

public static void main(String[] args) {
	Card card1 = new Card(); //오류
}

class Card{
	private String cardName;
	
	//생성자2
	public Card(String _cardName) {
		cardName = _cardName;
	}
}

기본생생성자는 클래스에 생성자가 없을 때만 생성되므로 위와같이 매개변수가 있는 생성자 하나만 존재할 때 기본생성자를 호출하면 컴파일에러가 발생하니 주의하자.

 

 

인스턴스 변수와 인자 값 구분하기 - this

private String cardName; //인스턴스 변수

public Card(String cardName) {
    cardName = cardName;
}

인자로 받은 cardName 값을 인스턴스 변수인 cardName에 지정해주는 생성자에서 위와 같이 변수명이 동일한 경우 컴파일러는 인스턴스 변수가 아닌 인자 값에 인자 값을 대입해 개발자가 원하는 대로 명령을 수행하지 않는다. 이럴 때 this 키워드를 활용해 변수를 구분해 줄 수 있다.

 

private String cardName; //인스턴스 변수

public Card(String cardName) {
    this.cardName = cardName;
}
public void getCard() {		
    System.out.println("카드사는 " + this.cardName + "입니다.");
}

인스턴스 변수앞에 this를 지정해줌으로써 매개변수로 들어온 값을 정상적으로 지정해 줄 수있게 되었다. 생성자 외 다른 메소드에선 this를 지정해주지 않아도 문제없지만 정확한 표현을 위해 this를 지정해주는 것이 바람직하다.

 

생성자에서 다른 생성자 호출하기

생성자 간에도 서로 호출이 가능하다. 호출 시 조건은 다음과 같다.

  1. 반드시 첫 줄에서만 다른 생성자 호출이 가능하다.
  2. 생성자 호출시 이름이 아닌 this로 대체한다.

생성자 호출이 첫 줄에만 이루어져야하는 이유는 생각해보면 간단하다. 인스턴스 변수를 초기화 하는 도중 다른 생성자가 호출되면 호출된 생성자에서도 다시 값을 초기화 할 것이기 때문에 이전의 작업이 무의미해질 수 있기 때문이다.

 

public static void main(String[] args) {
    Card card1 = new Card();
    Card card2 = new Card("삼성");

    card1.getCard();
    card2.getCard();
}
class Card{
    private String cardName;
	
    public Card() {
            this("현대(기본)");	//this.cardName = "현대(기본)";
    }
	
    public Card(String cardName) {
        this.cardName = cardName;
    }
    
    public void getCard() {		
        System.out.println("카드사는 " + this.cardName + "입니다.");
    }
}
 카드사는 현대(기본)입니다.
 카드사는 삼성입니다.

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함