https://m.blog.naver.com/PostView.nhn?blogId=jydev&logNo=220719061129&proxyReferer=https%3A%2F%2Fwww.google.com%2F

설명을 잘 해놓으 신 분


생성자(constructor)


객체 지향 프로그래밍을 하면서 아무렇지도 않게 사용해 왔던것이 생성자

-> ex) Scanner scanner = new Scanner(System.in);


API를보면

Scanner 클래스에 선언되어 있는데

Scanner(InputStream source) / Scanner(File source) 이런식으로 저장 되어있다. 이유는?

메소드도 아닌것이 자기 클래스 자신이름을 내걸고 메소드인 척 하는것

--> 생성자


- 인스턴스를 생성하기 위한 특별한 메소드

- 생성자를 선언하지 않으면 기본생성자가 있는 것으로 인식 --> 생성자를 만들지 않아도 인스턴스를 생성할 수 있다.

- 생성자는 인스턴스를 만들때 자동 호출 --> 생성자는 인위적으로 호출하여 사용할 수 없다.

- 생성자를 만들어주는 이유

=> 인스턴스 생성시 필드에 초기값으로 부여하기 위해

=> 인스턴스 생성에 필요한 초기화 명령을 실행하기 위해

- 생성자 작성 방법

1) 반환형을 사용하지 않는다. => 값을 return할 수 없다.

2) 생성자의 이름은 반드시 클래스명과 동일하게 작성한다.

3) 생성자는 오버로딩이 가능하다. => 생성자는 여러 개 선언 가능하다.


형식) public 클래스명() { //기본생성자 => 반드시 생성(Ctrl+space >> Enter)

//인스턴스가 생성될 때 실행 될 명령

}


public 클래스명(매개변수,...){//Alt+Shift+s>>o>>필드선택>>OK

//인스턴스가 생성될때 실행될 명령

}

=> 생성자를 선언하면 내부에 자동으로 선언된 기본 생성자는 소멸  

생성자의 선언

생성자는 Class 내에 선언해야 하며 생략이 가능하다.

생략을 하는 경우 기본적으로 default 상태로 멤버변수 값들이 초기화 되며,

int형은  0, double형은 0.0 String형은 null, boolean형은 false로 초기화 된다.

여태까지 우리가 사용한 생성자들은 전부 기본 생성자를 호출했기 때문에 아무런 행동도 하지 않았던 것이다.


그렇다면, 생성자를 왜 사용하는지

위의 예제를 보면 총 4개의 생성자가 존재하는것을 알 수 있다.

아무것도 없는 생성자(MemberConstructor())부터 3개의 필드가 모두 들어있는 생성자(MemberConstructor(int memberNumber, String memberName, String memberAddress)까지 총 네 가지의 생성자가 있다.


이 생성자는 객체를 초기에 만들때 멤버변수를 바로 초기화할 수 있다는 장점이 있다. 우리가 접근제어자를 맞이하면서부터 클래스의 필드에 접근하는게 굉장히 까다로워졌다. 원래였으면 객체를 생성하자마자 점(.) 찍고 멤버변수를 적어 바로 사용했었는데 getter 메소드와 setter메소드를 거쳐야 하기 떄문이다.

그걸 간단하게 해결하는 놈이 바로 '생성자'라는 놈이다.

생성자는 객체를 만들자마자 초기화할 수 있게 만들어주며, 어떤 생성자를 만들어 놨냐에 따라 다양하게 초기화 할 수 있다.

즉, 아무것도 없는 기본 생성자에서부터 파라미터 갯수가 필드의 갯수와 동등한 생성자까지 만들어 놓을 수 있고, 원하는 값을 초기화 할 수 있다.




위의 예제를 보면 알 수 있듯이, 

m2라는 객체에는 2000이라는 값을 초기화 해줬고, 2000은 int memberNumber와 부합하기 때문에 멤버번호는 2000,나머지는 디폴트 값으로 초기화 된것을 알 수 있다.

m3라는 객체는 3000, "임꺽정"이라는 값을 초기화해서 멤버번호 : 3000, 멤버이름 : 임꺽정, 멤버주소는 널값을 갖는 걸 알 수 있다.

m4도 마찬가지로 멤버번호 : 4000, 멤버이름 : 전우치, 멤버주소 : 부천시 원미구 라는 값이 초기화 됐다.

이처럼 객체 생성과 동시에 초기값을 부여하는 행위를 생성자가 할 수 있으며, 

생성자가 많을 수록 더욱 편리하게 필드에 접근 할 수 있다.


--> 이 말뜻이 위에서 

public MemberConstructor(int memberNumber){
this.memberNumber = memberNumber;
}


public MemberConstructor(int memberNumber,String memberName){
super();
this.memberNumber = memberNumber;
this.memberName = memberName;
}


public MemberConstructor(int memberNumber, String memberName, String memberAddress){
super();
this.memberNumber = memberNumber;
this.memberName = memberName;
this.memberAddress = memberAddress;
}

이렇게 한 것들이  getter/setter 메소드를 통해 객체 메시지를 주기도(getter) = 멤버 변수의 값을 public 공간으로 꺼내오는 함수 하고 받기도(setter) = 클래스 외부에서 멤버변수에게 값을 집어넣는 함수 해서 만들어주고(이건생략) 밑에 코드처럼 객체 생성하는 (클래스이름 객체이름=new 클래스명) 만써도 객체가 생성되는데 그 뒤에 ()하고 (2000) (3000,"임꺽정") (4000,"전우치","부천시 원미구") 이런식으로 써줘서 객체생성만했는데 여기다가 초기값을 넣을수 있는 장점을 만들어주는게 생성자이다.


MemberConstructor m2 = new MemberConstructor(2000);
m2.displayMember();
System.out.println("====================");

MemberConstructor m3 = new MemberConstructor(3000,"임꺽정");
m3.displayMember();
System.out.println("====================");

MemberConstructor m4 = new MemberConstructor(4000,"전우치","부천시 원미구");

m4.displayMember();
System.out.println("====================");
//생성자가 선언되어 있지 않으면 인스턴스를 생성 할 수 없다.
MemberConstructor m5 = new MemberConstructor(400,"영미","군포시","영");
}

다만, m5와 같이 선언되지 않은 생성자에 대해 접근하려고 하면 에러를 발생 시키게 된다.

생성자는 클래스에서 뗄레야 뗄수 없는 관계이다.

모든 클래스는 생성자를 갖고 있으며, 기본 생성자는 만들지 않아도 생성이된다.

다만, 기본 생성자 이외의 생성자를 만들게 된다면 기본 생성자는 자동으로 만들어지지 않으므로,

기본생성자 또한 만들어줘야 한다는 점 잊지 말도록하자.

'자바 이론 > this. 생성자 + 변수의 초기화' 카테고리의 다른 글

super() 예약어  (0) 2019.03.27

+ Recent posts