Be-Developer

Static

static

정적 메소드, 정적 변수를 작성하는데에 사용되는 키워드

  1. static 변수 = 클래스 멤버
    • static 메서드, 메소드는 클래스가 메모리에 올라갈때 자동적으로 생성되어 클래스의 인스턴스를 생성하지 않아도 사용할 수있다.
    • 프로그램이 종료될때 사라진다.
    • 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.
    • 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적이기 때문에 각기 다른 값을 가진다.
    • 인스턴스들이 공통적으로 하나의 변수를 굥유해야할때 static을 붙인다.
  2. static 메소드 = 클래스 메서드
    • 메서드 내에서 인스턴스 변수를 사용하지 않으면 static을 붙이는 것을 고려한다.
    • 일반 메서드는 실행시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하기때문에 시간이 더 걸리지만, static 메서드는 호출시간이 짧아져 효율적이다.
    • 인스턴스 메서드를 호출하는 경우에도 인스턴스 메서드로 선언해야한다.
    • static 메서드는 this키워드를 사용할 수 없다.
    • 상속불가, override 불가능하다.
  3. static block
    • 클래스 내부에 만들 수 있는 초기화 블록,
    • 클래스가 처음 로딩될때 main()보다 먼저 수행된다.
  4. static import
    • 다른 클래스에 존재하는 static 멤버들을 불러올때 사용한다.
    • 멤버 메소드를 바로 사용할 수 있다.

(+) static 변수가 안좋다는 입장.

  • OOP원칙에 위배된다. data는 객체에 캡슐화되어있어야하지만, static은 그렇지않다.
  • 새로운 인스턴스를 만들때 해당 인스턴스 상태에 대한 생성 이유가 명확해야한다. static 변수는 모든 상태가 될 수 있고, final이 아닌 경우 어느곳에서든 수정될수있다.
  • 테스트가 어려워진다.
  • 클래스 사용이 완료된 이후에도 정적 변수의 메모리를 garbage collector가 수집할수없다.
  • 정적 메서드로 인터페이스를 구현할 수 없으므로, 특정 객체 지향 기능을 사용할 수 없다.
  • 객체의 복사본이 여러개 필요하지 않다면 싱글톤 디자인패턴이 정적 객체보다 유용하다. (서브클래스, 테스트, 리팩토링의 장점)

final

상수, 해당 entity가 한번만 할당될 수 있으며 immutable 하다.

  • final 변수 : 한번만 초기화 가능하다.
  • final method : 메소드를 오버라이드하거나 숨길 수 없다. (private 메소드 & final class의 메소드는 final 메소드처럼 동작)
  • final class : 상속할 수 없다. ex)String

final 변수에 static 이 붙는 이유

  • 자바 final 변수는 관례적으로 static을 붙인다.
  • final 변수는 데이터와 의미, 용도를 고정시키겠다는 뜻이다.
  • 인스턴스가 만들어질때마다 같은 데이터를 위해 메모리를 새로 할당하지 않고 static으로 선언하면 더 효율적이기때문에 final static을 사용한다.

안붙는 이유

  • 오직 immutable 하기위해 사용한 final 키워드일경우, static이 붙지 않을 수 있다.
  • 클래스 로딩시간에 final 변수의 초기화가 불가능한경우, (@Autowired)static 을 붙일 수 없다.
  • 각 인스턴스마다 서로 다른 final 멤버변수를 생성자에서 초기화 시키는 식으로 사용할때에는 static 이 붙지 않아야한다.

[1] https://vaert.tistory.com/101 [2] https://gmlwjd9405.github.io/2018/08/04/java-static.html [3] https://djkeh.github.io/articles/Why-should-final-member-variables-be-conventionally-static-in-Java-kor/ [4] https://stackoverflow.com/questions/7026507/why-are-static-variables-considered-evil