[Java] static, final, static final

3Beom's 개발 블로그·2022년 11월 8일

본 글은 우아한 테크코스 프리코스 1주차 미션 중 공부한 내용을 기록한 것이다.
-> 우아한 테크코스 프리코스 1주차 미션 java-onboarding
-> 필자가 제출한 코드
-> 1주차 미션 회고


static, final, static final

< static >

  • static 키워드는 ''정적' 이라는 의미이며, 변수와 상수, 메소드에 적용된다.

  • 클래스 내에서 static 변수, 상수, 메소드를 선언할 경우, 클래스가 로드되는 시점에 Static 메모리에 공간이 할당된다.

  • 즉, 객체를 생성하기 전에 할당된다.

  • 이에 따라 '클래스 변수' 라고도 불린다.

    • 따라서 static 으로 선언된 변수, 상수, 메소드는 객체가 아닌 클래스를 통해 접근하는게 좋다.
    WordConverter wordConverter = new WordConverter();
    wordConverter.ASCII_LOWER_A; // X
    WordConverter.ASCII_LOWER_A; // O

(1) static 변수, 상수

  • Static 메모리의 공간을 활용하는 static 멤버 변수, 상수는 객체들이 공용으로 쓴다는 특징이 있다.
    • non-static 멤버 변수, 상수는 객체들이 각자의 값을 갖지만, static으로 선언되면 경우는 모든 객체가 공용으로 사용한다.
    • A 객체에서 static 변수 값을 변경하면, B 객체에서 이를 가져와도 변경된 값으로 가져와진다.

(2) static 메소드

  • 클래스가 로드되는 시점부터 활용할 수 있다. : 객체를 생성하지 않아도 호출할 수 있다.
  • 객체를 생성하지 않아도 호출될 수 있으므로, 메소드 내부에서 super, this 또는 non-static 멤버변수에 접근할 수 없다.
    • non-static은 객체가 생성되어야 공간이 할당되는데, static 메소드는 그렇지 않으므로 객체가 생성되었는지 안되었는지 알 수 없기 때문에
  • 따라서 static 메소드에서는 static 변수, 상수, 메소드에만 접근할 수 있다.
  • Math.sqrt(), Math.max() 등과 같은 Utils, Helper 클래스에 활용된다.
  • 특정 분류와 관련된 메소드들을 하나의 클래스 안에 모아둘 수 있는 효과가 있다.

< final >

  • final은 상수 정의, 메소드, 클래스에 사용될 수 있다.
  • 각각의 특징은 다음과 같다.

(1) 상수 정의

  • final 키워드를 통해 상수를 선언할 수 있다. (첫번째 정의 이후 수정할 수 없다.)
  • static 없이 final만 활용할 경우, 생성자에서 초기화를 해줌으로써 객체마다 서로 다른 상수 값을 가지게 할 수 있다.

(2) final 메소드

  • final로 선언된 메소드는 오버라이딩(재정의)을 못한다.
    (상수처럼 첫번째 정의 이후 수정이 불가하므로)
public final void testMethod() {}

(3) final 클래스

  • final로 선언된 클래스는 상속 받을 수 없다.
public final class TestClass() {}

< static final >

  • 상수 정의

    • static final로 상수를 정의할 경우, 모든 객체에서 동일한 상수 값을 갖게 된다.
    • static은 클래스 변수이며, final은 첫 정의 이후 수정할 수 없다.
    • 따라서 모든 객체들이 공유하고, 수정할 수 없는 진정한 상수가 되는 것.
    public static final int ASCII_LOWER_A = 97;
profile
경험과 기록으로 성장하기

0개의 댓글