static 예약어 완전 정복

INGBEEN·2022년 1월 10일
0

JAVA

목록 보기
1/1

자바의 예약어 중 하나인 static에 대해서 알아보자!

[ static 의 일반적인 뜻 ]

static : 정적인, 고정된

컴퓨터공학에 한정하여, '정적인' 이란 말은 무엇인가?
반대말로 dynamic(동적인)을 둘 수 있다.
이들은 바로 메모리와 관련된 말임을 우리는 안다.

대충 static은 필요에 따라 그 때 그 때 메모리가 동적으로 할당되는 게 아닌, 뭔가 메모리를 항상 차지하고 있는 그런 느낌이라고 이해하고 있다.

[ JAVA 에서의 static ]

그렇다면 JAVA에서의 static 예약어는 무슨 역할을 하는가?
자바는 클래스 기반임을 안다. 그리고 그 클래스는 변수와 메서드로 이루어져 있다.
static 예약어는 이들 변수와 메서드 모두에 붙을 수 있는데, 이들이 붙은 각각은 클래스 변수, 클래스 메서드라고 이름이 붙는다. 왜?

인스턴스 변수
인스턴스 메서드
인스턴스, 즉 객체가 생성될 때에야 비로소 메모리에 적재
클래스 변수
클래스 메서드
인스턴스의 생성 유무에 상관 없이,
클래스가 로딩될 때 이미 메모리에 적재되어 있는 상태

그렇다면 이게 왜 필요한가?

클래스로부터 생성될 것으로 예상되는 모든 객체들이 동일한 값을 가지는 경우, 그 값을 클래스 변수로 선언하여 메모리에서 효율을 가져올 수 있다.

예를 들어보면 쉽게 이해된다.

class 부산출신사람들 {
	String 이름
	int 나이
	static String 출신 = '부산'
}

부산 사람들 클래스에서 객체를 300만 개 생성한다고 할 때, 출신은 보나마나 부산일 게 뻔한데 300만의 메모리 할당하는 대신, 출신을 클래스 변수로 설정하여 불필요한 메모리 낭비를 막는 것이다.

또한 클래스 메서드의 참조 대상은 오직 다른 클래스 변수나 클래스 메서드 이다.

인스턴스가 생성될 후에나 메모리에 적재될 다른 인스턴스 변수나 인스턴스 메서드를 참조한다는 것은 말이 안 되지 않는가?

[ 더 알아보기 ]

또한 static은 또 다른 예약어인 final 과 같이 쓰이는 경우가 많은데, 위의 예에서 부산 출신이라는 공통된 특징을 변경할 수 없게 처음 '부산' 으로 초기화하고 더이상 변경할 수 없게 하는 식이다.

final static String 출신 = '부산'

위는 final 예약어가 변수에 붙었을 때의 얘기고, 메서드에 붙을 경우, 상속시에 더 이상 재정의할 수 없게 만드는 기능을 한다.

profile
No Excuses

0개의 댓글