5. if문과 switch문의 차이
if else문을 쓸 수 있는 모든 상황에 switch문을 사용할 순 없지만, 반대로 모든 swich문은 if else문으로 대체 될 수 있다.
if else문이든 switch문이든 입력받은 변수의 값에 따라 흐름의 방향을 제어해야할 때 둘다 사용할 수 있다.
그럼 어느상황에 어느것을 쓰는게 효율적일까?
int num = 5;
int ret;
if (num == 0) ret = num;
else if (num == 1) ret = num;
else if (num == 3) ret = num;
else if (num == 5) ret = num;
else if (num == 7) ret = num;
else ret = num;
System.out.println(ret);
int num = 5;
int ret;
switch (num) {
case 0: ret = num; break;
case 1: ret = num; break;
case 3: ret = num; break;
case 5: ret = num; break;
case 7: ret = num; break;
default: ret = num; break;
}
System.out.println(ret);
구조는 다르고 결과는 같은 코드이다.
if else 구문은 각각의 조건문을 순환하여 흐름을 제어한다.
N개의 if else문이 있으면 N개의 조건문의 진위여부를 판단한다.
하지만 switch문은 동작방식이 다르다
JVM에서는 switch 구문안의 case값들의 분포에 따라 내부적으로 각각의 상황에 최적화된 2개의 자바 바이트코드를 생성한다.
위의 예와 같이 case 값들이 서로 큰 차이가 없을 경우 TableSwitch형식의 컴파일을 수행하고, case 값들이 서로 차이가 크게 날 경우 LookUpSwitch형식을 사용한다.
각각의 컴파일된 바이트코드는 아래와 같다.
(1) case가 0, 1, 3, 5, 7 일때
tableswitch 형식으로
0, 1, 3, 5, 7에 해당하는 case값만 주어졌지만 실제 컴파일 된 바이트코드를 보니 case들 사이의 값인 2, 4, 6 또한 default에 해당하는 control flow를 따르도록 컴파일 되었다.
tableswich을 수행할 때 대상들의 오프셋들의 표(테이블)로 바꾸기 적당할 때 사용이 된다.
스택 상단의 int 값은 점프 대상을 잡고 즉시 점프를 수행하기 위해 테이블에 대한 인덱스로 직접 사용됩니다. 전체 조회 + 점프 프로세스는 O(1) 작업 이므로 매우 빠릅니다.
=> tableswitch는 스택의 꼭대기에서 얻은 값을 전달하여 label을 찾아 바로 jump하는 방식으로 동작
=> label만을 사용
내 생각에 switch문에 주어진 조건을 확인하고 그에따른 case문으로 한번에 점프해서 시간복잡도가 O(1)인거 같다.
(1) case가 1, 6, 34 일때
반면, lookupswitch 형식은 case간의 값들의 차이가 크면 그 사이의 값들을 계산해두지 않는다.
=> LookUpSwitch는 Key와 함께 label을 사용
=> lookupswitch는 이진 탐색 트리형식으로 저장된 구조에서 key값을 찾아 key값과 연결된 label을 통해 jump하는 형태로 동작한다.
=> case의 대상들이 너무 흩어져 있어서 테이블로 구성하였을 때 빈 공간(이를 sparse라 부른다.)이 많을 경우에 룩업(찾아보는)하는 방식으로 동작이 된다.
모든 X <Y에 대해 keyX <keyY가되도록 lookupswitch 테이블을 항상 정렬해야 하므로 전체 조회 + 점프 프로세스는 O (log n) 작업입니다.
하지만 실행결과 실행시간의 차이는 미미했다.
훌륭한 컴파일러가 최적화 해주나보다.
'Language > Java' 카테고리의 다른 글
[자바 스터디 6주차] 상속 (0) | 2020.12.20 |
---|---|
[자바 스터디 5주차] 클래스 (0) | 2020.12.19 |
[자바 스터디 4주차] 제어문 (0) | 2020.12.02 |
[자바 스터디 3주차] 연산자 (4) | 2020.11.24 |
[자바 스터디 2주차] 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.17 |