본문 바로가기
컴소니/개발

[다시 시작하는 JAVA 개발] static 제어자 이해하기

by 금소니 2022. 5. 9.
반응형

#214

 

1. 인스턴스 멤버와 정적 멤버 이해하기

static 제어자를 이해하기 전에 먼저 인스턴스 멤버와 정적 멤버를 이해해야 합니다.

다들 눈치채셨겠지만 여기서 정적 멤버가 이 static 제어자에 해당됩니다.

 

1) 인스턴스 멤버

 : 클래스 멤버 중 다른 클래스 내에 사용하기 위해선 객체를 생성해야 하는데 이 때 객체를 생성하고 사용할 수 있는 상태가 되는 멤버를 인스턴스 멤버라고 합니다.

 

2) 정적 멤버

 : 클래스 멤버 앞에 static 제어자가 선언되어 있으며, 다른 클래스에서 사용할 때 객체 생성없이 바로 사용할 수 있습니다. (Ex : 클래스명이 gold이고 멤버 명이 a일경우 gold.a로 호출하여 바로 사용할 수 있음)

 

2. static 제어자

위에서 설명한 것처럼 정적인 멤버로 사용하기 위해 static 제어자를 선언하여 사용합니다.

그래서 static 제어자를 사용하는 이유는 변경사항이 없고 전역에서 고정적으로 사용하는 멤버가 있을 경우 사용한다고 보시면 됩니다.

다만, 너무 자주 사용할 경우 static제어자는 메모리 영역을 미리 점유하고 있어 프로그램이 무거워질 수 있으니 주의하시기 바랍니다.

 

3. static 제어자 사용해보기

그러면 이제 static 제어자를 한 번 사용해보도록 하겠습니다.

 

1) 필드

비교를 위해 인스턴스 필드 하나, 정적 필드 하나씩 만들었습니다.

이제 메인 클래스/메소드에서 어떻게 보이는지 확인해보도록 하겠습니다.

보시는 것처럼 static으로 선언한 필드의 경우 별도로 객체 생성없이 클래스명.필드명을 통해 호출이 가능합니다.

하지만 인스턴스 필드의 경우 객체를 생성하지 않았기 때문에 호출이 불가능한 상태입니다.

 

그리고 static 필드의 경우에 객체를 생성하고도 호출이 가능하지만 불필요하다면 굳이 객체를 생성하지 않는 것이 메모리 활용 면에서는 좋습니다.

 

2) 메소드

메소드 또한 필드와 큰 차이는 없습니다.

static으로 정의한 메소드의 경우 마찬가지로 객체 생성없이 다른 클래스에서 호출이 가능합니다.

역시나 객체 생성없이 출력되는 것을 확인할 수 있습니다.

 

하지만 정적 메소드의 경우 추가적으로 알고 계셔야하는 내용이 있습니다.

메소드 안의 구성 요소 사용에 대한 내용인데요.

안에 변수를 선언하는 건 일반 메소드와 다를게 없는데 만약 클래스의 멤버를 메소드 내부에서 사용하고자 한다면 static으로 선언된 멤버만 사용이 가능합니다.

 

4. 메인 메소드가 static인 이유

그렇다면 마지막으로 왜 메인 메소드는 자동으로 static으로 정의되어 있을까요?

예전부터 궁금했었던 사항인데 그냥 아무렇지 않게 넘어갔었던 것 같아 확인해보려고 합니다.

일단 static의 특징을 잘 알고 있어야 합니다.

"메모리를 고정적으로 차지하고 있다"

따라서 객체를 생성할 필요 없이 바로 호출이 가능하다.

 

프로그램을 실행할 때 가장 먼저 호출하는 것이 메인 메소드입니다.

그리고 나서 메인 메소드에 작성된 소스들이 동작하는데요.

이 때 static으로 정의되어 있어야 자바 가상 머신이 별다른 객체 생성없이 바로 메인 메소드를 호출할 수 있습니다.

또한, 미리 메모리에 올라가 있기 때문에 메인 메소드를 시작점으로 하여 프로그램이 동작할 수 있습니다.

 

혹시라도 메인 메소드에서 static을 삭제하고 실행하신다면 에러가 발생하는 것을 확인하실 수 있습니다.

반응형

댓글