본문 바로가기

프로그래밍/Java

[Java]생성자

생성자란

 우리가 클래스를 만들고 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.

 

생성자 만들 때 조건

 1. 클래스의 이름과 동일한 이름으로 생성자이름을 정해야한다.

 2. 리턴타입과 리턴 값이 없어야 한다. 즉, void와 리턴 자료형을 사용하지 않고 만든다.

 

생성자 종류

 생성자는 매개변수를 가지지 않는 기본생성자와 매개변수를 가지는 생성자로 나뉜다.

 

 1. 기본 생성자

 우리가 클래스와 객체를 배우고 사용해 왔다면 알게모르게 기본생성자도 함께 써온게 된다.

생성자를 배운적이 없고 생성한적이 없다고 생각할텐데 그것은 당연하다. 생성자를 따로 만들지 않아도 우리가 클래스를 만들면 기본 생성자도 함께 만들어지기 때문이다.

 하지만 사용자가 생성자를 하나라도 만들게 되면 기본 생성자는 자동으로 추가되지 않는다.

 

기본 생성자 문법

// Test라는 클래스를 만들었을 경우 클래스와 같은 Test라는 이름의 생성자를 사용하여야한다.
// 기본 생성자
	Test() {  }

 

2. 매개변수가 있는 생성자

 생성자도 리턴 타입만 받지 않을 뿐, 메소드와 같은 형태를 띄기 때문에 매개변수를 가질 수 있다.

매개변수를 가지게 되면 메소드 처럼 호출 시 매개변수를 넘겨받아 인스턴스 초기화에 사용할 수 있다.

같은 동물이라도 강아지와 고양이가 다른 특성을 가지는 것 처럼, 같은 클래스에서 나온 인스턴스마다 각기 다른 값으로 초기화 되는 경우가 많기 때문에 매개 변수를 사용한 초기화는 매우 유용하게 쓸 수 있다.

 

 

매개변수 생성자 문법

//매개변수를 가지는 생성자
    Test(int _i, String _st) {
    int i = _i; // 매개변수로 넘어온 _i를 Test메소드의 i에 저장시킨다.
    String st = _st; // 매개변수로 넘어온 _st를 Test메소드의 st에 저장시킨다.
    }

 

 

생성자 오버로딩

 위에서 사용자가 생성자를 직접 만들게 되면 컴파일러가 기본 생성자를 만들어 주지 않는다고 하였다.

 그렇다면 매개변수를 가지는 생성자를 만들게 되면 기본 생성자는 쓸 수 없게 되는 것인가? 그렇지는 않다.

 매개변수를 가지는 생성자와 기본 생성자를 같이 쓸 수 있다. 대신 매개변수 생성자와 함께 기본 생성자도 사용자가 직접 생성해야한다.

 그렇다면 매개변수 생성자도 여러개가 공존할 수 있을까? 같이 쓸 수 있다. 생성자 오버로딩을 통해 매개변수를 달리하여 다양한 생성자를 사용할 수 있다.

 

 

생성자 예시

class Number{
 	int num;
   	String str;

 public Number() {
	 num = 10; // 넘어오는 매개변수가 없기 때문에 num에 10을 직접 저장시켜준다.
 } // 기본 생성자
	
 public Number(int n) {
	 num = n; // 넘어오는 매개변수 n을 num에다 저장시켜준다.
 } // 매개변수 생성자1
    
 public Number(int n, String st) {
 	num = n; // 매개변수 n을 num에
 	str = st; // 매개변수 st를 str에 저장
 } // 매개변수 생성자2
    
    //기본생성자, 받는 매개변수가 다른 생성자 다 함께 사용 가능하다.
}
public class Test {
	 public static void main(String[] args) {
	 	Number num1 = new Number();
	    System.out.println(num1.num);
	    
	    Number num2 = new Number(20);
	    System.out.println(num2.num);
	    
	    Number num3 = new Number(30, "숫자");
	    System.out.println(num3.num);
	    System.out.println(num3.str);

	 }
}

 

출력 결과

'프로그래밍 > Java' 카테고리의 다른 글

[Java]this와 this()  (0) 2021.03.26
[Java]메소드 오버로딩  (0) 2021.03.26
[Java]객체 배열  (0) 2021.03.19
[Java]클래스와 객체  (0) 2021.03.17
[Java]2차원 배열  (0) 2021.03.13