JAVA

[Java] 생성자(Constructor)

sagesse2021 2021. 10. 28. 17:22
반응형
/*
		 * 생성자(Constructor)
		 * - 클래스를 사용하여 인스턴스를 생성할 때 호출되는 메서드 형태
		 *   => new 키워드 뒤에 생성자 호출 코드가 기술됨
		 * - 주로 인스턴스 변수를 초기화하는 용도 또는 
		 *   인스턴스 생성 시 초기에 수행할 작업을 기술하는 용도
		 * - 메서드와 형태가 유사하나 차이점 두 가지 존재
		 *   1) 선언부에 리턴타입이 없음
		 *      (리턴값이 없는 것이 아니라 리턴타입 자체를 기술하지 않음)
		 *   2) 생성자 이름이 클래스 이름과 동일함
		 * - 개발자가 클래스 정의 시 생성자를 하나도 정의하지 않으면
		 *   컴파일러에 의해 자동으로 기본(Default) 생성자가 생성됨
		 * - 메서드와 유사한 형태이므로 파라미터가 없을 수도 있고 있을 수도 있음
		 * - 생성자를 별도로 호출할 수 없으며, 반드시 new 키워드 뒤에만 지정 가능
		 * 
		 * < 생성자 정의 기본 문법 >
		 * [접근제한자] 클래스명([매개변수선언...]) {
		 * 		// 생성자 호출 시점(인스턴스 생성 시점)에 수행할 작업을 기술
		 *      // => 인스턴스 변수 초기화 등
		 * }
		 * 
		 * < 인스턴스 생성 기본 문법 >
		 * 클래스명 참조변수명 = new 생성자명([데이터...]);
		 */
public class Ex2 {

	public static void main(String[] args) {
		
		System.out.println("Person2 인스턴스 생성 전");
		
		Person2 p = new Person2(); // Person2 인스턴스 생성
		// => new 키워드에 의해 인스턴스가 생성될 때
		//    Person2() 형태의 생성자를 자동으로 호출하게 된다!
		
//		p.Person2(); // 주의! 생성자를 별도로 호출할 수 없다!
		
		System.out.println("Person2 인스턴스 생성 후");
		
//		p.name = "홍길동";
//		p.age = 20;
		System.out.println("이름 : " + p.name);
		System.out.println("나이 : " + p.age);
		
//		Person2 p2 = new Person2();
//		p2.name = "이순신";
//		p2.age = 44;
//		System.out.println("이름 : " + p2.name);
//		System.out.println("나이 : " + p2.age);
	}

}

class Person2 {
	String name;
	int age;
	
	// 클래스 정의 시 개발자가 별도의 생성자를 하나도 정의하지 않을 경우
	// 자바 컴파일러에 의해 기본 생성자가 자동으로 생성됨
	// => 기본 생성자는 접근제한자가 클래스와 같고,
	//    리턴타입이 없으며, 이름은 클래스이름과 같다.
	//    또한, 매개변수가 없으며 중괄호 블록{} 내에 수행할 코드가 없다.
//	public Person2() {} // 기본 생성자(Default Constructor)
	
//	public Person2() {
//		// 기본 생성자 내에서 생성자 호출 확인을 위한 출력문 작성
//		System.out.println("생성자 Person2() 호출됨!");
//	}
	
	// 생성자의 기본 역할 = 주로 인스턴스 변수 초기화
	// => 객체 생성 시 기본적으로 가져야하는 값을 설정하는 역할
	// => 기본 생성자 내에서 멤버변수에 특정 값을 지정하여 
	//    객체 생성 시 해당 데이터를 가진 채로 사용 가능하도록 한다.
	//    즉, 객체가 기본적으로 가져야 할 공통적인 값을 설정
	public Person2() {
		System.out.println("생성자 Person2() 호출됨!");
		// 인스턴스 변수 name 에 "홍길동" 저장, age 에 20 저장
		name = "홍길동";
		age = 20;
	}
}
/*
인스턴스 생성 전
생성자 Person2()가 호출됨!
인스턴스 생성 후
이름 : 홍길동
나이 : 20
*/
public class Test2 {

	public static void main(String[] args) {
		// 은행계좌(Account2) 클래스의 인스턴스(acc) 생성
		Account2 acc = new Account2();
		
//		acc.accountNo = "111-1111-111";
//		acc.ownerName = "홍길동";
//		acc.balance = 10000;
		
//		System.out.println("계좌번호 : " + acc.accountNo);
//		System.out.println("예금주명 : " + acc.ownerName);
//		System.out.println("현재잔고 : " + acc.balance + "원");
	}

}

class Account2 {
	String accountNo;
	String ownerName;
	int balance;
	
	public Account2() {
		System.out.println("Account2() 생성자 호출됨!");
		
		// 인스턴스 생성 시 기본값으로 가져야할 데이터를 멤버변수에 저장
		accountNo = "111-1111-111";
		ownerName = "홍길동";
		balance = 0;
		
		// 인스턴스 생성 시 초기화 후 계좌 정보를 출력하기 위해
		// showAccountInfo() 메서드 호출
		showAccountInfo();
	}
	
	// 계좌 정보를 출력하는 showAccountInfo() 메서드 정의
	public void showAccountInfo() {
		System.out.println("계좌번호 : " + accountNo);
		System.out.println("예금주명 : " + ownerName);
		System.out.println("현재잔고 : " + balance + "원");
	}
}
/*
Account2() 생성자 호출됨!
계좌번호 : 111-1111-111
예금주명 : 홍길동
현재잔고 : 0원
*/
/*
* 파라미터 생성자
* - 생성자 호출 시점에서 전달해야할 데이터가 있을 경우
*   생성자 파라미터(매개변수)를 선언할 수 있음(= 메서드와 동일)
* - 전달받은 데이터는 인스턴스 변수를 초기화하는 용도로 사용
* - 즉, 객체마다 다른 데이터를 가진 채로 인스턴스를 생성하기 위해 사용
*
* < 파라미터 생성자 정의 기본 문법 >
* < 생성자 정의 기본 문법 >
* [접근제한자] 클래스명(매개변수선언...) {
* 		// 생성자 호출 시점에 파라미터에 데이터를 전달하여
*      // 인스턴스 내의 인스턴스 변수를 초기화함
*      인스턴스변수명 = 데이터;
* }
*
* => 파라미터 생성자 자동 생성 단축키 : Alt + Shift + S -> O
*    (단, 멤버변수가 하나도 없을 경우 자동 생성창 실행되지 않음)
*/
public class Ex3 {

	public static void main(String[] args) {
		/*
		 * 파라미터 생성자
		 * - 생성자 호출 시점에서 전달해야할 데이터가 있을 경우
		 *   생성자 파라미터(매개변수)를 선언할 수 있음(= 메서드와 동일)
		 * - 전달받은 데이터는 인스턴스 변수를 초기화하는 용도로 사용
		 * - 즉, 객체마다 다른 데이터를 가진 채로 인스턴스를 생성하기 위해 사용
		 * 
		 * < 파라미터 생성자 정의 기본 문법 >
		 * < 생성자 정의 기본 문법 >
		 * [접근제한자] 클래스명(매개변수선언...) {
		 * 		// 생성자 호출 시점에 파라미터에 데이터를 전달하여
		 *      // 인스턴스 내의 인스턴스 변수를 초기화함
		 *      인스턴스변수명 = 데이터;
		 * }
		 * 
		 * => 파라미터 생성자 자동 생성 단축키 : Alt + Shift + S -> O
		 *    (단, 멤버변수가 하나도 없을 경우 자동 생성창 실행되지 않음)
		 */
		
		Person3 p = new Person3("홍길동", 20);
		p.showPersonInfo();
		
		Person3 p2 = new Person3("이순신", 44);
		p2.showPersonInfo();
		
//		Person3 p3 = new Person3(); // 오류 발생!
		// => 파라미터 생성자를 하나라도 정의할 경우
		//    컴파일러에 의해 기본 생성자가 자동으로 생성되지 않기 때문에
		//    기본 생성자를 호출할 수 없게 된다!
		
		
	}

}

class Person3 {
	String nation;
	String name;
	int age;
	
	// 생성자를 정의하지 않으면 기본 생성자가 자동으로 생성됨
//	public Person3() {} // 기본 생성자
	
	// String, int 타입 데이터를 전달받을 파라미터 생성자 정의
	public Person3(String newName, int newAge) {
		System.out.println("Person3(String, int) 생성자 호출됨!");
		
		// 전달받은 파라미터값을 인스턴스 변수에 저장
		name = newName;
		age = newAge;
		
		// 만약, 국가명(nation)은 무조건 "대한민국"으로 고정하는 경우
		// 별도로 파라미터값을 전달받지 않고 생성자 내에서 "대한민국"으로 초기화
		nation = "대한민국";
	}
	
	// 파라미터 생성자 자동 생성 단축키 : Alt + Shift + S -> O
//	public Person3(String nation, String name, int age) {
//		super();
//		this.nation = nation;
//		this.name = name;
//		this.age = age;
//	}
	
	public void showPersonInfo() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
		System.out.println("국가 : " + nation);
	}
}
/*
Person3(String,int) 생성자 호출됨
이름: 홍길동
나이 : 20
국가 : 대한민국
Person3(String,int) 생성자 호출됨
이름: 이순신
나이 : 44
국가 : 대한민국
*/
public class Test3 {

	public static void main(String[] args) {
		// 은행계좌(Account3) 클래스의 인스턴스(acc) 생성
		Account3 acc = new Account3("111-1111-111", "홍길동", 10000);
		acc.showAccountInfo();
		
		Account3 acc2 = new Account3("555-5555-555", "이순신", 99999);
		acc2.showAccountInfo();
		
	}

}

class Account3 {
	String accountNo;
	String ownerName;
	int balance;
	
	// 계좌번호, 예금주명, 현재잔고를 전달받아 초기화하는 생성자 Account3() 정의
	public Account3(String newAccountNo, String newOwnerName, int newBalance) {
		System.out.println("Account3(String, String, int) 생성자 호출됨!");
		
		accountNo = newAccountNo;
		ownerName = newOwnerName;
		balance = newBalance;
		
//		showAccountInfo();
	}
	
	
	// 계좌 정보를 출력하는 showAccountInfo() 메서드 정의
	public void showAccountInfo() {
		System.out.println("계좌번호 : " + accountNo);
		System.out.println("예금주명 : " + ownerName);
		System.out.println("현재잔고 : " + balance + "원");
	}
}
/*
계좌번호 : 123-4567-8910
예금주명 : 홍길동
현재잔고 : 0원
*/
반응형

'JAVA' 카테고리의 다른 글

[Java] 생성자 오버로딩(Constructor Overloading)  (0) 2021.10.28
[Java] 메서드 오버로딩(Method Overloading)  (0) 2021.10.28
[Java] Getter / Setter 메서드  (0) 2021.10.28
[Java] 접근제한자  (0) 2021.10.28
[Java] Class 연습  (0) 2021.10.28