본문 바로가기

StackOverflow

[Java] 생성자에서 다른 생성자를 호출할 수 있나요?

http://stackoverflow.com/questions/285177/how-do-i-call-one-constructor-from-another-in-java


Q: 자바에서, 한 클래스가 여러 생성자를 가지고 있는 경우, 그 중 한 생성자에서 다른 생성자를 호출할 수 있나요? (같은 클래스이고, subclass가 아닙니다) 만약 가능하다면 어떻게 하면 되나요? 그리고 여러 가지 방법이 있다면, 그 중 제일 좋은 방법이 무엇인가요? (그걸 수행하는 방법이 여러 가지가 있나요?)

(질문자: ashokgelal)


A: 네 가능합니다.

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}

생성자 자신이 아닌, superclass의 생성자를 호출하고 싶다면 this 대신에 super를 이용하세요.

중요한 것은, 생성자에서 다른 생성자를 호출하는 것은 1회만 가능(그 생성자 내에서 다른 생성자를 연이어 호출하는 것은 가능)하고, 그 호출은 생성자의 첫 줄에서 해야만 합니다.

(답변자: Jon Skeet)


역주: 첫 줄이 아닌 것에서 다른 생성자를 호출하려고 하면 이클립스에서는 에러를 출력합니다.




댓글

[181] this(1); 는 첫 번째 라인에 들어가야 됩니다. – superarts.org Sep 20 '12 at 2:15

 

[12] 그 말은 super클래스의 생성자와, 같은 클래스 내의 다른 생성자를 동시에 호출할 수는 없다는 뜻인가요? – gsingh2011 Nov 2 '12 at 18:02


[9] @gsingh2011: 바로 그겁니다. (연이어 호출될 수 있는) 생성자는 한 번만  이용할 수있습나다. – Jon Skeet Nov 2 '12 at 18:06


[11] this를 첫 줄에서 수행해야 하는 제약을 극복하기 위해, 생성자에 들어가는 변수로 static function을 넣는 방법을 이용할 수 있습니다. 생성자 수행 전에 계산되어야 하는 내용이 있다면, 이런 식으로 우회할 수 있습니다. – Christian Fries Mar 11 '13 at 20:34 


역주: 생성자에서 다른 생성자를 호출 할 때는 첫 줄에서만 호출할 수 있다는게 원칙입니다. 하지만 계속 연계해서 생성할 수 있기 때문에, super를 호출해야 할 때는 연계해서 호출할 수 있습니다. 그리고 변수로 static function을 넣을 수 있으니 미리 계산할 것이 필요하면 계산할 수도 있습니다.

public class Foo {
    private int x;

    private static int add(int a, int b) {
        return a + b;
    }

    public Foo() {
        this(add(3, 4));
    }

    public Foo(int x) {

        this(x + "");
    }

    public Foo(String a) {
        super();
        x = Integer.parseInt(a);
    }
}


 

 






Is it possible to call a constructor from another (within the same class, not from a subclass)? If yes how? And what could be the best way to call another constructor (if there are several ways to do it)?

shareeditflag

protected by Mysticial Jul 8 '13 at 17:58

This question is protected to prevent "thanks!", "me too!", or spam answers by new users. To answer it, you must have earned at least 10 reputation on this site.

up vote1318down voteaccepted

Yes, it is possible:

public class Foo
{
    private int x;

    public Foo()
    {
        this(1);
    }

    public Foo(int x)
    {
        this.x = x;
    }
}

To chain to a particular superclass constructor instead of one in the same class, use super instead of this. Note that you can only chain to one constructor, and it has to be the first statement in your constructor body.

See also this related question, which is about C# but where the same principles apply.

shareeditflag
181
 
and this(1); must be in the 1st line :) – superarts.org Sep 20 '12 at 2:15
12
 
So I supposed it's not possible to call a super constructor and another constructor of the same class as both need to be the first line? – gsingh2011 Nov 2 '12 at 18:02
9
 
@gsingh2011: Indeed. You can only chain to one other constructor. – Jon Skeet Nov 2 '12 at 18:06
11
 
This has to appear on the first line, but you can do calculations in the constructor before it is called: You can use static methods in the arguments of this() on the first line and encapsulate any calculation which has to be performed before the call to the other constructor in that static method. (I have added this as a separate answer). – Christian Fries Mar 11 '13 at 20:34 
6
 
@gsingh2011 I know it's late but as a way around, you can call overloaded constructor using this(...) and then in that overloaded constructor, you can make a call to base class' constructor using super(...) – AliMay 13 '13 at 7:23
  
 
@JonSkeet Yes! we can chain to one other constructor but actually we can have a very long chain – Anonymous Mohit Jul 16 '13 at 21:38 
  
 
@Mohit: And why is that a problem? It's really not clear what the context of your comment is... – Jon Skeet Jul 16 '13 at 21:46
  
 
no not a problem i just added up to your comment that said "only one other constructor" so for many others create a long chain – Anonymous Mohit Jul 16 '13 at 22:13
  
 
It is mandatory that if you are using this() or super() they must be the first statement of the constructor and both can not be used in a constructor. – Harshit Gupta Jun 27 at 11:18
  
 
@gsingh2011 yes, for some reason only a single constructor of a class is allowed. – Francis Jun 28 at 16:01 
  
 
@Francis: I assume you mean "you can only chain to one other constructor" - currently your statement makes it sound like you can only have one constructor per class, which is clearly not true. – Jon SkeetJun 28 at 16:32
  
 
@JonSkeet yup I meant chaining to one other constructor only. thanks for the correction and I apologize for my misleading statement. – Francis Jun 29 at 11:06