티스토리 뷰

JAVA

[JAVA] - static이란?

김종현 2021. 3. 1. 01:16

이번장에서는 JAVA의 static에 대해 정리해보고자 한다.
static(정적)이란 '고정된' 의미를 말하는데 static 키워드는 필드와 메서드에 올 수 있다. 이때 이 필드와 메서드를
클래스변수, 클래스메서드라고 부른다. 그리고 static 키워드를 붙히게 되면

ClassLoader가 class파일을 메모리에 적재할때 static 영역에 생성되기 때문에 인스턴스를 생성하지 않아도 접근할 수 있다.

예제코드1

위 예제코드를 작성함으로 JVM은 다음과 같은 행위를 하게된다

  • (1) Main.java를 Main.class로 컴파일을 하게된다.
  • (2) Line 8에서 Main이란 이름을 가진 생성자를 찾아 그 생성자를 가진 class를 인스턴스화 하여 Heap영역에 적재한다
  • (3) 인스턴스화된걸 main 이란 변수에 저장하여 인스턴스 변수 name을 호출한다

위 코드는 static이라는 키워드를 사용하지 않고 직접 인스턴스를 생성해서 인스턴스 변수에 접근을 했다
이제 static을 붙혀보자.

예제코드2

필드에 static 키워드를 추가하였다. static 키워드를 추가함으로써 name이란 필드는 인스턴스 생성없이
접근할 수 있는게 확인되었다. static이 붙은 필드 및 메서드를 인스턴스 생성후에도 접근이 가능은 하지만

The static field Main.name should be accessed in a static way

라는 경고문구가 나온다

해석해보면 정적 필드는 정적방식으로 접근해야 한다고 한다. static 키워드가 붙어있으면 인스턴스 생성없이도
접근할 수 있으니 불필요한 메모리낭비는 하지말자.



그리고 static을 사용하면 해당 자원을 사용하는 모든곳에서 공유가 된다.
인스턴스를 생성하면 각 인스턴스끼리는 독립적이기 때문에 서로 다른값을 유지하게 된다. 그 이유는

인스턴스를 N개 이상 생성하게 되면 N개만큼 메모리 위치주소값이 서로 다르기 때문이다.
서로 다른 주소값을 바라보고 있기때문에 인스턴스끼리는 공유가 되지않지만.
static이 붙은 클래스변수는 class파일을 메모리에 적재할때 static 영역에 올라가기 때문에 호출하는 모든곳에선
해당 static 영역에 올라간 클래스변수를 참조하기 때문이다.



static이 붙은 메서드에서는 인스턴스 변수 및 메서드를 호출할 수 없다. 아래 예제코드를 보자

예제코드3

6 Line에서 컴파일 에러가 발생했다. 에러메세지의 내용은 다음과 같다

Cannot make a static reference to the non-static method test() from the type Main

main 메서드에서 test 메서드를 호출하는 과정에서 발생되었다.
그 이유는 main 메서드는
클래스메서드 이고 test 메서드는 인스턴스 메서드

이므로 서로 메모리에 적재되는 시점이 다르기 때문이다

 

static 키워드가 붙은 메서드는 인스턴스가 생성되지 않아도 접근이 가능하기 때문에 static 메서드 내부에서도 다른 메서드를 호출할 때 그 메서드에도 static 키워드가 붙어있어야 한다.

 

test 메서드는 static 키워드가 없기 때문에 아직 메모리에 적재되지 않았기 때문에 test 메서드를 호출할 수가 없다.
인스턴스 메서드 이기때문에 해당 메서드를 갖고있는 클래스가 인스턴스화 되야지만 호출이 가능해진다.

 

그러면 static 키워드는 언제 사용해야하는 것일까..

여러곳에서 공통으로 사용해야 되는 자원들이 존재할때 ex) 공통유틸클래스 -> FileUtils.createFile() 

사용하면 좋다. 웹 애플리케이션을 개발할때 파일업로드하는 로직을 공통유틸클래스에 클래스메서드로 정의해두고

필요한곳마다 해당 클래스메서드를 호출하는 경우이다.

 

즉, 여러곳에서 자원을 공유해도 문제가 없는부분에 static 키워드를 사용하면 된다.

 

main 메서드에 static이 붙은 이유

Java 어플리케이션을 실행할때 진입점(entrypoint)이 되는 main에 static을 붙히는 이유는
main 메서드를 클래스가 메모리에 올라갈때 같이 메모리에 적재되야하기 때문이다.
만일 static을 빼게되면 프로그램을 실행했을때 메모리에 main 메서드가 없기때문에
Runtime에서 Error가 발생하게 된다.

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함