yesesyo
299
2017-08-24 14:31:43
16
1226

for 문 조건 컴파일시 질문이요~


아래와 같은 for 문이 컴파일되어 실행한다고 가정을 할때요.

매번 for문이 순회 할때마다, i 의 부등식 조건인 7 + 3 은 계속 연산이 될까요?

아니면, 한번만 연산되어 계속 10으로 참조될까요?


컴파일러가 워낙똑똑하니 계속연산하지 않을 것 같기는 한데... 혹시 한다면

앞으로 조건안에 연산을넣지않고 계산한 값을 변수에 담아서 넣어야할 것 같아서 질문드립니다. 


for (int i = 0; i < 7 + 3; i++){

}

0
0
  • 답변 16

  • ktsedd
    6k
    2017-08-24 14:35:27

    걍 저걸 출력해보시면 될거같은데

    0
  • yesesyo
    299
    2017-08-24 14:36:44

    그냥 저걸 출력해본다고, 그 출력 값이 매번 연산되어서 출력되는지 아니면 한번만 연산된 값이 출력되는 건지는 알수 없죠.



    0
  • 오아시스루
    1k
    2017-08-24 14:38:03

    병케이님 반갑습니다.

    음 제 생각에는 10으로 참조되지 않을까 싶음.

    0
  • ktsedd
    6k
    2017-08-24 14:40:10 작성 2017-08-24 14:41:35 수정됨

    그렇긴하네요 그럼 디버거로 테스트해보면 어떨까요

    저는 섣불리 어떻게 될지는 잘몰라서 그랬어요 저도 10으로 될거같긴한데

    제가 생각해본바로는 ; i++ 이부분도 i가 계속 +가 연산이 되니까

    매번 반복문마다 연산이 될거같긴해요

    0
  • yesesyo
    299
    2017-08-24 14:40:36

    컴파일러가 워낙 똑똑하니 그렇게 하지 않을까 싶긴한데, 확신이 필요하다보니 궁금해지네요...

    0
  • ktsedd
    6k
    2017-08-24 14:48:37 작성 2017-08-24 14:49:29 수정됨

    엥 지금 간단히해봤거든요 계속 타는거같아요



    package gtttttt;
    
    public class ttttttttt {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int ii=7;
    		int jj=3;
    		
    		for (int i = 0; i < plussss(ii , jj); i++){
    			System.out.println("d");
    		}
    	}
    	
    	static int plussss(int x,int y) {
    		System.out.print("*");
    		return x+y;
    	}
    
    }
    
    이거하면 아웃풋
    *d
    *d
    *d
    *d
    *d
    *d
    *d
    *d
    *d
    *d
    *
    이런식으로 나오네요


    0
  • LichKing
    14k
    2017-08-24 15:00:37
    package com.main.java;


    /**
    * Created by NHNENT on 2016-03-18.
    */
    public class Test {
    public static void main(String[] arg) {
    for (int i = 0; i < 7 + 3; i++) {
    System.out.println("hello world");
    }
    }
    }

    package com.main.java;

    public class Test {
    public Test() {
    }

    public static void main(String[] var0) {
    for(int var1 = 0; var1 < 10; ++var1) {
    System.out.println("hello world");
    }

    }
    }

    매직넘버는 10으로 만들어주네요.

    java8입니다

    1
  • LichKing
    14k
    2017-08-24 15:03:31 작성 2017-08-24 15:10:05 수정됨

    보통 콜렉션을 for문 돌릴때 사이즈를 변수에 담아쓰라는 최적화 기법이 있는데요. 요즘엔 for-each문이나 스트림으로 돌리니 큰 상관은 없지만요..

    예를들면 이런거죠

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

    for (int i = 0; i < list.size(); i++) {
    System.out.println("hello world");
    }

    이걸

    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

    int size = list.size();
    for (int i = 0; i < size; i++) {
    System.out.println("hello world");
    }

    이렇게 쓰라는 얘기를 많이 하는데..

    package com.main.java;

    import java.util.Arrays;
    import java.util.List;

    public class Test {
    public Test() {
    }

    public static void main(String[] var0) {
    List var1 = Arrays.asList(new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3), Integer.valueOf(4), Integer.valueOf(5)});

    for(int var2 = 0; var2 < var1.size(); ++var2) {
    System.out.println("hello world");
    }

    }
    }

    컴파일하고 디컴파일 해보니 이렇네요. 상수는 컴파일러가 더해서 돌리는데 메서드는 항시 호출하게됩니다.

    0
  • LichKing
    14k
    2017-08-24 15:04:20

    아 참고로 위에 컴파일결과는 size()를 변수에 담아서 돌리는걸 컴파일한게 아니라 그 위에껄 컴파일한거에요

    0
  • 구구구구우
    1k
    2017-08-24 15:19:53

    연산 계속 합니다.

    "자바 개발자들이 흔히들 실수하는 몇가지"  이런식으로 인터넷에 올라오는 글중에 자주 포함되는 아주 유명한 이야기 입니다.

    for문(변수 할당, 비교, 증가)에서 비교, 증가는 항상 실행합니다. 처음에 실행했다고 안하는게 아니에요

    보통 언급되는 내용은 컬렉션객체의 size()를 for문 비교에 쓰지 말라는 겁니다. (작은 데이터에서는 큰차이는 없겠지만요)

    for(int a = 0; a < list.size() ; a++) -> X

    for(int a = 0; size = list.size();  a <size ;  a++) -> O

    0
  • 구구구구우
    1k
    2017-08-24 15:22:15

    ????

    아까 볼때는  LichKing 님 글이 이렇게 자세하게 안올라왔었는데 쓰고나니까 제가 말할 내용을 다썼네요 


    0
  • 구구구구우
    1k
    2017-08-24 15:27:47

    LichKing //

    님에 다신 첫댓글은 저도 첨 알았네요. 하나 배우고 가네요

    결론적으로 글쓴이 분의 예제에 경우는 한번만 되겠네요. 자바 버전 어디까가지 컴파일러가 지원하는지는 모르겠지만...

    0
  • ktsedd
    6k
    2017-08-24 15:34:39

    .length .size 이런거 미리 담아야하는군요...어디서 쓴기억이..ㄷㄷ 좋은정보 알아갑니다

    0
  • 구구구구우
    1k
    2017-08-24 15:39:20

    ktse //

    length는 아니에요 연산이나, 메소드 호출의 경우만 여러번 수행 않게 하라는 거죠

    length()라는 메소드였다면야 맞는 얘기지만, 단순히 멤버 변수의 접근하는거 똑같습니다.

    LichKing님에 올리신거에 보면 상수의 연산 경우는 컴파일러가 미리 연산한 값을 넣기때문에 괜찮구요

    0
  • ktsedd
    6k
    2017-08-24 15:46:52
    아하 그렇군요 넵 이해가 가네요!!
    0
  • yesesyo
    299
    2017-09-01 09:47:40

    다들 감사합니다. 배우고가요!

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.