생성자와 초기화

1,409 단어·3 분·원문(.md)

생성자 (Constructor) #

  • 생성자는 new 연산자를 통해서 인스턴스를 생성할 때 *반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드(하지만 메소드와 다름)이다.
  • 생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다.

생성자 선언 방법 #

public 클래스(매개변수){
  ...
}
  • 클래스라는 부분은 생성자를 정의하는 클래스의 이름과 동일하게 적어줘야한다.
  • 매개변수는 꼭 필수로 적지 않아도 된다.
  • 생성자를 선언할 때는 public을 적어주면 된다.

생성자 종류 및 사용 #

인스턴스를 생성할 때 반드시 생성자를 호출해야한다. 그런데 지금까지는 생성자를 정의하지 않았는데 어떻게 호출이된 것일까? 그 이유는 클래스를 정의할 때 생성자를 생략하면 컴파일러가 자동적으로 기본 생성자를 생성하여 주기 때문이다. Default 생성자란 "public 클래스(){}"를 의미한다.

public class ConstructorEx01{
  // public ConstructorEx01(){} // Default Constructor 자동 생성
  public static void main(String[] args){
    ConstructorEx01 ce = new ConstructorEx01(); // 인스턴스 생성 및 생성자 호출
  }
}

위의 내용처럼 인스턴스를 생성할 때 생성자를 호출한다. 생성자를 생략하면 주석 처리된 부분이 자동으로 생성된다. 이번에는 기본 생성자를 직접 정의하는 내용을 알아보자.

public class ConstructorEx01{
  public ConstructorEx(){
    System.out.println("생성자 호출 성공");

    public static void main(String[] args){
      ConstructorEx01 ce = new ConstructorEx01(); // 인스턴스 생성 및 생성자 호출
    }
  }
}

처음 예제와 비교했을때 차이점은 처음에 "생성자 호출 성공" 이 출력된다.

생성자를 선언할 때 매개변수를 괄호 안에 가질 수 있다고 하였고 그것에 대한 예제를 살펴보자.

public class ConstructorEx02{
  public ConstructorEx02(String a){
    // a = 사용자 거의
    System.out.println(a + "생성자 호출 성공");
  }

  public static void main(String[] args){
    ConstructorEx02 ce = new ConstructorEx02("사용자 정의") // 매개 변수를 갖는 생성자. 매개변수를 할당하지 않으면 컴파일 에러가 발생한다.
  }
}
  • 매개변수를 할당하지 않았을 때 컴파일 에러가 발생하는 이유는 그냥 호출하면 Default 생성자를 만드는데 이미 생성자가 존재하기 때문에 만들어주지 않는다.
public class ConstructorEx03 {
	public ConstructorEx03(){
		System.out.println("생성자 호출 성공");
	}
	public ConstructorEx03(String a){ // a = 사용자 정의
		System.out.println(a + " 생성자 호출 성공");
	}
	
	public static void main(String[] args) {
		ConstructorEx03 ce = new ConstructorEx03("사용자 정의"); // 매개변수를 갖는 생성자 호출
		ConstructorEx03 ce2 = new ConstructorEx03(); // 기본 생성자 호출
	}
}
  • 오버로딩을 사용하여 매개변수에 인자를 넣지 않아도 오류가 발생하는 것을 해결하였다.

생성자의 역할은 인스턴스를 초기화 시키는 것이다. 무엇을 의미하는지 알아보자

class CalculatorEx {
	// 필드변수 선언
	int a;
	int b;

	public CalculatorEx() { // 기본 생성자
		// 필드변수 초기화
		a = 10;
		b = 20;
	}

	public CalculatorEx(int num1, int num2) { // 생성자 오버로딩
		// 매개값 이용 필드변수 초기화
		a = num1;
		b = num2;
	}

	public void sum() { // 메소드
		System.out.println("합계 : " + (a + b));
	}
}

public class ConstructorEx04 {
	public static void main(String[] args) {
		CalculatorEx cc = new CalculatorEx();
		cc.sum(); // 결과 : 30
		CalculatorEx cc2 = new CalculatorEx(0, 10);
		cc2.sum(); // 결과 : 10
	}
}

별도의 클래스를 하나 정의했고 필드변수 (int a , int b)를 선언했다. 기본 생성자가 매개변수를 갖는 생성자를 정의하고 메소드에서 합을 구하는 코드를 추가하였다. main 메소드에서 인스턴스를 생성하면서 생성자를 호출하였고 호출된 생성자에 의해 필드변수가 초기화되었다. 그리고 인스턴스로 메소드를 호출하여 값을 출력한다.


생성자의 특징(메소드와의 차이) #

  • 앞에서 설명한 것처럼 생성자는 반드시 클래스명과 동일하게 정의해야 한다. - 생성자 앞에는 접근 제어자만 올 수 있다.(메소드는 static과 같은 수식어를 작성할 수 있다.)
  • 반환값이 없으므로 void나 자료형을 작성할 수 없습니다.(메소드는 void나 자료형이 있어야 한다.)
Back-End/JAVA/생성자.md