Joslynn의 하루

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -8일차 노트 필기_생성자(Constructor)_220727 본문

MSA Full-Stack 개발자 양성과정/Java

대용량 웹서비스를 위한 MSA Full-Stack 개발자 양성 과정 -8일차 노트 필기_생성자(Constructor)_220727

Joslynn 2022. 7. 27. 18:02

Constructor (생성자)

: 특별한 method

: 반드시 method 이름이 class 이름과 같다. (method 이름이 대문자로 시작)

: 일반적인 method 선언과 같지만 returnType 자리가 없다. (void도 기재 X)

   modifier   class이름([dataType 이름]) {      }

: 객체가 생성(new)되는 시점에 무조건 딱 한 번만 호출

 

: java의 모든 객체는 반드시 한 개 이상의 생성자를 갖는다. (여러개도 가질 수 있음;)

  프로그래머가 생성자를 하나도 작성하지 않으면, default 생성자가 자동으로 만들어진다. 

  modifier   class이름() {      } // 인수가 없는 constructor

 

: Overloading이 가능하다. (하나의 class 내에 이름이 같은 메소드가 여러 개, but 인수가 다른 것;)


<Constructor (생성자) 선언 예시>

class Test{
	// 기본 생성자 삽입된다.
    Test(){}
}


//---------------------------------------------------------

class Test{

	// 오버로딩 가능
    Test(){}
    private Test(int i){}
    Test(String str){}

}

:    new Test(); // 객체 생성 시 method 3개 포함;

 

**객체 생성 방법

new class.이름(값, 값, 값.....); // 지금까지의 new 객체 생성은 인수가 없는 default Constructor를 호출한 것과 동일;

== new Constructor(값, 값, 값....);

 

class Test{

    Test(){} // 1번
    private Test(int i){} // 2번
    Test(String str){} // 3번
    
    Test t = new Test(); // 1번 메소드 호출
    Test t = new Test("A"); // 3번 메소드 호출
    Test t = new Test (5); // 2번 메소드 호출
    
   // Test t = new Test (true); // 호출 불가
    

}

 


:현재 class 내에서 다른 생성자를 호출하는 문법

: this([값, 값, 값]) Constuctor 구현부 첫번째 줄에서 다른 생성자 딱 한 번 호출 가능

 

class Test{

//1번 method
	Test(){
    this(5); // int형 하나 받는 생성자 호출
	}

//2번 method
    Test(int i){
    this("안녕"); // String 하나 받는 생성자 호출
    }

//1번 method
    Test(String s){
    
    }
    
/*객체가 생성되는 시점에 한 번에 여러개의 호출콜을 할 수 있음 */

}

 


이후 this와 super 구분을 잘 해야함; 

// super: 자식 클래스가 자신을 생성할 때 부모 클래스의 생성자를 불러 초기화 할때; (기본적으로 자식 클래스의 생성자에 추가)


예제1) 

//ConstructorExam.java
class Puppy{
		//String,int  타입 전역 변수 선언(member 변수선언)
		String str;
		int i;
		
		/*	메소드 printPuppyName작성
			인수없음, 리턴안함
			"public void printPuppyName() 호출되었습니다!"출력
			전역변수를 출력
		*/	
			public void printPuppyName(){
			System.out.println("public void printPuppyName() 호출되었습니다!");		
			System.out.println("String Str: "+str);
			System.out.println("int i: "+ i);
		}
		
		
		
		/*인수가 없는 생성자 작성
			"생성자 public Puppy() 호출되었습니다!"출력
			printPuppyName메소드 호출
				전역변수 String에"메리" 할당
			전역변수 int에 -98998 할당
		*/
		public Puppy(){
			System.out.println("생성자 public Puppy() 호출되었습니다!");
			this.printPuppyName();
			this.str = "메리";
			this.i = -98998;
		}
			
		
}
class ConstructorExam{
	//메인메소드에서
	public static void main(String [] agrs){
		//**중요! Puppy객체 생성 == 객체가 생성되는 시점에 맴버필드 초기화, 생성자를 호출
		Puppy pp = new Puppy(); 
		//Puppy객체의 printPuppyName메소드 호출
        
        System.out.println();
		pp.printPuppyName();
		
	}
}

출력값)

 


Constructor (생성자)의 효용

: 생성자는 객체가 생성되는 시점에 자동 호출 ==> 객체가 생성되는 시점에 해야할 일이 있을 때 사용; 직접 호출 안해도 됨, 

: 객체의 init method 대신 사용할 수 있음; (데이터 초기값 세팅==초기화) //  but 재사용은 불가;

: 재사용 불가; 또 사용해야 하는 기능이라면 생성자에서는 할 수 없다.

 

자주 활용되는 생성자 기능

: 객체의 데이터를 초기화 하는 작업 가장 많이 함

→ 객체가 생성되는 시점에 constructor 사용해서 초기화 가능 ↔ setter method의 효용: 데이터 수정

 

중요!! 생성자를 하나라도 작성을 하면, 기본 생성자는 자동으로 선언되지 않음; 

따라서, 생성자 선언 시 기본 생성자도 같이 만들어주는 것이 나음; 

Comments