시계
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)와 같이 표기한다.
알고리즘의 효율을 나타낼때 쓰는 표기법으로 얼마나 복잡한가를 나타낸다.
알고리즘의 연산차수가 여러개 있다면 가장 복잡한(차수가 높은) 항목으로 나타낸다.
즉 N^2+*2*N+N 과 같은 식에서 N^2를 선택해 O(n^2)와 같이 표기한다.
참고사이트
미돌이님 O표기법
위키백과의 대문자 O 표기법
이창연님 블러그
데브피아의 switch에 관한 게시물
코드와 디스어셈블
more..
바코드시계 ... 맨유에서 지성씨한테 칩 넣는 것 같은 기분
나 바본가봐...
무슨 말인지 모르겠어 ㅜㅜ
맨유에서 선수들에게 칩을 살짝 심어서
효과적인 훈련을 체크한다고 발표했었어욤
축구하는 기계를 만들려하는건지 ....
바코드를 보면 그런쪽으로 생각이 흘러서 훔훔훔
아하...
진작 그렇게 설명해야지...
이번주는 어디 출사 안가? 연휴인데...