Static & Final

김성호·2023년 1월 17일
0

Java

목록 보기
1/6

Static

Java에서 정적, 전역이란 의미로 사용된다. static으로 선언된 값은 Method memory에 할당되며 프로그램이 끝날 때 까지 계속 유지된다. static이란 키워드로 static변수(정적 필드, 클래스 변수)와 static메소드(정적 메소드)를 만들 수 있고 이 둘을 합쳐 정적 멤버(=클래스 멤버)라고 한다.
정적필드와 정적메소드는 객체에 소속된 멤버가 아니라 클래스에 고정된 멤버이다. 컴파일 이후 클래스가 바이트코드로 바뀐 후 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나는 즉시 사용할 수 있다.

  1. 공통적으로 사용해야하는 것에 static을 붙인다.
    • 인스턴스를 생성하면, 각 인스턴스들은 서로 다른 독립적인 메모리를 할당받기 때문에 서로 다른 값을 가진다.
    • 인스턴스들이 공통적인 값이 유지되어야 하는 경우에 static을 사용한다.
  2. static이 붙은 멤버변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
    • 이미 메소드 메모리에 올라가 있기 때문이다.
  3. static이 붙은 메소드에선 인스턴스 변수를 사용할 수 없다.
    • static이 붙은 메소드에서 인스턴스 변수 사용을 허용하지 않는다. -> 메소드를 호출할 때 인스턴스가 생성되어 있는지 아닌지 확신할 수 없기 때문이다.
  • 인스턴스 변수 : 인스턴스가 생성될 때 같이 생성되는 변수. 인스턴스 변수를 읽어오거나 저장하려면 인스턴스를 먼저 생성해야 한다. 인스턴스 별로 다른 값을 가질 수 있으므로, 각각의 인스턴스마다 고유의 값을 가져야할 때 선언한다.
    • 하지만 반대로 인스턴스 변수, 인스턴스 메소드에서는 static이 붙은 멤버들을 사용가능하다.
  1. 메소드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것이 좋을 수도 있다.
    • 메소드 호출시간이 짧아지기 때문에 좋다.

Final

Java에서 final은 변수, 메소드, 클래스에 사용할 수 있다. final은 단 한 번만 할메모리가 할당 될 수 있다는 뜻이다. 그래서 final == 상수는 옳지 않다.

변수에 final

해당 변수는 생성자나 대입연산자를 통해 한 번만 초기화가 가능하다는 것을 의미한다.

메소드에 final

상속 시 해당 메소드를 재정의(override) 할 수 없다.

클래스에 final

해당 클래스를 상속할 수 없다. String 클래스 처럼 상속 계층 구조에서 마지막 클래스가 된다.
유지보수 차원에서 좋다.

Static final

static final사용해 상수를 만들면 클래스에 존재하는 단 하나의 상수라는 뜻이다.

final !== 상수, static final == 상수이다.

Java Compiler가 compile시에 static을 보면 해당 변수, 메소드, 클래스에 대해서 초기화를 강제한다. Application 런타임 동안 바뀌지 않을 변수에 대해 초기화를 강제하는 것이다. 여기에 final까지 붙이면 Application 런타임 동안 맨 처음 초기화된 값이 바뀌지 않는걸 보장한다.

그래서 상수다.

정적 팩토리 메소드(Static factory method)

이것을 사용할 때는 생성자를 막아놔야 한다. 기본 생성자를 private으로 선언한다.
왜냐하면 사용자에게 정적 팩토리 메소드로 인스턴스를 생성할 수 밖에 없게끔 강제하고 싶기 때문이다.

이 정적 팩토리 메소드는 디자인 패턴의 팩토리 메소드와는 다른 것이다.
정적 팩토리 메소드는 생성자에 대한 내용이고, 디자인 패턴의 팩토리 메소드는 클래스에 대한 내용이다.

profile
개발공부하는사람

0개의 댓글