자바 JAVA/자바 객체지향

자바 객체지향 : 생성자

땅콩아놀자 2023. 5. 4.

생성자란?

객체를 만드는 틀인 클래스에서 필요하면 생성자를 구현한다.

객체가 생성될 때 필요한 작업을 수행하는 특별한 메서드이다. 주로 객체 필드에 초기 값을 저장하거나 객체의 사용을 위해 필요한 초기화 작업이 수행된다.

 

더보기

생성자의 구성

  • 반환형을 기술하지 않으며 이름은 반드시 클래스 이름이다.
  • 생성자의 인자는 필요하면 기술한다.
  • 생성자는 주로 접근 지정자 public을 사용한다.
  • 필요하다면 생성자의 접근 지정자도 private 또는 protected도 가능한데, 보통 singleton패턴에서 사용된다.

 

생성자 구현

public class 학생 {

	public String 이름;
    
    public 학생() {
    } // new 학생();
    
    public 학생(String 학생) {
    	this.이름 = 이름;
    } // new 학생("땅콩");
    
    public void finalize() {
    }
}

 

객체 생성을 위한 생성자 호출

public class 학생테스트 {
	
    public static void main(String[] args) {
    	학생 공부하는학생 = new 학생(); // 기본 생성자
        공부하는학생.이름 = "땅통";
        
        System.out.println(공부하는학생.이름);
        
        학생 조는학생 = new 학생("땅콩"); // 생성할 당시에 이름을 넣어서 호출할 수 있음
        // this.이름 = 이름;
        System.out.println(조는학생.이름);
        
    }

]

 

기본 생성자(default constructor)

인자가 없는 생성자이다.

 

public class 대학생 {
	public String 이름;
}

public class 대학생 {
	public String 이름;
    
    public 대학생() {
    
    }
}

클래스 Student에서 생성자가 하나도 구현되지 않았다면,

new Student()와 같이 인자가 없는 생성자를 호출하여 객체를 생성하고, 생성자를 전혀 구현하지 않은 클래스는 자동으로 기본 생성자를 제공해준다.

 

public class 대학생테스트 {
	public static void main(String[] args) {
    	// 1. 기본 생성자
        대학생 열공중인대학생 = new 대학생();
        
        // 2. 사용자정의 생성자
        대학생 땡땡이치는대학생 = new 대학생("홍길동");
        
        // 3. 기본 생성자 + 사용자정의 생성자
        대학생 전과하려는대학생 = new 대학생();
        대학생 전과하려는대학생을말리려는대학생 = new 대학생("이순신");
	}
}

클래스에서 인자가 있는 생성자가 적어도 하나 구현되었다면, 더 이상 기본 생성자는 자동으로 사용불가능하며 기본 생성자를 사용하기 위해서는 기본 생성자도 따로 직접 구현해야 한다.

 

생성자 오버로딩(constructor overloading) : 필요한 여러 생성자 구현

하나의 클래스에서 인자가 다르면 생성자를 여러 개 구현 가능하다.

public class 대학생 {
    public String 이름;
    public int 나이;
    public String 성별;
    public String 학과;
    
    // 대학생 신입대학생 = new 대학생();
    public 대학생() {
    }
    
    // 대학생 신입대학생2 = new 대학생("홍길동");
    public 대학생(String 이름) {
    	this.이름 = 이름;
    }
    
    // 대학생 신입대학생3 = new 대학생("홍길동", 20);
    public 대학생(String 이름, int 나이) {
    	this.이름 = 이름;
        this.나이 = 나이;
    }
    
    // 대학생 신입대학생4 = new 대학생("홍길동", 20, "남");
    public 대학생(String 이름, int 나이, String 성별) {
    	this.이름 = 이름;
        this.나이 = 나이;
        this.성별 = 성별;
    }

    // 대학생 신입대학생5 = new 대학생("홍길동", 20, "남", "컴퓨터과학과");
    public 대학생(String 이름, int 나이, String 성별, String 학과) {
    	this.이름 = 이름;
        this.나이 = 나이;
        this.성별 = 성별;
        this.학과 = 학과;
    }
    
}
public class 대학생테스트2 {
	public static void main(String[] args) {
    
    	대학생 신입대학생 = new 대학생();
        대학생 신입대학생2 = new 대학생("홍길동");
        대학생 신입대학생3 = new 대학생("홍길동", 20);
        대학생 신입대학생4 = new 대학생("홍길동", 20, "남");
        대학생 신입대학생5 = new 대학생("홍길동", 20, "남", "컴퓨터과학과");
        
    }
}

위의 코드처럼 객체가 만들어지기 위한 생성자를 처리한다.

 

자기 자신의 다른 생성자 호출 : this(...)

구현된 자기 자신의 다른 생성자를 호출하는 문장으로 생성자 구현에서 첫줄에는 this(인자)로 다른 생성자를 호출하여 사용가능하다. 하지만 두 번째 줄부터는 사용 불가하다.

 

public class 대학생 {
    public String 이름;
    public int 나이;
    public String 성별;
    public String 학과;
    
    // 대학생 신입대학생 = new 대학생();
    public 대학생() {
    }
    
    // 대학생 신입대학생2 = new 대학생("홍길동");
    public 대학생(String 이름) {
    	this.이름 = 이름;
    }
    
    // 대학생 신입대학생3 = new 대학생("홍길동", 20);
    public 대학생(String 이름, int 나이) {
    	this(이름);
        this.나이 = 나이;
    }
    
    // 대학생 신입대학생4 = new 대학생("홍길동", 20, "남");
    public 대학생(String 이름, int 나이, String 성별) {
	    this(이름, 나이);
	    this.성별 = 성별;
    }

    // 대학생 신입대학생5 = new 대학생("홍길동", 20, "남", "컴퓨터과학과");
    public 대학생(String 이름, int 나이, String 성별, String 학과) {
	    this(이름, 나이, 성별);
	    this.학과 = 학과;
    }
    
}

 

반응형

댓글