ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java: 생성자(Constructor)의 기본적인 이해
    각종 학습 요약/Java 2022. 5. 11. 13:28

    Java: 생성자(Constructor)의 기본적인 이해

    생성자란?


    생성자는 이름에서 보이듯 뭔가 생성하는 녀석이다. 그렇다면 무엇을 생성하는가? 자기 자신이다. 무슨 말인지 천천히 알아보자.
    Java의 모든 클래스 내부에는 생성자가 존재한다. 생성자가 없으면 클래스를 생성할 방법이 없다. 우리가 어떤 클래스를 객체로 생성할 때를 보면 왜인지 알 수 있다.

    String string = new String();

    new 키워드 뒤에 보면 String()가 있다. 이것은 무얼 호출하고 있는 것일까? 바로 String 클래스에 있는 생성자다. IDE에서 해당 부분에 커서를 두고 Ctrl + Click하면 String 클래스의 해당 생성자로 곧장 이동한다.

    /* String Class의 기본 생성자의 모습 */
    public String() {
        /* 지금은 이 안의 내용은 중요치 않지만, 뭔가 변수를 처리하거나 할 수도 있단 것만 알아두자. */
        this.value = "".value;
        this.coder = "".coder;
    }

    String 클래스의 기본 생성자를 보면 알 수 있듯이, 생성자는 메소드와 비슷하게 생겼으면서도 조금 다르다.

    // 생성자의 형태
    public 클래스명(파라미터) {
        /* 코드블럭 */
    }
    
    public void 메서드명(파라미터) {
        /* 코드블럭 */
    }

    거의 비슷한데 두 부분이 다르다.
    일단 메서드명은 클래스명과 상관 없이 따로 짓는다(똑같이 지어도 구동을 가능하지만, 아무도 그렇게 하지 않는다).
    그리고 생성자는 리턴타입이 없다. 생성자의 리턴타입이 int나 double이 될 필요가 있을까? 전혀 없다. 생성자의 제1목적은 오직 클래스를 인스턴스화하는 것 뿐이다. 생성만 하면 되니까, 돌려줄 것을 가정할 필요조차 없다. 그래서 리턴타입이 없다.

    this, this(), super, super()


    일단 괄호가 붙고 안붙고는 생각하지 말자. 괄호 다 떼자. this, super. 얘네부터 누군지 알아보자.
    this는 클래스 내부에서 쓰이는 키워드인데, this가 쓰여지고 있는 그 클래스 자체를 말하는 키워드다. 말이 헷갈리는데 코드로 보면 명확해진다.

    class Hello {
        public Hello() {
            this; // Hello 클래스 자신을 지칭하는 것.
        }
        public static void main(String[] args) {
            this; // 어디서 쓰이든 마찬가지다. Hello 클래스 자신을 지칭하는 것.
        }
    }
    class World {
        public World() {
            this; // World 클래스 자신을 지칭하는 것.
        }
    
        /* 잘못된 이해의 예시 */
        public Hello() { // 남의 클래스 생성자를 이런식으로 정의할 수도 없거니와
            this; // 이런다고 Hello 클래스를 지칭하는 키워드가 되지도 않는다.
        }
    }

    어디에 위치하든지 this는 자기 자신(클래스)을 말한다. 비슷한 경우로 super는 부모클래스에게 상속받아 구현한 자식클래스의 경우 사용할 수 있는 키워드(OOP의 특징 - 상속)다.

    this는 자신을 지칭하는 것이고, super는 부모-자식 관계로 연결되어있을 때 자식 클래스에서만 사용할 수 있다

    ...는 건, 답이 뻔해지는 전제가 아닌가. super는 부모클래스를 지칭하는 키워드다.

    자 그럼 이제 this와 super가 뭔지 알았으니 this()와 super()를 알아보자.

    class Example extends ExampleParents{
    
        // 이 안에서의 
        this;//가 'Example' 클래스 자신을 의미한다면
        this();//는?.... 'Example()' 이 될 것이다. Example()...
    
        public Example() { //바로 얘 말이다.
        }
    
        //그렇다면
        super();//는?.... 부모 클래스인 ExampleParents의 생성자를 호출하는 것이다.
        //ExampleParents(); //즉 이 코드와 동일하다.
    }

    여기까지, 생성자의 기본적인 내용에 대해 빠르게 알아봤다.

    몇가지 여담


    1. 기본 생성자(파라미터가 없는 생성자)는 굳이 코드로 정의하지 않아도 자동생성된다.
    2. 기본 생성자 외의 다른 생성자를 정의하면, 기본생성자는 자동생성되지 않는다.
    3. 생성자 안에서 다른 생성자를 호출(this(~); 또는 super(~);)하려고 한다면, 해당 코드는 다른 코드보다 위에 존재해야 한다.
      다른 코드를 마구 작성하고 생성자를 호출하려는 것은, 아직 생성하지 않은(생성자를 호출하지 않으면, 생성이 안된거니까) 자원에 접근하려는 것이다.
      예를 들어, 맛있는 식사를 먹기 위해서 마구 식사하는 동작들을 정의해놓고, 그 다음에 식사를 차리는 것과 같다. 제대로 식사할 수 있을리가 없겠지.
      그래서 생성자 호출 코드는 다른 코드보다 위에 정의하도록 되어있다.

    댓글

Designed by Tistory.