본문 바로가기

컴퓨터/JAVA

자바 고급 스터디 9. static에 대하여

반응형

자바 고급 스터디 목록

공부 시간 : 2021/05/09 19:00 ~ 20:30

9주차. static에 대해여

static 이란?

정적인, 고정된 이라는 의미를 가진 키워드로써 변수, 메서드, 클래스 앞에 위치 할 수 있다. static 키워드를 붙히게 되면, Heap 영역이 아닌 Method Area(static 영역)에 생성된다. (
1.8이전)
metaspace 혹은 heap 영역에 생성된다. (1.8 이후)

static의 특징

  • static 영역 혹은 metaspace에 생성되어, 인스턴스를 생성하지 않아도 접근할 수 있다.
  • static 으로 선언하면 해당 변수를 모든 곳에서 공유할 수 있다.
  • gc의 대상이 되지 않는다.(java 1.8 이전)
  • gc의 대상이 된다.(java 1.8 이후)

static의 한계

  • 객체지향적인 코드와 거리가 멀어진다.
    • static 키워드는 객체지향 보다는 절차지향에 가까운 키워드이다.
      (객체의 생명주기와 static 변수의 생명주기가 다르다.)
    • 다형성을 적용할 수 없다. 즉 오버로딩, 동적바인딩이 불가능하다. (컴파일시에 정적 바인딩이 일어난다.)
    • 객체지향 원칙 중 캡슐화(한 객체가 가지고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 해야 한다는 원칙)을 위반한다.
  • 메모리 효율이 떨어 질 수 있다.
    • 모든 객체에서 공유하여 사용하므로 반복적으로 생성하지 않아 효율적이라고 생깍 할 수도 있다.
    • 하지만, static영역은 GC 대상이 아니므로 메모리 효율이 떨어진다.(자바 1.8 이전 기준임.)
    • 자바 1.8 이상 버전에서는 static으로 선언시 metaspace 영역 혹은 heap영역에 저장되기때문에 gc의 대상임.
  • thread safe 하지 못하다. (여러개의 쓰레드가 공유할때 A 인스턴스의 동작으로 인해 B 인스턴스의 상태가 변경될 수 있는 경우를 의미함.)

static 키워드 사용 예시

  1. 내부 클래스를 만드는 경우 static 키워드를 붙히면 memory leak를 피할 수 있다.
public class Outer {
    private int out;

    public class Inner {
        private int in;
    }

    public static class InnerStatic {
        private int in;
    }

}

위와 같이 비정적 내부 클래스인 Inner를 생성하게되면 총 3가지를 참조한다.

  1. in 맴버변수
  2. Inner 기본 생성자
  3. 외부 클래스 Outer에 대한 참조

반면에 정적 내부 클래스 InnerStatic을 생성하면 총 2가지 참조를 참조한다.

  1. in 맴버변수
  2. InnerStatic 기본생성자

비정적 내부클래스를 사용하게되면 외부클래스 Outer에 대한 참조로 인하여 memory leak가 발생할 여지가 있다. 따라서, 내부클래스를 사용할 일이 있다면 static으로 선언하여 사용하자.

  1. 메인 메서드 사용시
public class Main {
    public static void main() {
    }
}

Java 어플리케이션의 진입점(entryPoint)가 되는 main 메서드에 static 키워드를 붙여야하는 이유는 클래스가 Classloader에 의해 메모리에 올라갈때 같이 static 영역에 등록하여 GC
대상이 되지 않게 하기 위해서이다. static키워드를 빼게되면 메모리에 main 메서드가 없어 Runtime Error가 발생한다.

  1. 유틸성 클래스
  • java Math class와 같은 유틸성 클래스
  • apache의 StringUtils 클래스
  • 스프링 프레임워크 Collections 클래스

참고 사이트 :

반응형