JAVA Switch-Case๋ฌธ ์กฐ๊ฑด๋“ค์€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋ ๊นŒ?

๐Ÿ‘ฉโ€๐Ÿซ ์ž๋ฐ” ๊ฐ•์˜๋ฅผ ์ค€๋น„ํ•˜๋ฉฐ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ฌธ ๋ฆฌํŒฉํ† ๋ง์„ ๊ณ ๋ฏผํ•˜๋ฉฐ ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ์‚ฌ์‹ค์€ if-else์™€ switch-case๋ฌธ์˜ ๋กœ์ง ์ˆ˜ํ–‰ ์ ˆ์ฐจ์˜ ์ฐจ์ด์ ์ž…๋‹ˆ๋‹ค.

์กฐ๊ฑด๋ฌธ์—๋Š” if-else์™€ switch-case ๋ฌธ์ด ์žˆ์ฃ ?

๊ธฐ์ดˆ์ ์ธ ๊ฑฐ์—ฌ์„œ ๊ฐ„๋žตํ•˜๊ฒŒ ์ƒ๊น€์ƒˆ๋งŒ ๋ณด๋ฉด ์•„๋ž˜์— ์‹ ์šฉ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ๋Œ€์ถœ ํ•œ๋„ ๊ธˆ์•ก์ด ๋‹ฌ๋ผ์ง€๋Š” ์˜ˆ์‹œ๋กœ if-else๋ฌธ, switch-case๋ฌธ์ด ๊ฐ๊ฐ ์žˆ์Šต๋‹ˆ๋‹ค. (๋†’์€ ๋“ฑ๊ธ‰ ์ˆœ์œผ๋กœ ๋งŽ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!)

if-else๋ฌธ

// ์ง€๊ธˆ์€ ์‚ฌ๋ผ์ง„ ์‹ ์šฉ๋“ฑ๊ธ‰์— ๋”ฐ๋ฅธ ๋Œ€์ถœ ํ•œ๋„

int creditGrade = 1;
int loanLimit;

if( creditGrade == 1){
    loanLimit = 1200;
} else if( creditGrade == 2 ) {
    loanLimit = 900;
} else if( creditGrade == 3 ) {
    loanLimit = 300;
} else {
    loanLimit = 100;
}

switch-case๋ฌธ

// ์ง€๊ธˆ์€ ์‚ฌ๋ผ์ง„ ์‹ ์šฉ๋“ฑ๊ธ‰์— ๋”ฐ๋ฅธ ๋Œ€์ถœ ํ•œ๋„

int creditGrade = 1;
int loanLimit;

switch( creditGrade ){
    case 1: loanLimit = 1200;
        break;
    case 2: loanLimit = 900;
        break;
    case 3: loanLimit = 300;
        break;
    default:
        loanLimit = 100;
}

์—ฌ๊ธฐ์„œ ๋ด์•ผํ•  ์ ์ด if-else๋ฌธ์€ ๊ฐ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ผ๋•Œ๊นŒ์ง€ ์กฐ๊ฑด๋ฌธ๋“ค์„ ๋Œ๋ฉด์„œ ๋กœ์ง์„ ๊ฒฐ์ •ํ•œ๋‹ค๋Š” ์ ์ด๊ณ , switch-case๋ฌธ์€ ์ž…๋ ฅ๋ฐ›์€ ์ผ€์ด์Šค์˜ ๋กœ์ง์œผ๋กœ ๋ฐ”๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.

if-else๋ฌธ์€ ๋ฐฉ ์œ„์น˜๋ฅผ ๋ชฐ๋ผ์„œ ๋ฐฉ๋ฌธ์„ ํ•˜๋‚˜์”ฉ ๋‘๋“œ๋ ค๋ณธ๋‹ค๋ฉด switch-case๋ฌธ์€ ๋ฐฉ ์œ„์น˜๋ฅผ ๋ฐ”๋กœ ์•Œ์•„์„œ ๋“ค์–ด๊ฐ€๋Š” ๋Š๋‚Œ์ด๋ž„๊นŒ? ๊ทธ๋Ÿฌ๋‹ˆ โ€œ๋ฐฉ์ด ๋งŽ์„ ์ˆ˜๋กโ€ ๋ฐฉ๋ฌธ์„ ์•ž์—๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๋‘๋“œ๋ ค๋ณด๋Š” if-else ๋ณด๋‹ค switch-case๋ฌธ์ด ๋” ์œ ๋ฆฌํ•  ์ˆ˜ ๋ฐ–์—์š”,

์กฐ๊ฑด๋ฌธ 4๊ฐœ ์ด์ƒ์ผ ๋•Œ๋ถ€ํ„ฐ if-else ๋ณด๋‹ค switch-case์˜ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค๊ณ  ํ•˜๋‹ˆ ์ด๋•Œ๋ถ€ํ„ฐ ์ด ์ฐจ์ด๊ฐ€ ๋” ๊ทน๋Œ€ํ™” ๋˜๋‚˜๋ณด๊ตฐ์š”.

๊ทธ๋ฆฌ๊ณ  ์œ„ ์†Œ์Šค์ฝ”๋“œ์ฒ˜๋Ÿผ ์กฐ๊ฑด์˜ ๊ฐ’๋“ค์ด 0์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๊ฐ€ switch-case๋ฌธ์„ ์“ฐ๊ธฐ ๊ฐ€์žฅ ์ ์ ˆํ•˜๋‹ค๊ณ  ํ•˜๋Š”๋ฐ,

(์ค‘์š”)๊ทธ ์ด์œ ๋Š” ์ž๋ฐ”์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด switch๋Š” tableswitch ๋˜๋Š” lookupswitch ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด case๋ฌธ์˜ ์กฐ๊ฑด์€ ์ˆซ์ž๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ , ์กฐ๊ฑด์ด String ๊ฐ์ฒด๋ผ๋ฉด String ๊ฐ์ฒด๋Š” hashCode ๋ฉ”์„œ๋“œ์— ์˜ํ•ด์„œ int ํ˜•์œผ๋กœ ๋ฐ”๋€Œ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. case๋ฌธ์ด ์ˆซ์ž์˜ ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์ •๋ ฌ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— case๋ฌธ์ด ์›๋ž˜๋ถ€ํ„ฐ ์ˆซ์ž์ด๊ณ , ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ณด๋‹ค ๋” ๋นจ๋ฆฌ ์ˆ˜ํ–‰๋˜๊ฒ ์ฃ ?

์ง์ ‘ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•ด์ค€ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์žˆ๋Š” ๊ณณ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

javap -c "ํด๋ž˜์Šค๋ช…".class

์˜คโ€ฆ!

javap_bytecode_switch_int

์šฐ์ธก์ด ํ„ฐ๋ฏธ๋„ ์ฐฝ์ธ๋ฐ, tableswitch๋ผ๋Š” ํ˜•ํƒœ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค. value๊ฐ’์œผ๋กœ ๋ณด์ด๋Š” hashCode๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณ€ํ™˜ํ•œ์—ฌ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ์ •์ˆ˜๊ฐ’์œผ๋กœ, equals() ๋ฉ”์„œ๋“œ์—์„œ ์ด hashCode๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.

case๋ฌธ์˜ 1,2,3,default๊ฐ€ ๊ทธ๋Œ€๋กœ tableswitch์— key์— ๋“ค์–ด๊ฐ€์žˆ๋„ค์š”. ์ˆœ์„œ๋„ ์˜ค๋ฆ„์ฐจ์ˆœ์ด์—ˆ์–ด์„œ, ์œ„์—์„œ ๋งํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ hashCode() ๋ฉ”์„œ๋“œ๊ฐ€ ํ•  ์ผ์„ ์ค„์—ฌ์คฌ์–ด์š”^^ loanLimit ๋ณ€์ˆ˜์˜ ๊ฐ’๋“ค์€ sipush๋กœ ๋“ค์–ด๊ฐ€์žˆ๋Š”๋ฐ, sipush, istore, goto ๋“ฑ ์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ๋”ฐ๋กœ ํฌ์ŠคํŒ…ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [์˜ค๋ผํด ๊ณต์‹๋ฌธ์„œ-Compiling Switches]๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”.

๊ทธ๋ ‡๋‹ค๋ฉด case์— ๋ฌธ์ž์—ด์„ ๋„ฃ์—ˆ์„ ๋•Œ๋Š” ์–ด๋– ํ• ๊นŒ์š”?

javap_bytecode_switch_string

case์— ๊ฐ๊ฐ โ€œbronzeโ€, โ€œsilverโ€, โ€œgoldโ€์˜ ๋ฌธ์ž์—ด์„ ๋„ฃ์–ด์ฃผ์—ˆ๋Š”๋ฐ๋„, tableswitch์˜ key๋Š” 0,1,2 ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค! ์—ฌ๊ธฐ์„œ ๋ด์•ผํ•  ์ ์€ ์ˆซ์ž์ผ ๋•Œ๋Š” key์— 0์ด ์—†์—ˆ๋Š”๋ฐ, ์—ฌ๊ธด 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ์š”..!

์ถ”์ธกํ•˜๊ธฐ๋กœ๋Š” ์ปดํŒŒ์ผ์‹œ hashCode() ๋ฉ”์„œ๋“œ์—์„œ case ์กฐ๊ฑด์ด ์ˆซ์ž์ผ ๋•Œ๋Š” ๋”ฐ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋กœ์ง์ด ์•ˆ ๋Œ๊ณ  ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ”์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” case ์กฐ๊ฑด์ด ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์— 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” int๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ JAVA Switch-Case๋ฌธ ์กฐ๊ฑด๋“ค์ด tableswitch ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” ๋ชจ์Šต์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์—๋Š” lookupswitch ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” ๋ชจ์Šต๋„ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.




Share this story