ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (JAVA) 자바 클래스(static) 멤버 &인스턴스(instance) 멤버
    JAVA/컨셉 , 예제 2018. 8. 24. 13:49

    자바 프로그램에서 메모리를 할당하는 방법은 두가지가 있다. static과 new가 그것이다. 

    1. stiatic  : 프로그램 작성 순간부터 메모리를 차지해 프로그램의 종료시까지 참조를 가능하게 해주는 키워드이다. 프로그램 시작부터 종료까지 메모리를 차지하고 있는 것에서 이름을 유래.(정적인) 클래스 멤버라고도 한다.
    ※ 메모리의 효율적인 사용을 위해 힙공간을 점유를 최소화 하는 것이 중요하다.

    2. new : 키워드 선언 위치의 블록이 끝날 때까지 참조 가능하게 한다. 해당 블록이 끝나면 객체의 값이 null로 바뀌며 가비지 컬렉터에 의해 회수됨.
    인스턴스 (instance) 멤버(객체)가 생성되었다고 한다. 

    여기서 중요한 것은 생성의 순서이다. 앞서 기술한 바와 같이 static 변수, 메소드들은 프로그램 작성 순간부터 메모리를 차지한다. 프로그램을 작성한 순간부터 종료시까지 참조가 가능함을 의미한다. 변수나 메소드 모두 가능하다. 프로그램을 수행하기 위해 가장 먼저 하는 작업이 static 변수와 메소드를 위한 메모리 할당이라고 생각하면 된다. 할당을 했다는 것은 해당 변수나 메소드에 대한 참조가 가능하다는 것을 의미하고, 프로그램 시작부터 끝까지 어디서나 참조가 가능하다는 말이다.

    public class Exam{ public static void main(String[] args){ } }

    main 메소드에 static이 있는 이유도 마찬가지다. static으로 main 메소드를 참조할 수 있는 공간을 할당해주는 것이 필수적이란 말이다.

    자바 실행명령어를 생각해보자.
    java 클래스명

    다음과 같이 프로그램을 수행하면
    클래스명().main(); 명령어를 통해 메인 메소드를 수행시킨다. 클래스명과 main 메소드를 참조할 수 있는 이유가 클래스와 main 메소드가 static으로 할당되었기 때문이라고 이해하면 된다.

    static 으로 선언한 메소드에서는 인스턴스 멤버 변수의 참조를 할 수가 없다. 스턴스 객체의 필드와 메소드들은 new 키워드가 등장한 이후에 메모리에 할당되어 참조가 가능하기 때문이다. 

    10번 줄은 에러가 나지 않는다. 참조할 변수 greeting이 static으로 main 메소드와 같은 시점에 선언되어서 참조할 수 있기 때문이다.
    하지만 9번 줄의 num은 인스턴스 변수로 어디선가 MemoryTest 클래스의 객체가 생성된 적이 없기 때문에 에러가 나고 있다. new를 통해 할당한 이후에 참조가 가능하게 될 것이다(에러가 나지 않는다는 말). 
    따라서 메인 메소드에서 해당 클래스의 객체를 생성해 start 메소드를 수행하게 하는 것이 실무에서의 관례라고 한다. 
    5번째 줄의 static 변수 greeting은 참조가 가능하다. main 메소드에서 new를 통해 MemoryTest 객체를 생성 후 메소드를 수행한 시점이 static 변수들을 선언한 시점보다 나중이기 때문이다. 하지만 static이 없어도 인스턴스 메소드에서 인스턴스 필드를 참조하는 것이기 때문에 참조가 가능하다. 따라서 static이 있는게 오히려 메모리의 낭비를 불러온다.
     
    학부시절 막연하게만 알던 static의 뜻에 대해 보다 정확하게 알게 됐다.



Designed by Tistory.