728x90
목차
클래스 변수, 인스턴스 변수
클래스 변수(Static 멤버)
- 클래스 내에 Static 키워드로 선언된 변수
- 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때 ~ 프로그램이 종료될 때까지 유지
- 클래스가 여러 번 생성되어도 Static 변수는 처음 딱 한 번만 생성됨
- 동일한 클래스의 모든 객체들에 의해서 공유됨
인스턴스 변수(Non-static 멤버)
- 클래스 내에 선언된 변수
- 객체 생성 시마다 매번 새로운 변수가 생성됨
- 클래스 변수와 달리 공유되지 않음
아래 예제에서 StaticTest 인스턴스를 두 개 생성한 후 staticTest1의 클래스 변수와 인스턴스 변수를 수정해보았다.
클래스 변수 classVar은 처음 한 번만 생성되고 동일한 객체를 staticTest1 과 staticTest2 에서 서로 공유하기 때문에 양쪽이 동시에 바뀌었지만 instanceVar은 객체 생성 시 마다 매번 새로 메모리에 할당되기 때문에 staticTest1.instanceVar만 변경된 것을 확인할 수 있다.
// 출력 결과
1. 10, 28
2. 10, 28
1. 12, 400
2. 12, 28
클래스 변수, 인스턴스 변수, 지역 변수가 메모리에 적재되는 위치
지역변수
- 메소드 블럭 안에 선언된 변수로 메소드 호출 시점 ~ 메소드 종료 시점 동안 유지된다.
메모리에 적재되는 위치
- 위의 예제처럼 staticTest1, staticTest2 두 객체를 생성했을 때 new()로 생성된 두 객체가 각각 Heap에 할당되고 각 객체를 가리키는 staticTest1변수와 staticTest2변수가 stack에 생성된다.
- 인스턴스 변수와 지역변수는 객체가 생성될 때마다 Stack영역에 매번 새로 생성되지만 클래스 변수는 Static Area에 한 개만 생성되고 하나의 영역을 공유한다.
클래스 변수(Static)의 주의점, 클래스 변수가 필요한 이유
주의
- 실제 static 멤버의 생성 시점은 JVM에 따라 다르다.
- 보통 JVM은 필요한 대부분의 클래스를 처음부터 로딩하기 때문에 static멤버의 생성 시점은 JVM이 시작되는 시점이라고 할 수 있다.
- 제약조건
- static 메소드는 오직 static멤버만 접근 가능
- => static메소드도 static멤버와 로드되는 시점이 동일하기 때문에 객체가 생성되지 않은 상황에서도 변수를 사용할 수 있어야 한다.
- this 키워드 사용 불가
- => this는 호출 당시 실행 중인 객체를 가리키는 레퍼런스인데 static메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하기 때문이다.
클래스 변수가 필요한 이유
- 자바는 캡슐화 원칙에 따라서 C/C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없다. 따라서 전역변수나 전역메소드로 사용해야 할 경우 static을 이용해서 해결한다.
728x90
'백엔드' 카테고리의 다른 글
[Java] Java11의 특징(Feat. Java9, Java10) (0) | 2021.09.06 |
---|---|
[Java] Java8의 특징 1. 함수형 인터페이스, Stream API, Lambda (0) | 2021.08.30 |
[Network] 동기 vs 비동기, 블로킹 vs 논블로킹의 차이 (0) | 2021.08.25 |
[Javascript] Javascript Date → Java LocalDate/LocalDateTime 변환 오류 (0) | 2021.08.12 |
[Error 해결법] Spring Boot - https to http redirect 에러 (0) | 2021.08.06 |
댓글