Java

생성자(Constructor)

유호야 2020. 12. 5. 20:48
반응형

이번 포스팅의 주제는 생성자(Constructor) 입니다.

대부분의 책에서는 '인스턴스를 초기화 하는 메서드이다' 와 비슷하게 생성자를 정의하는데요.
위의 설명을 파해쳐(?!) 보겠습니다.

우선 인스턴스(Instance)메모리에 생성된 클래스를 말합니다.
어떠한 클래스를 사용하고자 할 때는 new 연산자를 사용해 메모리 상에 클래스를 생성(인스턴스화) 하고
이 생성된 주소(인스턴스의 주소)를 리턴해 레퍼런스 변수에 저장하게 됩니다.

ex) 클래스명 레퍼런스변수 = new 클래스명(); 

여기서 바로 생성자가 사용됩니다.!
어...어디 있다는 거지...요...?
우변을 자세히 보도록 하겠습니다.

new 클래스명();
분명 우리는 괄호() 가 명 뒤에 붙는 것들은 메서드로 알고 있습니다. 근데 왜 클래스명뒤에 괄호()를 붙였을까요?
그냥 문법이 그런거겠죠..하고 넘어가셨나요?

위의 우변을 생략 없이 보게 되면
new 클래스명 생성자명(); 정도로 생각하시면 됩니다.
왜 그런지는 인스턴스가 생상되는 과정을 보시면 이해가 되실 거에요.

new 연산자에 의해 클래스가 힙 메모리 상에 인스턴스로 생성됩니다.
그리고 이 인스턴스는 생성자에 의해 초기화되게 됩니다. (정확히 말하면 인스턴스변수 초기화)
이 초기화된 인스턴스의 주소가 레퍼런스 변수에 저장되게 되는 것이죠.

그런데 생성자에는 조건이 있습니다.

1. 생성자명은 클래스명과 같아야 한다.
2. 리턴타입이 없어야 한다.

입니다.

 

그러니 위의 우변을 다시 보게 되면,
1번 조건에 의해 new 클래스명 클래스명(); 으로 바뀔수 있겠죠?
여기서 클래스명이 중복이 되기 때문에 생략되는 것입니다.

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

그럼 이제 생성자의 조건을 봤으니,
실제 클래스의 생성자를 만들어 보도록 하죠.

File>new>class 에서 ContentVO라는 클래스를 하나 만들었습니다.

public class ContentVO {
     private String title;
     private String content;
}

title과 content 라는 문자열 타입을 인스턴스변수로 갖는 클래스가 있습니다.
이렇게만 코드를 작성하여도 우리는 import만 하게 되면

ContentVO vo = new ContentVO(); 로 생성할 수 가 있습니다.

이유는 컴파일러에서 하나의 생성자도 없을 경우에만 자동으로 생성자를 생성해주기 때문입니다.
그럼 생성자를 만들어보도록 하죠.
마우스 오른쪽버튼>Generate Constructor using Fields.. 를 선택하셔도 되고

alt+shift+s 후에 o 를 누르셔도 됩니다. (단축키)

그럼 위와 같은 창이 뜨게 되고 OK를 선택하시면 아래와 같은 생성자 코드가 생성됩니다.

public class ContentVO {
     private String title;
     private String content;
 
     public ContentVO(String title, String content) {
          super();
          this.title = title;
          this.content = content;
     }
}

 

리턴타입도 없고 클래스와 명도 똑같죠? 생성자가 맞습니다.
그런데 생성자 내에 super(); 는 왜 생긴거며 뭘까요?

상속에 대해 공부해보신 분은 super()는 상속을 받은 super class의 생성자를 가리키는 것이다 라고 보셨을꺼에요.
근데 extends 받은 클래스도 없는데? 
Object는 모든 클래스의 최상위 클래스로 extends Object가 생략된 것입니다.
다시말해 super() 는 최상위 클래스인 Object의 생성자입니다.
super()에 커서를 두고 F3을 누르시면 Object.class 파일로 이동 되는 것을 보실 수 있습니다.

하지만 앞에서 말씀드렸 듯이 생성자는 생략이 가능하기 떄문에
Object 클래스에도 생성자가 보이지 않죠. (컴파일러에서 자동으로 디폴트 생성자를 생성)
물론 super()를 삭제해도 무방합니다.

이클립스에서 자동으로 생성해준 생성자를 보니 위에서 생성한 인스턴스 변수와 같은 이름의 파라미터를 받아
인스턴스 변수에 초기화를 하는 것을 보실 수 있습니다. (this는 ContentVO class를 의미)
이 것이 생성자의 역할 입니다.

포스팅의 가장 위에 나온 '인스턴스를 초기화 하는 메서드이다' 가 이해 되셨나요?

중요 내용만 정리하면, 생성자는

1. 클래스의이름과 같은 메서드이다.
2. 유일하게 메서드의 리턴타입이 없다.
3. 인스턴스 변수를 초기화 하는 역할을 한다.

이 것 말고도 final로 선언된 상수의 최초 한번 초기화가 가능한 기능도 있습니다.

public class ContentVO {
     private final String title;
     private String content;
 
     public ContentVO(String title, String content) {
          super();
          this.title = title;   /* 이 것이 가능! */
          this.content = content;
     }
}

알아두시구요.
생성자는 Method Overloading도 가능합니다.

public class ContentVO {
     private String title;
     private String content;
 
     public ContentVO(String title, String content) {
          super();
          this.title = title;
          this.content = content;
     }
 
 
 
     public ContentVO(String title) {
          super();
          this.title = title;
     }
 
 
 
     public ContentVO(String content) {
          super();
          this.content = content;
     }
}

지금까지 자바의 생성자에 대해 알아보았습니다.

쉬우면 쉬운 개념이지만 정확히 이해하고 넘어가는 시간이 되었으면 좋겠습니다.



출처: https://aljjabaegi.tistory.com/408 [알짜배기 프로그래머]

반응형

'Java' 카테고리의 다른 글

[JSP] JDBC 프로그래밍에 사용되는 객체  (0) 2020.12.05
[JDBC] JDBC 필수 지식  (0) 2020.12.05
EL(Expression Language)이란?  (0) 2020.12.05
Dispatcher방식과 Redirect 방식  (0) 2020.12.04
RequestDispatcher란?  (0) 2020.12.04