문제:
ArrayList를 for 문으로 반복하며 add 하는 와중에
마지막 객체가 전체 리스트를 덮어쓰기 하는 현상이 발생했습니다.
원인:
만든 객체 클래스에서 변수가 static 으로 선언되었던 것
해결:
static 빼면 됩니다.!
static 변수는 클래스 변수로 객체를 생성하지 않고도 접근 가능
메모리에 고정되어 할당되므로 여러 주소값으로 주어져도 변수의 값은 변하지 않습니다.
메모리 영역 | ||||||
static 영역 클래스 모임 |
힙 영역 객체 모임 |
|||||
GC관리 ⤴ |
static 영역 | 사용자가 만든 Class | GC(Garbage Collector)가 관리 X -> 자주 사용시 과부하 위험 | |
메모리 영역 | |||
힙 영역 | new 연산을 통해 생성한 객체 | GC(Garbage Collector)가 관리 O |
예를 들어
게시물의 좋아요 수를 구한다고 가정했을 때
import java.util.*;
public class PostLike {
public static class Post {
private static Integer likeCnt1;
private Integer likeCnt2;
public Post(Integer likeCnt1, Integer likeCnt2) {
this.likeCnt1 = likeCnt1;
this.likeCnt2 = likeCnt2;
}
public Integer getLikeCnt1() {
return this.likeCnt1;
}
public Integer getLikeCnt2() {
return this.likeCnt2;
}
}
public static void main(String[] args) {
List<Post> postList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
postList.add(new Post(i, i));
}
for (Post post : postList) {
System.out.println("POST Like COUT 1 : " + post.getLikeCnt1());
System.out.println("POST Like COUT 2 : " + post.getLikeCnt2());
System.out.println();
}
}
}
출력
POST Like COUT 1 : 2
POST Like COUT 2 : 0
POST Like COUT 1 : 2
POST Like COUT 2 : 1
POST Like COUT 1 : 2
POST Like COUT 2 : 2
static으로 선언된 likeCnt1은 값이 메모리에 씌어질시 프로그램이 종료될 때까지 메모리의 값이 유지되기 때문에
마지막에 씌어진 2 라는 값이 나오게 됩니다.
클래스에서 변수의 값을 공유하고 싶을 때 static 변수를 사용합시다.
'Web Programming > JAVA' 카테고리의 다른 글
val var (0) | 2023.09.01 |
---|---|
Calendar week of year 53주 대신 1주 뜨는 현상 해결 (0) | 2021.01.11 |
HttpServletRequest 요청 URL 정보 얻는 함수 (0) | 2020.11.06 |
[JAVA] JAVA 언어의 이해 (0) | 2020.01.21 |