///////
Search

static 변수 / 메서드

날짜
2022/09/28
텍스트

static 변수란?

객체를 생성하지 않고 접근이 가능한 변수
정적 변수, 클래스 변수, 공용 변수 와 같은 뜻
프로그램 실행 시, static 변수가 메모리에 올라감. → 종료 시 메모리에서 내려감
static 변수는 클래스 명으로도 접근 가능하다.
Class A { static int B; } public static void main(String[] args) { A a = new A(); A.B++; a.B++; }
Java
복사
위 코드처럼 객체 생성 없이 선언이 가능하다.
객체를 생성해도 접근이 가능하다.
예제 코드
public class StaticVar { public static void main(String[] args) { InstCnt instCnt1 = new InstCnt(); InstCnt instCnt2 = new InstCnt(); InstCnt instCnt3 = new InstCnt(); } } class InstCnt { static int instNum = 0; int norNum = 0; public InstCnt() { instNum++; System.out.println("인스턴스 생성: " + instNum); norNum++; System.out.println("인스턴스 생성2: " + norNum); } static public void print(){ // norNum++; // static 메서드 안에서 인스턴스변수 선언 불가 } }
Java
복사
결과
인스턴스 생성: 1 인스턴스 생성2: 1 인스턴스 생성: 2 인스턴스 생성2: 1 인스턴스 생성: 3 인스턴스 생성2: 1
Java
복사
객체의 생성자가 호출될 때마다 static 변수는 증가한다.
→ 객체변수가 많이 생겨도 static 은 하나만 가리킨다.
인스턴스 변수는 매번 초기화되기 때문에 증가하지 않는다.
print() 메서드 처럼 static 메서드 안에서는 인스턴스 변수 선언이 불가하다.
static 메서드는 객체 생성을 안해도 실행 시 메모리에 올라간다.
→ 인스턴스 변수는 객체 생성을 해야 메모리에 올라간다.
위 두 과정이 충돌을 일으켜 컴파일 에러가 난다.
static 변수 메모리 이해 (카드 예제)
static 변수 선언시, Method Area (Static Area) 에 static 변수의 자리가 마련된다.
→ Heap 영역이 아니기에, 프로그램이 종료될 때 까지 지워지지 않는다.
객체 변수 생성 시, static 변수의 주소를 바라보는 부분이 자동으로 할당된다.
→ 보통 메모리를 그릴 때, 저 영역은 그리지 않는다.
다른 객체 변수여도 static 변수는 같은 곳을 가리킨다.

main 함수가 public, static 인 이유

static 인 이유
→ 인스턴스 생성과 상관없이 가장 먼저 호출되기 때문에
public 인 이유
→ 일종의 약속. 외부로부터 시작되는 명령이기에 접근 가능해야 한다.