22. static

강태석·2022년 8월 19일
0

Java 기초

목록 보기
22/24

static(정적) 이란?

정적(static)은 고정된이란 의미를 가지고 있다.
static이라는 키워드를 사용하여 static변수와 static메소드를 만들 수 있는데, 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버 및 클래스 멤버라고 한다.
정적 필드와 정적 메소드는 객체(인스턴스)에 소속된 멤버가 아니라 클래스에 고정된 멤버이다.
그렇기에 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할때 클래스별로 관리된다.
따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.


static 사용 예시

  • 멤버변수는 모든 객체가 독립적으로 갖는 고유 데이터이기 때문에 게시물의 수라는 공유 데이터를 모든 게시물이 갖게 된다.
  • 즉, 각각의 객체가 중복된 데이터를 갖게 된다.
  • 클래스를 설계할 때, 멤버변수 중 모든 객체에서 공통적으로 사용해야 하는 값에 static 을 붙인다.
  • static이 붙은 멤버변수는 객체의 개수에 상관 없이 단 하나만 생성되며, 이를 모든 객체가 공유하기 때문에 메모리를 효율적으로 사용할 수 있다.
public class Article{
	private static int count;		// 전체 글 수
	private static String category;	// 카테고리

	private int num;		// 글 번호
	private String title;		// 글 제목
	private String regDate;		// 날짜
}


컴퓨터의 메모리 구조

  • 코드영역(고정영역)
    -> 프로그램의 코드가 저장되는 영역
    이 영역에서 저장된 명령어들을 CPU가 하나씩 가져가 실행한다.

  • 데이터영역(고정영역)
    -> 전역변수와 static으로 선언된 변수가 할당된다.
    이 영역에 할당되는 변수들은 프로그램 시작과 동시에 메모리 공간이
    할당되어 종료될 때까지 남아있게 된다.

  • 힙영역(동적영역)
    -> 프로그래머가 원하는 시점에 변수를 할당하고 소멸 시키는 영역
    메모리 동적 할당시 사용된다.객체가 생성되는 영역이다.

  • 스택 영역(동적영역)
    -> 함수가 실행될 때 사용되는 파라미터와 지역변수에 대한 메모리 공간.
    함수의 종료와 함께 소멸된다.

하나의 프로그램이 사용하는 메모리 영역

  • 고정영역
    -> 프로그램이 실행되면 실행파일이 메모리에 로드 된다.
    실행파일의 용량만큼 메모리를 사용한다.
    -> 실행파일의 크기는 변할 수 없으므로 이 영역의 크기는 고정 크기를 갖는다.

  • 동적영역
    -> 프로그래머가 new 키워드를 사용해서 객체나 배열을 생성하면 사용된다. (힙영역)
    -> 메서드가 호출되는 동안 사용될 파라미터와 지역변수가 생성된다. (스택영역)
    -> 메서드가 종료되나 객체가 더이상 사용되지 않으면 생성된 변수나 객체는 메모리에서 사라지므로, 이 영역은 유동적인 크기를 갖게 된다.

static 데이터의 생성 위치

  • static 데이터는 메모리의 고정영역 중 데이터영역에 생성되고, 일반 멤버변수나 객체는 동적영역중 Heap 메모리 영역에 생성된다.

프로그램이 메모리를 사용하는 순서

  • 최초 실행시 고정 영역에 실행파일만큼의 메모리를 점유한다.
  • 프로그램이 각종 동작을 수행하는 동안 동적 영역을 사용한다.

멤버변수와 static 멤버변수의 차이

  • static 변수는 프로그램의 실행과 동시에 객체의 생성 여부와 상관 없이 이미 존재하기 때문에 소스 코드에는 특정 클래스 안에 명시하지만, 그 클래스를 통해서 생성되는 객체나 그 안에 포함되는 멤버변수와는 다른 존재이다.
  • 객체가 생성되지 않더라도 이미 존재하고 있기 때문에 static 변수는 객체의 이름을 통해 접근하는 것이 아니라, 클래스의 이름을 통해서 접근해야 한다.
  • 단, static 변수가 선언된 클래스 안에서는 변수 이름으로 직접 접근 허용된다.
// Article 클래스 및 다른 클래스에서 접근하는 경우

	Article.coutn = 5;
	Article.category = "공지사항";

// Article 클래스 내부에서 접근하는 경우
	
	count = 6;
	category = "공지사항";

static 데이터에 접근하기 위한 메서드

  • 클래스에서 정의하는 일반 메서드들은 객체의 생성과 동시에 동적 메모리 영역에서 활성화 된다.
    -> 동적 메모리 영역의 입장에서는 고정 메모리 영역의 자원들은 항상 존재한다.
    -> 고정 메모리 영역의 자원들은 동적 메모리의 자원들이 항상 존재하는 것이라는 보장을 받지 못한다.

  • 그러므로 객체의 생성과 상관 없이 static 변수에 접근하기 위한 메서드를 만들 필요가 있을때, 메서드의 정의 과정에서 static키워드를 사용하면 static 자원에 접근하기 위한 메서드를 만들 수 있다.

public staic void setCount(int count){
	Article.count = count;
}
  • 메모리 영역의 차이 때문에 static 메서드는 동적 메모리 영역의 멤버변수를 사용하거나, static이 아닌 일반 함수를 호출할 수 없다.

0개의 댓글