if문에 대한 질문입니다

조회수 1406회

코드는 자바이지만 자바에 한정되지 않는 질문입니다. 아래의 코드는 싱글톤 패턴으로 클래스를 작성하는 코드입니다.

public class Company {
    private Company() {}; //private로 생성자 만들기
    private static Company com =new Company();

    public static Company getInstance() {
        if(com==null) {
            com=new Company();
        }
        return com;

    }
}

여기서 드리고 싶은 질문은

        if(com==null) {
            com=new Company();
        }
        return com;

위의 코드와

        if(com==null) {
            com=new Company();
``          return com;
        }
       else
        return com;

의 차이가 있을까 해서요. if하나만 쓸때와 if-else로 작성할 때의 차이가 무엇인지 알 수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

3 답변

  • 언어마다 행동이 아주 조금씩 다를 텐데 대원칙은 대략 이렇습니다.

    1. return문은 뭔가를 돌려주고 해당 함수/메소드 실행을 중단합니다.
    2. if는 단지 주어진 조건 계산값이 일 경우에만 실행될 사항을 규정합니다. 계산값이 거짓인 경우에는 else가 있으면 그 안의 규정 사항을 실행하고 그마저도 없으면 모른 체합니다.
      • 조건 계산이 불가능한 경우(e.g. 조건 안의 변수가 존재하지 않을 때)가 있는데 이때는 프로그램이 가지고 있는 최우선의 예외 처리를 집어던집니다.

    그러므로 올려 주신 두 개의 블럭은 말로 풀어 보면 같은 로직을 수행합니다:

    • com이 존재하며 그 값이 null로 있을 경우에만 com을 새 Company()로 만들어주고 돌려줍니다.
    • comnull이 아닌 다른 무엇인가로 존재하면 그냥 그걸 돌려줍니다.
    • com이 존재하지 않으면 예외를 던집니다.

    하지만 메소드 전체의 의도에 따라서는 조금 고치거나 선택을 할 여지가 있겠죠.

    • 만약 이 메소드가 뭐가 됐든 무조건 com을 돌려줘야 한다면 맨 마지막이 return com;으로 끝나고 그 앞에서 if ... else를 태워서 필요한 com의 내용을 구성하는 방식이 낫습니다.
    • 만약 이 메소드가 com == null 여부에 따라서 동작을 좀 다르게 해야 한다면 if ... else 구문으로 가르고 각각 return(이든 뭐든)을 하는 게 낫습니다.
  • 특별한 의도로 나눈게 아니라면 (나중에 각 블락에서 다른 반환값을 쓸 수도 있다는 것을 미리 명시할 목적이라던가...) 컨벤션 아니면 그냥 취향 차이 같은데요. ㅎ

    예상 하셨다시피 코드는 다르지만 동작은 같고요. 심지어 컴파일 단계에서 코드 최적화를 거치면 두 코드는 같은 기계어로 번역될 가능성이 높습니다.

  • 사실 주어진 코드만으로 볼 때(즉 자바일때) com 은 null 이 될 수 없습니다.

    즉 if 구문은 의미가 없으므로 컴파일러에 의해 최적화되어 삭제될겁니다.

    이런 불필요한 분기문 최적화는 c/c++ 에서도 마찬가지입니다.

    질문의 코드는 아래와 같이 작성하는 편이 좋습니다.

    public class Company {
        private Company() {}; //private로 생성자 만들기
        private static Company com =new Company();
    
        public static Company getInstance() {
            return com;
        }
    }
    
    보다는 아래가 더 낫습니다.
    
    public class Company {
        private static Company com; 
        static {
            com =new Company();
        }
        private Company() {}; //private로 생성자 만들기
    
        public static Company getInstance() {
            return com;
        }
    }
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)