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 답변
-
언어마다 행동이 아주 조금씩 다를 텐데 대원칙은 대략 이렇습니다.
return
문은 뭔가를 돌려주고 해당 함수/메소드 실행을 중단합니다.if
는 단지 주어진 조건 계산값이참
일 경우에만 실행될 사항을 규정합니다. 계산값이거짓
인 경우에는else
가 있으면 그 안의 규정 사항을 실행하고 그마저도 없으면 모른 체합니다.- 조건 계산이 불가능한 경우(e.g. 조건 안의 변수가 존재하지 않을 때)가 있는데 이때는 프로그램이 가지고 있는 최우선의 예외 처리를 집어던집니다.
그러므로 올려 주신 두 개의 블럭은 말로 풀어 보면 같은 로직을 수행합니다:
com
이 존재하며 그 값이null
로 있을 경우에만com
을 새Company()
로 만들어주고 돌려줍니다.com
이null
이 아닌 다른 무엇인가로 존재하면 그냥 그걸 돌려줍니다.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; } }
댓글 입력