java if문에서 boolean형 변수나 int형 변수로 조건을 물을때 성능적인 차이가 있을까요??

조회수 1917회

if로 물을때 1byte짜리인 boolean변수를 묻는것과 4byte짜리 int형 변수로 묻는것의 차이가 있나요???

간단히 적어보자면 아래와 같습니다

boolean infiniteMode;

int gameScore;

[1]

if(infiniteMode)

{

//무한모드 로직

}

else

{

//노멀모드 로직

}

[2]

if(gameScore >= 55)

{

//무한모드 로직

}

else

{

//노멀모드 로직

}

[1][2] 의미가 동일한 로직입니다.

이미 [2]로 짜여져있는데 성능을 개선해야 해서요...

[2]->[1] 고민중입니다.

이게 뻘짓일지 아닐지좀 알려주시면 정말 감사하겠습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • jvm 상에서 boolean 도 int 로 저장됩니다.(스택프레임에 4바이트로 저장)

    즉 boolean 은 int 로 0 혹은 1 입니다.

    바이트코드에도 boolean 비교를 위한 니모닉(명령어)은 없습니다.

    물론...메소드 시크니처에는 I 와 Z 로 구분이 되어집니다만 메소드 내에서는 같은 같은 바이트 코드가 나올 것으로 보입니다. (오라클 JVM 한정(적어도 8버전까지)이나 제가 알기에는 IBM JVM도 동일한 것으로 알고 있습니다.)

    JVM 구현은 전적으로 벤더몫이므로 스펙을 읽어보는 것이 확실한 방법입니다.

    정리하면 JVM에서는 boolean 은 4바이트로 처리한다는 겁니다. 즉 if 에서 비교는 boolean 이나 int나 같다는 겁니다.

    boolean isFlag = true;
    if(isFlag)
    ...
    ...
    int isFlag = 1;
    if(isFlag > 0)
    

    위의 두개는 같다고 볼 수 있습니다. (물론 메소드 시그니처는 다릅니다.)

    그런데 질문에 54와 같거나 보다 크면...이 들어갔으므로 지역변수로 추가됩니다. 즉 boolean 처리 코드보다 더 긴 바이트 코드를 처리해야 합니다.

    이런경우면 boolean 이 더 짧은 바이트코드가 생성됩니다. 0이 아닌지 여부의 명령어인 ifne 만 사용하면 되니까요.

    • 감사합니다 도움이 많이 되는 답변입니다. 근데 제가 결론을 못짓겠네요... 처음엔 결국 4byte공간을 차지하게 되니 뭘 물어도 같을것이라고 이해를 하며 읽었으나 마지막엔 >= 이 있기 때문에 boolean으로 하는게 좋을것이다 로 이해하는게 맞는건가요??? 알 수 없는 사용자 2018.12.15 18:19
    • 결론만 두고 이야기 하면 ifne 즉 0이 아니라면(zero not equal) 이라는 명령어가 있으므로 0과 비교시라면 boolean과 같지만 54 와 비교라면 54는 지역변수이므로 54를 위한 스택프레임을 한칸 더 사용해야합니다. 즉 if_icmpge 혹은 if_icmple 을 사용해야 하고 2개의 스택을 사용해야 합니다. 이럴경우 boolean 비교가 더 빠를겁니다. 정영훈 2018.12.15 21:20
    • 오오~ 알겠습니다 \n 앵간하면 boolean형태로 바꿔봐야겠군요 희소식이네욤! 알 수 없는 사용자 2018.12.16 00:45

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)