본문 바로가기
[study]이론정리/JAVA(eclipse)

java 6일차 _01. 생성자

by yoon9i 2024. 3. 15.

1. 생성자( constructor )
역할
: heap 메모리에 생성된 인스턴스내의 인스턴스 변수를 초기화하는 역할.
인스턴스를 직접접근할수도 있으나 권장하지 않음.
이유는 잘못된 데이터를 필터링없이 저장이 가능하기 때문이다.
ex) c1.age = 2000; // 문법적으로는 문제가 없으나 논리적으로 문제가있음.

문법:
public 클래스명( [변수, 변수, ...] ) {
// 인스턴스 변수 초기화

}
- 파라미터([변수, 변수, ...]) 가 있을수도 있고 없을수도 있다.

특징:
- 반드시 생성자가 수행이 될려면 반드시 생성자를 호출해야 된다.
- 호출방법: 

클래스명( );
ex) new Cat( );

- 생성자는 명시적으로 지정할 수도 있고 자동으로 지정될 수 있다.
  자동으로 지정되는 생성자의 형식은 다음과 같다.

public 클래스명( ) {

}
// 자동으로 지정되는 생성자는 `기본생성자, default 생성자` 
                라고한다.
  
  단, 명시적으로 생성자를 지정하면 기본생성자는 생성안됨.
  이유는 기본생성자로 new 하지 말고 명시적으로 지정한 생성자로
  new 하라는 의미이다.
  (기본생성자는 파라미터가 없는 생성자를 얘기한다.)
  필요시 기본생성자를 명시적으로 지정할 수 있다.
- 필요시 생성자를 여러개 지정할 수 있다.
  식별이 가능하기 위해서 반드시 생성자( [파라미터,...] ) 의 파라미터는
  달라야 된다.
  argument list(인자리스트; [파라미터,...])는 개수 또는 타입 또는 순서
  가 달라야한다.
  이렇게 하나의 클래스에 여러개의 생성자를 지정할 수 있고
  이것을 `오버로딩(overloading) 생성자` 라고 부른다.

- 생성자이용해서 초기화 장점 2가지
1) 생성자안에서 값의 유효성체크가 가능하다.
2) 직접접근한 방법보다 훨씬 빠르게 초기화가 가능하다.

- 오버로딩 생성자 지원하는 이유?
  사용자가 모든 인스턴스변수의 값을 알고 있지 못한 경우도 있다.
  따라서 알고있는 값만 초기화하는 역할의 오버로딩 생성자가 필요하다.

- 이클립스에서 오버로딩 생성자 코드를 자동으로 추가할수 있게 지원됨.

package exam09_클래스2_생성자;

// 고양이 객체 관리용도
/*
 * 
   1.클래스 문법:
   접근지정자 class 클래스명 {
   
   }
   
   2. 클래스명
   - 사용자 정의 식별자
   - 반드시 첫글자는 대문자
   - 의미있는 명사형
   
   3. 클래스 구성요소
   - 변수 (멤버, 멤버변수, 인스턴스 변수)
   - 메서드 (멤버, 멤버메서드)
   - 생성자( constructor ) : 멤버에 포함안됨.
   
   4. 클래스 사용
   - 반드시 객체생성해야 된다.
     객체 생성 작업을 '인스턴스화' 한다고 함.
   - new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
   - 문법:
   		  클래스명 변수명 = new 클래스명([값1, 값2, ...]);
   		  * arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
	 
 */
public class Cat1 {
	
	// 인스턴스 변수
	// heap 메모리에는 자동으로 초기화가 되어있다.
	String name; // null
	int age; // 0
	String gender; // null
	
	
	// 생성자
	// => 인스턴스변수를 초기화
	// 기본생성자는 자동으로 생성됨.
	public Cat1( ) {
		System.out.println("Cat() 생성자 호출");
	}
	
	// 명시적으로 생성자를 만들면 기본생성자는 자동생성이 되자않는다.
	public Cat1(String n) {}
	
	
	
}
package exam09_클래스2_생성자;

public class TestCat1 {
	
	// 기본생성자는 자동으로 생성됨.
	//	public TestCat() {  }
	
	public static void main(String[] args) {
		
		Cat1 c1 = new Cat1(); // Cat 에서는 파라미터가있는데 여기에는 없어서 오류가 발생
		// new Cat(); : 생성자 호출
		
		// 초기화1) 직접초기화
		// ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화
		c1.name = "야옹이";
		c1.age = 2;
		c1.gender = "암컷";
		
		System.out.printf("이름: %s, 나이: %d, 성별: %s", c1.name, c1.age, c1.gender);
		// 단점: 문법적으로는 문제가 없으나 논리적으로 문제가 있음
		// ex) age = 2000; => 논리적으로 문제가 있음.
		
		// 초기화2) 생성자이용 (권장함)
		
		
	}
}

 

################################################################################################

package exam09_클래스2_생성자2;

// 고양이 객체 관리용도
/*
 * 
   1.클래스 문법:
   접근지정자 class 클래스명 {
   
   }
   
   2. 클래스명
   - 사용자 정의 식별자
   - 반드시 첫글자는 대문자
   - 의미있는 명사형
   
   3. 클래스 구성요소
   - 변수 (멤버, 멤버변수, 인스턴스 변수)
   - 메서드 (멤버, 멤버메서드)
   - 생성자( constructor ) : 멤버에 포함안됨.
   
   4. 클래스 사용
   - 반드시 객체생성해야 된다.
     객체 생성 작업을 '인스턴스화' 한다고 함.
   - new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
   - 문법:
   		  클래스명 변수명 = new 클래스명([값1, 값2, ...]);
   		  * arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
	 
 */
public class Cat2 {
	
	// 인스턴스 변수
	// heap 메모리에는 자동으로 초기화가 되어있다.
	String name; // null
	int age; // 0
	String gender; // null
	
	
	// 생성자
	// => 인스턴스변수를 초기화
	// 기본생성자는 자동으로 생성됨.
	public Cat2( ) {
		System.out.println("Cat() 생성자");
	}
	
	// 명시적으로 생성자를 만들면 기본생성자는 자동생성이 되자않는다.
	public Cat2(String n) {
		System.out.println("Cat(String n) 생성자");
	}
	
	public Cat2(int n) {
		System.out.println("Cat(int n) 생성자");
	}
	
	public Cat2(String n, int n2) {
		System.out.println("Cat(String n, int n2) 생성자");
	}
	
	public Cat2(String n, int n2, String n3) {
		System.out.println("Cat(String n, int n2, String n3) 생성자");
	}
	
}
package exam09_클래스2_생성자2;

public class TestCat2 {
	
	// 기본생성자는 자동으로 생성됨.
	//	public TestCat() {  }
	
	public static void main(String[] args) {
		
		Cat2 c1 = new Cat2("야옹이"); // -> Cat(String n)
		Cat2 c2 = new Cat2(); // -> Cat()
		Cat2 c3 = new Cat2(2); // -> Cat(int n)
		Cat2 c4 = new Cat2("야옹이",2); // Cat(String n , int n2)
		// Cat c5 = new Cat(2,"야옹이") 에러발생 -> 관련 파라미터를 가진 생성자가 없기때문.
		Cat2 c6 = new Cat2("야옹이",2,"암컷");
		// new Cat(); : 생성자 호출
		
		// 초기화1) 직접초기화
		// ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화
		c1.name = "야옹이";
		c1.age = 2;
		c1.gender = "암컷";
		
		System.out.printf("이름: %s, 나이: %d, 성별: %s \n", c1.name, c1.age, c1.gender);
		// 단점: 문법적으로는 문제가 없으나 논리적으로 문제가 있음
		// ex) age = 2000; => 논리적으로 문제가 있음.
		
		// 초기화2) 생성자이용 (권장함)
		
		
	}
}

 

################################################################################################

 

package exam09_클래스2_생성자3_초기화;

// 고양이 객체 관리용도
/*
 * 
   1.클래스 문법:
   접근지정자 class 클래스명 {
   
   }
   
   2. 클래스명
   - 사용자 정의 식별자
   - 반드시 첫글자는 대문자
   - 의미있는 명사형
   
   3. 클래스 구성요소
   - 변수 (멤버, 멤버변수, 인스턴스 변수)
   - 메서드 (멤버, 멤버메서드)
   - 생성자( constructor ) : 멤버에 포함안됨.
   
   4. 클래스 사용
   - 반드시 객체생성해야 된다.
     객체 생성 작업을 '인스턴스화' 한다고 함.
   - new 이용. 생성된 클래스는 heap 메모리에 인스턴스로 생성됨.
   - 문법:
   		  클래스명 변수명 = new 클래스명([값1, 값2, ...]);
   		  * arguments([값1, 값2, ...]) 라고 하는데 있을수도 있고 없을수도 있다.
	 
 */
public class Cat3 {
	
	// 인스턴스 변수
	// heap 메모리에는 자동으로 초기화가 되어있다.
	String name; // null
	int age; // 0
	String gender; // null
	
	
	// 생성자
	// => 인스턴스변수를 초기화
	// 기본생성자는 자동으로 생성됨.
	public Cat3( ) {
		System.out.println("Cat() 생성자");
	}
	

	public Cat3(String n, int n2, String n3) {
		System.out.println("Cat(String n, int n2, String n3) 생성자");
		System.out.println(n + "\t" + n2 + "\t" + n3);
		// 유효성 체크가 가능하다.
		
		name = n;
		if(n2 <= 20) {
			age = n2;			
		} else {
			System.out.println("유효성체크: age 를 확인하세요.");
		}
		gender = n3;
	}
	
}
package exam09_클래스2_생성자3_초기화;

public class TestCat3 {
	
	// 기본생성자는 자동으로 생성됨.
	//	public TestCat() {  }
	
	public static void main(String[] args) {
		
		// 야옹이 2 암컷
		// 초기화2 : 생성자 이용 (권장)
		// -> Cat(String n, int n2, String n3)
		Cat3 c1 = new Cat3("야옹이",2000,"암컷");
		
		// 변수(인스턴스변수)출력
		System.out.printf("이름: %s, 나이: %d, 성별: %s \n", c1.name, c1.age, c1.gender);
		
		
		///////////////////////////////////////////////////////////////////
		
		Cat3 c2 = new Cat3();
		// -> Cat( )
		// 초기화1 ==> 객체생성후 인스턴스변수를 직접 접근해서 초기화 (권장안함)
		c2.name = "야옹이";
		c2.age = 2000;
		c2.gender = "암컷";
		// 변수출력
		System.out.printf("이름: %s, 나이: %d, 성별: %s", c2.name, c2.age, c2.gender);
		
	}
}