[Must Have Java][2단계] 11 스태틱의 이해

yesjuhee·2022년 11월 6일
0

Java 공부

목록 보기
5/6

Must Have 이재환의 자바 프로그래밍 입문 책을 읽고 정리한 글입니다.

스태틱

스태틱 변수 및 스태틱 메서드는 메서드 영역에 저장되며, 프로그램 시작 전에 로드되고 프로그램 종료 시 소멸됨

  • 스태틱 변수는 값이 메모리에 로딩될 때 대입됨
  • 스태틱 블록(스태틱 영역)은 메모리에 로딩될 때 실행됨
  • 스태틱 메서드는 누가 호출을 해줘야 실행되기 때문에 로딩만 됨

전역 변수로 사용

메서드 영역 내 스태틱 영역의 변수 및 메서드는 어떤 객체에서나 접근해서 사용할 수 있기 때문에 스태틱 변수를 전역 변수라고 부르기도 함

class Cat{
	static int a = 5; // static 변수
	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 클래스형의 cat1cat2 변수를 설정하면 cat1.acat2.a동일한 a를 가리키게 됨

main()보다 먼저 실행

  • 스태틱 영역은 프로그램 시작 전에 (즉 main()보다 먼저) 로드됨
  • 스태틱 변수는 모든 클래스에서 값을 공유할 수 있는 장점이 있지만 다음과 같은 이유로 스태틱 변수의 남발은 지양해야 함
    1. 사용하는 메모리의 정확한 크기 계산을 하지 않더라도 힙 영역을 사용하지 않고 메서드 영역의 일부분만 사용하므로 메모리 사용이 비효율적
    2. 한 객체가 가지고 있는 데이터들은 외부에서 함부러 접근하여 수정할 수 없도록 해야 한다는 객체지향 프로그래밍 원칙(캡슐화, 정보 은닉)에 위배됨

유틸 메서드로 사용

  • 스태틱 메서드는 특정 기능이 필요한데 자주 사용된다면 많은 클래스에서 중복되어 만들어지지 않게 하려는 의도에서 유틸리티 성격의 프로그램에서 많이 사용됨
    • 메서드에 스태틱 예약어를 붙여 만들어놓으면 스태틱 영역에 만들어지기 때문에 서로 다른 클래스에서 얼마를 사용하든 간에 메모리에는 딱 한 번만 올라와 있게 됨
  • 스태틱 메서드는 미리 메서드 영역 내 스태틱 영역에 로드가 되어있기 때문에 스태틱 메서드를 이용하기 위새어 객체를 생성하여 변수에 대입하는 과정을 거칠 필요가 없음
    • 스태틱을 메서드에 붙여주면 객체 생서 없이 클래스명.메서드명 형식으로 유틸 메서드를 사용할 수 있음
    • System.out.println() 이 유틸 메서드의 한 종류
    • 지금 위치하는 패키지, 즉 같을 폴더에 System 클래스가 없지만 자바 컴파일러가 자동으로 import를 하기 때문에 사용 가능
profile
반성은 하되 후회하지 않는다😎

0개의 댓글