static (정적 영역, 클래스 영역 <=> 인스턴스 영역)
같은 클래스의 모든 인스턴스(객체)가 공동으로 사용하는 영역을 정적 영역이라고 합니다.
모든 인스턴스가 하나의 영역으로 공동으로 사용하기 때문에 인스턴스가 많이 생성되는데에 비해
사용해야 하는 영역은 모든 인스턴스에서 같은 식으로 적용이 된다면,
아무래도 인스턴스가 많이 필요할수록 그만큼 자원이 세이브가 됩니다.
// clock01 객체 생성
int hour;
int minute;
int second;
// clock02 객체 생성
int hour;
int minute;
int second;
// --> 객체가 하나 생성될 때마다 똑같은 hour, minute, second를 필요로 한다
// ==> 클래스에서 접근
static int HOUR;
static int MINUTE;
static int SECOND;
앞에 static 이 붙은 자원 (필드와 메서드에 붙는다.)은 모든 인스턴스가
공동으로 사용하는 자원이 됩니다.
static을 붙인 자원은 아무리 인스턴스가 많아도 클래스 당 정의되어져 있는 하나를 가리키는 것이고,
사용에는 클래스 이름에 .을 찍고 사용할 수 있습니다.
이렇게 static을 붙인 자원은 클래스가 메모리에 올라갈 때 생성이 되기 때문에
static 자원은 인스턴스가 생기기 전에도 사용할 수 있습니다.
이 부분에 대해서 조금 자세히 알려면 자바의정석을 참조하면 도움이 됩니다.
static 자원과 생성시기에 집중하서 보기 위해 잠깐의 컴퓨터 공학 기초 지식이 필요합니다.
SSD, HDD 디스크에 우리가 작성한 자바 소스코드가 존재합니다.
CPU는 기계어로 쓰인 컴퓨터 프로그램의 명령어를 해석하여 실행하는데, 우리가 작성한
자바 소스코드를 SSD, HDD 에서 바로 가져오지 못합니다. (속도차이 때문, 메모리 계층 구조 검색)
이 글의 초입부를 보면 CPU가 메모리에 더 빨리 접근하기 위해 메모리 계층 구조를 형성하고,
메모리는 CPU 내부에 있는 것들에는 빠르게 접근할 수 있고, CPU 외부에 있는 것들은 특정한 방법으로
접근해야 하기 때문에 아주 느린 접근 외에는 접근을 할 수 없게 되어있다고 서술되어 있습니다.
그래서 CPU와 SSD, HDD 사이에 존재하는 것이 RAM(메모리)인데,
소스코드 파일을 SSD, HDD 에서 RAM 으로 올려 로딩시키고 나면
CPU는 RAM하고만 작업을 한다. 작업이 끝난 후 다시 디스크에 저장합니다. (세이브)
아무튼 우리가 모든 작업을 하려면 클래스가 메모리에 올라가야 한다는 것입니다.
static 자원을 붙인 클래스 필드의 변수나 메서드는 바로 이때 생성되기 때문에
static 자원은 인스턴스가 생성되기 전에 사용할 수 있는 것입니다.
이러한 모든 static 자원의 변수를 클래스 변수의 종류로 분류가 됩니다.
클래스 변수, 인스턴스 변수, 지역 변수로 분류가 되는 와중에
인스턴스 변수와는 선언위치가 같습니다. 둘 다 클래스 영역에 생성이 되고,
이 둘의 변수의 활용에는 생성 시기의 차이로 다르게 사용되는 것을 알 수 있습니다.
정리를 하기 위한 표, 자바의 정석 강의 활용 표와 동일함, 일부 발췌
변수의 종류 | 선언 위치 | 생성 시기 |
클래스 변수 | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 | 인스턴스가 생성되었을 때 |
러닝타임 : 11분 16초 부터 설명 시작
이 차이를 이해하고 나서 인스턴스 변수와 static 변수의 차이 때문에 고생하는 일을 줄였습니다.
'Java (국비지원 당시 공부했던 글) > OOP (Java)' 카테고리의 다른 글
[자바] OOP - 5. 상속 (객체의 다형성과 캐스팅) (0) | 2022.05.30 |
---|---|
[자바] OOP - 4. 상속 (상속 개념과 super, 오버라이드) (0) | 2022.05.27 |
[자바] OOP - 2. 클래스의 생성자와 오버로딩 (0) | 2022.05.16 |
[자바] OOP - 1. 메서드와 클래스 (0) | 2022.05.04 |
[자바] 메소드란? (메소드, 리턴, 인자, 매개변수) (0) | 2022.04.26 |