lumyjuwon   5년 전

ArrayList<Integer>에  element로 2013, 2014, 2014를 순서대로 넣은 후

if(List.get(1) == List.get(2)) {

System.out.println("성공")

}

이런 식으로 코딩했을 때 List.get(1)과 List.get(2) 값이 같아 "성공"이라는 내용이 출력돼야 하는데 출력 내용이 없더라고요

그래서

if(List.get(1).equals(List.get(2)){
System.out.println("성공")

}

이런식으로 바꿔서 실행해봤는데 ==가 아닌 .equals를 이용했을 때 "성공"이 출력 되더군요 


그런데 또 ArrayList element 1, 2, 2를 순서대로 넣은 후

if(List.get(1) == List.get(2)){

System.out.println("성공)"

}

이렇게 조건문을 돌릴 경우 "성공"이 출력 되더라고요 ..

제 생각엔 Integer가 127 이하 까지는 ==, .equals로 비교를 할 수 있는데 128 이상일 경우 .equals로만 비교할 수 있는거 같습니다.

이런건 왜 그런지 설명해주실 분 계신가요 ?

  

bupjae   5년 전

int를 Integer로 형변환하는 것을 boxing conversation 이라고 합니다. 이 때는 Integer.parseInt 매소드를 이용합니다.


https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html#valueOf-int- 를 보면 다음과 같은 문구가 있습니다:


This method will always cache values in the range -128 to 127, inclusive



이 범위에 들어가는 값인 경우 valueOf 가 항상 같은 객체를 반환하기 때문에 == 연산자로도 true를 받습니다.



하지만, 이는 비록 API 문서에 명시되어 있다고 해도 내부 상세 구현에 가까운 사항이고, Integer 객체를 == 로 비교하는 것은 항상 언제나 무조건 잘못된 방법이라고 생각해야 합니다.

bupjae   5년 전

위 답변에서 Integer.parseInt 를 Integer.valueOf 로 수정해야 합니다.

lumyjuwon   5년 전

아 그러면 Integer 객체를 .equals로 비교하는게 맞는건가요 ?

bupjae   5년 전

네. 두 Integer 객체가 같은지 확인하고 싶을 때에는 항상 언제나 무조건 equals 메소드를 이용해야 합니다.

lumyjuwon   5년 전

아 그리고 int n = Integer.parseInt("10"); 과 int n = Integer.valueOf("10"); 의 차이점도 설명해주실 수 있으신가요 ?

isku   5년 전

int와 Integer는 객체입니다.

기본적으로 127까지 값은 캐싱되어 있는데, 범위는 달라질 수 있습니다.

따라서

127 == new Integer(127) 는  true입니다.

new Integer(127) == new Integer(127) 는 false 입니다.


JAVA에서 String을 비교할 때 == 를 쓰지 않고, 항상 equals를 써야만 하는 이유를 생각해보면 될 것 같습니다!

bupjae   5년 전

parseInt의 반환값은 int (원시 타입) 이고, valueOf의 반환값은 Integer(객체)입니다.


int n = Integer.valueOf("10") ; 이라고 쓰면

1) 문자열 "10"을 parse 해서 정수 10을 만든다

2) 정수 10을 나타내는 Integer 를 반환한다.

(여기까지가 valueOf에서 하는 일)

3) Integer 10 을 int 10 으로 형변환 (unboxing conversion)

4) int 10을 n에 저장


쓸데없이 Integer 객체를 만들고 이를 다시 unboxing 하게 됩니다. 따라서 원하는게 Integer 가 아니라 int 라면 parseInt를 쓰는게 맞습니다.

isku   5년 전

Integer.valueOf("10")의 동작과정은 

Integer.parseInt("10"); 을 호출해서 String을 int로 변환하여 10을 얻어오고, 그 int 값으로 Integer.valueOf(10)을 호출해서 그 값으로 new Integer(10)를 호출하여 객체를 만듭니다.

Integer.parseInt("10")은 String을 int로 변환하여 리턴합니다.

lumyjuwon   5년 전

isku, bupjae 님 도움 주셔서 감사합니다. 어느 정도 이해는 하지만 .. 아직은 이런 세세한 차이까지 느낄 수 있는 공부를 안 해본거 같네요 더 많이 공부해야 겠습니다 ㅎㅎ 다시 한 번 도움 주셔서 감사드리며, 좋은 주말 되시기 바랍니다 ^^.

댓글을 작성하려면 로그인해야 합니다.