이상하게 else if 문을 switch 문으로 바꾸니 소스가 동작하질 않네요. 블록

http://bit.ly/11dejWB

이 영문 페이지를 보시면 알겠지만 5번 이상 분기하는 else if 문을 사용할 땐 switch case 문을 쓰는 게 더 빠르다고 돼 있는데 정작 아래와 같이 첫번째 자바스크립트 소스의 else if 문을 두번째 소스의 스위치 문으로 바꾸면 제대로 원하는 결과가 나오지 않습니다. 이거 왜 그런지 아시는 분 계신가요? 원인을 모르겠네요.

[첫번째 소스-원본]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// JavaScript Code
<script language="javascript">
function display(arg,no)
{
    var rList1 = document.getElementById('list1');
    var rList2 = document.getElementById('list2');
    var rInput = document.getElementById('input');
    var rOutput = document.getElementById('output');
    var rWrite = document.getElementById('write');
    var rMode = document.getElementById('mode');
    var rNo = document.getElementById('no');
    var msg = "삭제하시겠습니까?";
 
    if(arg=="input") {
        rList1.style.display = "";
        rList2.style.display = "none";
    } else if(arg=="output") {
        rList1.style.display = "none";
        rList2.style.display = "";
    } else if(arg=="out_l") {
        document.getElementById('rno').value = no;
        document.getElementById('frm').target = "_target";
        document.getElementById('frm').submit();
    } else if(arg=="input_m") {
        rInput.style.display = "";
        rOutput.style.display = "none";
        rMode.value = "입고 수정";
        rNo.value = no;
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="output_m") {
        rInput.style.display = "none";
        rOutput.style.display = "";
        rMode.value = "출고 수정";
        rNo.value = no;
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="input_w") {
        rInput.style.display = "";
        rOutput.style.display = "none";
        rMode.value = "입고 작성";
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="output_w") {
        rInput.style.display = "none";
        rOutput.style.display = "";
        rMode.value = "출고 작성";
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="input_a") {
        rInput.style.display = "";
        rOutput.style.display = "none";
        rMode.value = "입고 추가";
        rNo.value = no;
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="output_a") {
        rInput.style.display = "none";
        rOutput.style.display = "";
        rMode.value = "출고 추가";
        rNo.value = no;
        rWrite.action = "./book_list.php";
        rWrite.target = "_self";
        rWrite.submit();
    } else if(arg=="input_d") {
        if(confirm(msg)) {
            rInput.style.display = "";
            rOutput.style.display = "none";
            rMode.value = "입고 삭제";
            rNo.value = no;
            rWrite.action = "./book_post.php";
            rWrite.target = "_self";
            rWrite.submit();
        }
    } else if(arg=="output_d") {
        if(confirm(msg)) {
            rInput.style.display = "none";
            rOutput.style.display = "";
            rMode.value = "출고 삭제";
            rNo.value = no;
            rWrite.action = "./book_post.php";
            rWrite.target = "_self";
            rWrite.submit();
        }
    }
}
</script>

[두번째 소스-비교본]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// JavaScript Code
<script language="javascript">
function display(arg,no)
{
    var rList1 = document.getElementById('list1');
    var rList2 = document.getElementById('list2');
    var rInput = document.getElementById('input');
    var rOutput = document.getElementById('output');
    var rWrite = document.getElementById('write');
    var rMode = document.getElementById('mode');
    var rNo = document.getElementById('no');
    var msg = "삭제하시겠습니까?";
 
    switch(arg){
        case "input":
            rList1.style.display = "";
            rList2.style.display = "none";
            break;
        case "output": {
            rList1.style.display = "none";
            rList2.style.display = "";
            break;
        case "out_l":
            document.getElementById('rno').value = no;
            document.getElementById('frm').target = "_target";
            document.getElementById('frm').submit();
            break;
        case "input_m":
            rInput.style.display = "";
            rOutput.style.display = "none";
            rMode.value = "입고 수정";
            rNo.value = no;
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "output_m":
            rInput.style.display = "none";
            rOutput.style.display = "";
            rMode.value = "출고 수정";
            rNo.value = no;
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "input_w":
            rInput.style.display = "";
            rOutput.style.display = "none";
            rMode.value = "입고 작성";
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "output_w":
            rInput.style.display = "none";
            rOutput.style.display = "";
            rMode.value = "출고 작성";
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "input_a":
            rInput.style.display = "";
            rOutput.style.display = "none";
            rMode.value = "입고 추가";
            rNo.value = no;
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "output_a":
            rInput.style.display = "none";
            rOutput.style.display = "";
            rMode.value = "출고 추가";
            rNo.value = no;
            rWrite.action = "./book_list.php";
            rWrite.target = "_self";
            rWrite.submit();
            break;
        case "input_d":
            if(confirm(msg)) {
                rInput.style.display = "";
                rOutput.style.display = "none";
                rMode.value = "입고 삭제";
                rNo.value = no;
                rWrite.action = "./book_post.php";
                rWrite.target = "_self";
                rWrite.submit();
            }
            break;
        case "output_d":
            if(confirm(msg)) {
                rInput.style.display = "none";
                rOutput.style.display = "";
                rMode.value = "출고 삭제";
                rNo.value = no;
                rWrite.action = "./book_post.php";
                rWrite.target = "_self";
                rWrite.submit();
            }
            break;
        default :
            break;
    }
}
</script>

덧글

  • 희망의빛™ 2014/11/18 04:26 # 답글

    두번째 소스 19행에 { 문자가 삽입돼 있군요. 헐~
  • 희망의빛™ 2014/11/18 04:23 #

    제가 스윙브라우저에서 테스트해서 미처 자바스크립트 오류를 확인하지 못했습니다. 물론 IE8에서 테스트했으면 자바스크립트 오류가 떴겠네요.
  • 절망의빛 2014/11/17 22:15 # 삭제 답글

    초보는 이글루스에 글 쓰지 맙시다.
  • 홍라쿤 2014/11/18 01:04 # 삭제 답글

    진짜 무식하다..
  • 병신새끼야 2014/11/18 01:39 # 삭제 답글

    병신아
  • 희망의빛™ 2014/11/18 08:14 # 답글

    『 If a switch contains more than five items, it's implemented using a lookup table or a hash list. This means that all items get the same access time, compared to a list of if:s where the last item takes much more time to reach as it has to evaluate every previous condition first. 』

    본문에 링크된 도움말을 해석해 보면

    "스위치문은 5개보다 더 많은 항목들을 포함하고 있으면 lookup 테이블이나 해쉬 리스트를 사용하게 된다. 이것은 if문 리스트와 비교했을 때 switch 문의 모든 항목들이 똑같은 액세스 시간이 걸린다는 걸 의미한다: if문에선 먼저 이전 조건들을 매번 비교하기 때문에 마지막 항목에 도달하는데 더 많은 시간이 걸린다."

    라고 돼 있는 것 같네요. 참고하시기 바랍니다.
  • Hide_D 2014/11/20 03:11 #

    "잘못된 지식을 가지고 계시네요."

    switch와 if-else의 속도 비교가 의미있는 경우는 정적 타입 언어일때 뿐입니다. (그 중에서도 극 소수)
    링크한 글( http://bit.ly/11dejWB )을 얼마나 잘 읽으셨는지는 모르겠으나, JavaScript가 아니라 'C#'에 대한 내용이니, 엉뚱한 내용 찾으신겁니다.
    [게다가 C#에서도 사실 별 차이 없습니다!!]

    동적 타입 언어에서 switch문의 동작방식은 if - else의 개념과 '근본적으로' 동일합니다. 약간의 튜닝이 가능하냐 불가능하냐 정도의 차이이구요.

    http://jsperf.com/performance-of-assigning-variables-in-javascript
    위 테스트를 해보면, IE11은 if-elseif, FF는 동일, 크롬에선 Switch가 빠르며, 특히 IE11에선 if-elseif가 Switch보다 많이 빠릅니다.
    그래봤자 if-elseif, switch는 현 웹 브라우저에선 '충분히' 빠르기 때문에 의미 없는 수치입니다.

    중요한건, 해당 구문 중에 어느 것이 본인의 코드에 '의미적으로 적절한가' 입니다.
  • 희망의빛™ 2014/11/20 14:11 #

    링크된 내용을 보니 초당 오퍼레이션 숫자가 나오는데 오퍼레이션 수가 적을 수록 명령어를 덜 실행하는 것이 아닌가요? if else 는 오퍼레이션이 많고 switch case는 오퍼레이션 수가 적은 걸로 나옵니다만... 맨 마지막 분기인 yahoo.com 이 열릴 때까지 어떤 방식으로 시간을 측정했다는 것인지 모르겠네요.
  • Hide_D 2014/11/20 03:14 # 답글

    덧붙이건데, 제발 jQuery 좀 쓰시죠.
  • 희망의빛™ 2014/11/20 14:13 #

    jQuery 라이브러리 인클루드 하는 방법과 실제 명령어를 적용하는 과정을 전 잘 모르겠던데... 예전부터 관련 내용을 보긴 했습니다만 실제로 얼마나 빠른지 함 테스트해보고 싶네요.
댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.


웹로그 검색