VS시리즈 - 인스턴스변수 vs 클래스변수

김현교·2023년 12월 20일
0

VS시리즈

목록 보기
9/12
post-thumbnail

인스턴스변수

  • Non-static 멤버
  • 클래스 내에 선언된 변수
  • 각각의 객체(인스턴스)마다 별도로 생성되며, 객체의 속성을 나타냄
  • 생성될 때마다 각각의 인스턴스 변수가 할당되고, 해당 객체가 삭제될 때 메모리에서 제거
  • 객체마다 독립적으로 존재, 한 객체의 인스턴스 변수 변경은 다른 객체에 영향을 주지 않음
  • 클래스 변수와 달리 공유되지 않음

클래스변수

  • Static 멤버, 정적 변수
  • 해당 클래스 내부에서 정의되며, 그 클래스에 속하는 모든 인스턴스가 공유
  • 프로그램이 시작될 때 할당되고, 프로그램이 종료될 때까지 메모리에 유지
  • 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
  • 모든 인스턴스에 영향을 줄 수 있으며, 한 곳에서 변경되면 다른 곳에서도 변경된 값을 참조

예제

결과

클래스 변수 classVar은 처음 한 번만 생성되고 동일한 객체를 varTest1 과 varTest2 에서 서로 공유하기 때문에 양쪽이 동시에 바뀌었지만 instanceVar은 객체 생성 시 마다 매번 새로 메모리에 할당되기 때문에 varTest1.instanceVar만 변경

차이점

  • 클래스 변수는 클래스 전체에서 공유
  • 인스턴스 변수는 개별 객체에 속하는 변수

지역 변수(번외)

  • 메서드 내에서 선언되고 메서드 내에서만 사용할 수 있는 변수
  • 메서드가 실행될 때 메모리를 할당 받으며 메서드가 끝나면 소멸되어 사용 불가능
void method(){
        int localVar; //지역변수
}

변수와 생명주기

  • 인스턴스변수 : 힙 영역을 사용, GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 김
  • 클래스변수 : 메서드 영역의 static 영역에 보관되는 변수, 메서드 영역은 프로그램 전체에서 사용하는 공용 공간, 가장 긴 생명주기를 가짐
  • 지역변수 : 스택 영역에 있는 스택 프레임 안에 보관, 생존 주기가 짧음

결론

  • 자바는 캡슐화 원칙에 따라 어떤 변수나 함수도 클래스 바깥에 존재할 수 없기에 전역변수나 전역메소드로 사용해야 할 경우 클래스 변수가 필요
  • 객체 지향 프로그래밍에서 데이터를 구성하고 사용하는 방식에 영향을 미치고 각 변수의 활용은 프로그램의 구조와 목적에 따라 달라짐
profile
내가 공부하면서 궁금했던 걸 올리는 개발 블로그

0개의 댓글