IT/JAVA
static 이해하기
Jelly_B
2020. 8. 25. 16:47
객체 간의 공유 자원을 표현하는 static 키워드
- 클래스를 설계할 때, 멤버 변수 중 모든 객체에서 공통적으로 사용해야 하는 값에 static을 붙인다.
/** 하나의 게시물을 표현하기 위한 클래스 */
public class Article {
private static int count; // 전체 글 수
private static String category; // 카테고리
private int num; // 글 번호
private String title; // 제목
private String regDate; // 날짜
}
static 적용된 변수의 사용
- static이 붙은 멤버 변수는 개체의 개수에 상관없이 단 하나만 생성되며,
이를 모든 객체가 공유하기 때문에 메모리를 효율적으로 사용할 수 있다.
컴퓨터의 메모리 구조
하나의 프로그램이 사용하는 메모리의 영역
고정 영역 | - 프로그램이 실행되면 실행파일이 메모리에 로드되면서, 실행파일의 용량만큼 RAM을 사용한다. - 실행 파일의 크기는 변할 수 없으므로 이 영역의 크기는 고정 크기를 갖는다. |
동적 영역 | - 프로그래머가 new 키워드를 사용해서 객체나 배열을 생성하면 사용된다. (힙 영역) - 메서드가 호출되는동안 사용될 파라미터와 지역변수가 생성된다. (스택 영역) - 메서드가 종료되나 객체가 더 이상 사용되지 않으면 생성된 변수나 객체는 메모리에서 사라지므로, 이 영역은 유동적인 크기를 갖게된다. |
static 데이터의 생성 위치
- static 데이터는 메모리의 고정 영역 중 데이터 영역에 생성되고,
일반 멤버변수나 객체는 동적 영역 중 Heap 메모리 영역에 생성된다.
프로그램이 메모리를 사용하는 순서
- 최초 실행 시 고정 영역에 실행파일만큼의 메모리를 점유한다.
- 프로그램이 각종 동작을 수행하는 동안 동적 영역을 사용한다.
멤버 변수와 static 멤버 변수의 차이
- static 변수는 프로그램의 실행과 동시에 객체의 생성 여부와 상관없이 이미 존재하기 때문에
소스 코드에서는 특정 클래스 안에 명시하지만, 그 클래스를 통해서 생성되는 객체나
그 안에서 포함되는 멤버 변수와는 다른 존재이다. - 객체가 생성되지 않았더라도 이미 존재하고 있기 때문에 static 변수는
객체의 이름을 통해 접근하는 것이 아니라, 클래스의 이름을 통해서 접근해야 한다. - 단, static 변수가 선언된 클래스 안에서는 변수 이름으로 직접 접근이 허용된다.
// Article 클래스 및 다른 클래스에서 접근하는 경우
Article.count = 3;
Article.category = "공지사항";
// Article 클래스에서 접근하는 경우
count = 3;
category = "공지사항";