Must Have 이재환의 자바 프로그래밍 입문 책을 읽고 정리한 글입니다.
스태틱
스태틱 변수 및 스태틱 메서드는 메서드 영역에 저장되며, 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸됨
- 스태틱 변수는 값이 메모리에 로딩될 때 대입됨
- 스태틱 블록(스태틱 영역)은 메모리에 로딩될 때 실행됨
- 스태틱 메서드는 누가 호출을 해줘야 실행되기 때문에 로딩만 됨
전역 변수로 사용
메서드 영역 내 스태틱 영역의 변수 및 메서드는 어떤 객체에서나 접근해서 사용할 수 있기 때문에 스태틱 변수를 전역 변수라고 부르기도 함
class Cat{
static int a = 5;
int num = 3;
void printValue(int num){
this.num = num;
System.out.println("num:" + this.num);
System.out.println("a:" + a);
}
}
a
변수는 메서드 영역 내 스태틱 영역에서 생성되고 관리됨
num
변수는 힙 영역에서 생성되고 관리됨. 생성된 객체(인스턴스)안에 만들어진다는 의미로 인스턴수 변수라고도 함
main
메서드에서 Cat
클래스형의 cat1
과 cat2
변수를 설정하면 cat1.a
와 cat2.a
는 동일한 a
를 가리키게 됨
main()보다 먼저 실행
- 스태틱 영역은 프로그램 시작 전에 (즉
main()
보다 먼저) 로드됨
- 스태틱 변수는 모든 클래스에서 값을 공유할 수 있는 장점이 있지만 다음과 같은 이유로 스태틱 변수의 남발은 지양해야 함
- 사용하는 메모리의 정확한 크기 계산을 하지 않더라도 힙 영역을 사용하지 않고 메서드 영역의 일부분만 사용하므로 메모리 사용이 비효율적
- 한 객체가 가지고 있는 데이터들은 외부에서 함부러 접근하여 수정할 수 없도록 해야 한다는 객체지향 프로그래밍 원칙(캡슐화, 정보 은닉)에 위배됨
유틸 메서드로 사용
- 스태틱 메서드는 특정 기능이 필요한데 자주 사용된다면 많은 클래스에서 중복되어 만들어지지 않게 하려는 의도에서 유틸리티 성격의 프로그램에서 많이 사용됨
- 메서드에 스태틱 예약어를 붙여 만들어놓으면 스태틱 영역에 만들어지기 때문에 서로 다른 클래스에서 얼마를 사용하든 간에 메모리에는 딱 한 번만 올라와 있게 됨
- 스태틱 메서드는 미리 메서드 영역 내 스태틱 영역에 로드가 되어있기 때문에 스태틱 메서드를 이용하기 위새어 객체를 생성하여 변수에 대입하는 과정을 거칠 필요가 없음
- 스태틱을 메서드에 붙여주면 객체 생서 없이
클래스명.메서드명
형식으로 유틸 메서드를 사용할 수 있음
System.out.println()
이 유틸 메서드의 한 종류
- 지금 위치하는 패키지, 즉 같을 폴더에 System 클래스가 없지만 자바 컴파일러가 자동으로 import를 하기 때문에 사용 가능