인프런 커뮤니티 질문&답변

썩은도토리님의 프로필 이미지
썩은도토리

작성한 질문수

김영한의 실전 자바 - 중급 1편

래퍼 클래스 - 주요 메서드와 성능

Long에서 더하기

해결된 질문

작성

·

240

0

해당 코드에서 Long은 final변수로 알고 있는데 for문 안에서 더하기가 어떻게 가능한가요?

답변 2

2

안녕하세요. 썩은도토리님, 공식 서포터즈 y2gcoder입니다.

강의자료를 봤을 때도 final 키워드가 붙어있지 않습니다!

image

혹시 어째서 그렇게 생각하셨는지 여쭤봐도 되겠습니까!?

감사합니다.

Long 래퍼 클라스가 불변 아닌가요?

이해했습니다!

Long 타입 객체는 불변 객체가 맞습니다. Wrapper 클래스들은 연산할 때

  1. 오토 언박싱

  2. 연산 수행

  3. 새로운 객체 생성 및 오토 박싱

  4. 변수에 새로운 객체를 할당

하는 방식으로 진행됩니다.

Long sumWrapper = 0L;
startTime = System.currentTimeMillis(); 
for (int i = 0; i < iterations; i++) {
    // 오토 언박싱: sumWrapper.longValue()
    long temp = sumWrapper + i; // sumWrapper.longValue() + i
    
    // 오토 박싱: Long.valueOf(temp)
    sumWrapper = temp; // 새로운 Long 객체 생성 및 할당
}
endTime = System.currentTimeMillis();
System.out.println("sumWrapper = " + sumWrapper);

대략적으로 이러한 방식으로 진행된다고 이해해주시면 감사하겠습니다.

더불어서 3. String 클래스 > String 클래스 - 불변 객체 도 복습해보시면 더 이해가 쉬우실 것 같습니다!

 

 

그래서

감사합니다!

1

불변 객체의 값 변경 하는 방법을 생각해 보시면 됩니다.

pdf2 페이지에 있는 "불변 객체-값 변경" 에서 ImmutableObj예제를 보시면, int형이 final인데도 값을 바꿀 수 있는 방법을 보실수 있습니다.

이것처럼 ImmutableObj 의 예제를 intlong으로 바꾸셔서 코드를 쳐보시고, 생각해 보시면 어느 정도 이해가 가능할 것 같네요 .

그럼 더하기를 할때마다 새로운 객체가 생성되는건가요?

예 그럴겁니다. 그런데 가비지 컬렉터로 인하여.. 알아서 제거된다 라고 이야기 했을거고, 그런것들 때문에 속도가 좀 차이가 난다라고 했습니다.(래퍼 클래스와 성능-이라는 강의를 보시면 아실거에요.)

감사합니다!

썩은도토리님의 프로필 이미지
썩은도토리

작성한 질문수

질문하기