마사키군
1k
2015-08-12 14:49:39
5
4190

생성자에서 null을 리턴할 수 있나요?


자바 클래스의 인스턴스를 생성할 때, 오류가 발생하면 클래스의 인스턴스가 아니라 null이 반환되게 하고 싶습니다.

그런데 생성자에서 null을 리턴해주면 될줄 알았는데, 아예 오류가 나네요. 생성자는 리턴타입을 지정하지 않으니까 생각해보면 당연한 것 같기는 합니다.

그래서 인터넷을 찾아보니까, 생성자 안에서 this = null을 주면 될거라는데, 이것도 오류가 나고 컴파일이 안되네요.

그 외에는 불가능하다는 글이 가장 많이 보였는데요. 자바에서 객체 생성에 실패하면 null이 리턴되게 하는건 불가능한걸까요?

사실은 생성자를 private으로 해버리고 객체를 생성하고 리턴하는 정적 메서드를 만들어서 여기서 null을 리턴하면 되기야 하겠지만, 이런 형태는 쓰고 싶지 않네요...

0
  • 답변 5

  • 손이시렵다
    1k
    2015-08-12 15:02:40

    try-catch를 걸어서 오류가 발생했을때 객체에 null을 넣고 리턴해주면 가능하지않을까요?

  • 제타건담
    7k
    2015-08-12 15:06:06

    근데 왜 null을 리턴하게 하려고 하시나요..?

    객체를 생성할때의 오류라면 시스템적이지 않고는 오류가 날 상황은 없어보입니다..만약 오류가 나는 경우를 감지해야 한다..라는 생각이 있으시다는건 객체 생성시 별도의 무언가 로직이 있고 이 과정에서 오류가 발생할 소지가 있다는 전제를 깔고 들어가는거죠..

    만약 그런거라면 두가지 방법이 있습니다..

    하나는 확인해봐야겠지만..생성자가 예외를 던지게끔 생성해서 객체 생성시 로직에 문제가 있으면 예외를 던지게 해서 생성하는쪽에서 예외를 받는거죠..근데 이 부분은 생성자에 throws를 사용할 수 있는지 확인을 해봐야 할것 같고..아마 될껍니다..왜냐면 생성자에서 예외를 던지는 클래스 함수를 실행시킬수도 있는데 그럴 경우 던져야 할 수도 있는거니까요..

    또 하나는 클래스의 특정 멤버변수를 만들어둔뒤에..그 멤버변수에 생성결과를 셋팅하는거죠..

    boolean result = false; 로 멤버변수를 두었다가..생성자에서 로직을 태운뒤에 최종적으로 result = true;로 셋팅되게 한 뒤에 그 result 변수 값을 알게끔 하면 되죠..

  • 마사키군
    1k
    2015-08-12 15:25:22

    손이시렵다 님 //

    this = null이 말씀하신 의미인 것 같은데 아쉽게도 이건 안되더라고요...


    제타건담 님 //

    예, 말씀하신 대로입니다. 업무상 소켓 통신을 하게 되어서, 소켓을 감싼 클래스를 만들었습니다. 생성자에서 내부적으로 소켓 객체를 생성했는데, 기왕 하는 김에 아예 생성자에서 소켓을 open까지 해버리고, 이 단계에서 오류가 발생하면 그냥 인스턴스 대신 null을 리턴하고 싶었습니다.

    말씀하신 대안들은 저도 생각했던 내용들이네요. 아무래도 null을 리턴할 수는 없나봐요. 실행 결과를 조회할 수 있는 속성 같은걸 만드는 방향으로 가야할 것 같네요.

  • 제타건담
    7k
    2015-08-12 15:34:34

    open 메소드는 생성자에서 실행하지 않는게 좋습니다..

    객체를 생성하면서 open 하는 것은 편할수는 있겠으나 open 하는 시기를 내맘대로 할 수 없는 단점이 있죠..

    예를 들어 글쓴분이 만든 객체를 사용하기 전에 먼가 부가적인 작업을 하고 open  해야 하는 상황이 온다면 그땐 어떡하실껀가요..? 객체를 생성하면서 자동으로 open 되어버리는데요..

    생성자는 초기셋팅 정도만 하시고..구체적인 동작은 별도로 지정하는게 융통성을 부리기 좋습니다..

    단 소켓통신 close는 객체의 finalize 메소드에서 실행해주는게 좋습니다..

    물론 close도 별도로 메소드를 만드는 것이 좋습니다..

    그러나 소켓은 여는거 보단 닫는걸 확실히 닫아줘야 하기 때문에..

    만약 close 메소드를 별도로 만든 상태에서 close를 깜빡하고 하지 않을 경우 문제가 생길수 있는거죠..

    그래서 가이드라인을 잡을때 객체의 close 메소드를 반드시 실행하라고 안내해주고 그래도 그걸 깜빡할 경우를 대비해서 객체의 finalize 메소드에서 해당 소켓이 닫혀있는지 확인하고 닫혀있지 않을 경우 close를 시켜주는게 좋습니다..

  • kmksk
    1k
    2015-08-12 15:34:36

    소켓 개발이시면 처라리 factory 클래스를 만드시는게 어쩔런지..


    MySock sock = MySockFactory.factory();

    if ( sock == null ) {

        // ...

    }


    요런식으로 보통 사용하구요.


    //손시렵다님의 말은  아래처럼 하라는 이야기입니다.

    MySock sock = null;

    try{

      sock = new MySock();

    } catch( Exception e){

    }


    if( sock == null) {

      // ...

    }


  • 로그인을 하시면 답변을 등록할 수 있습니다.