문제:

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

+ Recent posts