'case'에 해당되는 글 1건

  1. 2006/06/28 switch문의 비밀(?) 2

switch문의 비밀(?)
2006/06/28 09:15

IF/ELSE를 쓸까 switch를 쓸까 고민했던적도 있었고...
switch문을 쓸때 왜 상수밖에 안될까? 아래와 같이 문자(열)도 사용할수 있으면 좋을텐데라고 생각해본적도 있었고...

string szRet = "success";
swith(szRet)
{
  case "success":
  ...
  break;
}

아래와 같은 if/else 구조는 O(n)의 복잡도가 된다.

if(조건)
{
...
}
elseif(조건)
{
...
}
elseif(조건)
{
...
}
n개의 if/else 반복...

마찬가지로 switch 문을 사용해보자.

switch(staus)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
...  n개의 case 문
}

우리는 마찬가지로 O(n)의 복잡도를 가질거라고 상상하지만...
컴파일된 어셈블코드를 보면 이야기는 달라진다.
물론 case문이 3개 이하거나 case와 case 사이의 차이가 현격히 차이가 날경우 if/else 구조와 같이 비교/점프 코드를 생성한다.
그외의 경우는 jump table을 생성하고 switch 에 입력된 상수로 jump table에서 jump address를 얻어 바로 점프하는 O(1)의 복잡도를 갖는다.

바로 여기서 처음에 가졌던 의문, 두가지가 동시에 해결된다.
즉, 결론을 말하자면...
효율성을 따져 4개 이상의 if/else를 사용하게 된다면 switch문을 사용한다.
(case 0; case 1: 과 같이 가급적이 연속적, 순차적으로 사용하는게 좋겠다.)

만약 switch에서 문자열이 사용가능했더라면 어땠을까? 편리하기는 했어도 일일히 비교하고 분기하는데 힘(?)을 너무 써버려 배보다 배꼽이 더 커진 결과를 초래했을것이다.

O 표기법
알고리즘의 효율을 나타낼때 쓰는 표기법으로 얼마나 복잡한가를 나타낸다.
알고리즘의 연산차수가 여러개 있다면 가장 복잡한(차수가 높은) 항목으로 나타낸다.
즉 N^2+*2*N+N 과 같은 식에서 N^2를 선택해 O(n^2)와 같이 표기한다.

참고사이트
미돌이님 O표기법
위키백과의 대문자 O 표기법
이창연님 블러그
데브피아의 switch에 관한 게시물

코드와 디스어셈블

more..

2006/06/28 09:15 2006/06/28 09:15
Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다

  • 제수리 2006/06/29 09:20  댓글주소  수정/삭제  댓글쓰기
    음.....쉽다...
    IT인간에게 이쯤은...ㅋ