static, final

무삭이의 개발일지·2023년 4월 5일
0

static이란?

🧐static은 '정적인', '고정적인' 이라는 뜻을 가지고 있다. 왜 이런 뜻을 가진 static을 붙이는지 한 번 알아보자!

  • static 키워드는 클래스 멤버를 선언할 때 사용된다. 클래스 멤버에는 static 변수와, static 메서드가 있다.

  • 클래스가 생성될 때 static이 붙은 멤버와 메서드가 생성 되는줄 알았으나, 이 때 생성이 되는 것이 아니라, 클래스 로딩 시점에 생성된다. 즉, 로딩하면서 static 변수와 메서드가 메모리에 할당된다.

  • static 변수는 클래스 변수라고 부른다. 그리고 모든 인스턴스에서 공유가 되며, 인스턴스가 생성될 때마다 새로운 값을 할당 받는 인스턴스 변수와는 달리, 클래스 변수는 클래스가 로딩될 때 한 번만 초기화가 된다.

  • static 메서드는 인스턴스를 생성하지 않고도 클래스 이름으로 바로 호출할 수 있다. 인스턴스 변수나 메서드를 참조할 수 없고, 오직 static 멤버와 메서드만 참조할 수 있다.

  • static 메서드는 클래스 메서드라고 부르는데, 클래스 메서드는 인스턴스에 속하지 않아, this 키워드를 사용할 수 없다.

  • static 메서드는 인스턴스를 생성하지 않고 클래스 이름으로 바로 접근할 수 있기 때문에, 유틸리티 클래스나 상수를 정의할 때 사용 된다.

⚔️여기서 유틸리티 클래스 는 다른 클래스들에게 공통적으로 사용되는 기능을 제공하거나, 특정 기능을 수행하는 유틸리티 메서드를 제공한다. java.util 패키지는 많은 유틸리티 클래스들을 가지고 있다. 날짜를 다루는 클래스인 Date나 Math 클래스 등이 있다. 이러한 클래스들은 상태를 가지지 않고, 모든 메서드가 정적(static)메서드로 구성되어 있어 객체를 생성하지 않고 바로 사용할 수 있다.

🍄static 메서드는 왜 인스턴스 멤버를 사용할 수 없으며, 인스턴스 메서드는 왜 인스턴스 멤버와 클래스 멤버 모두를 사용 가능할까?

클래스로더가 클래스를 로딩하면 이 때 클래스, 메서드, 패키지, import문 등 클래스의 모든 멤버들이 meta space 영역에 메모리를 적재한다. 그리고 나서 바이트 코드 검증을 거쳐 실행을 하게 되고, 이 때, stack영역과 heap영역에 메모리가 적재된다. stack 영역에는 지역 변수가 있고, heap 영역에는 인스턴스 멤버가 들어가게 된다.

따라서, 인스턴스 메서드가 클래스 멤버를 사용할 때는 이미 메타 스페이스 영역에 적재된 클래스 멤버를 가져와서 사용할 수 있지만, 메타 스페이스에 있는 클래스 메서드가 인스턴스 멤버를 사용하면 아직 heap 영역에 인스턴스 멤버가 적재 되지 않아 사용이 불가하다. 이 경우, 클래스 메서드에서 인스턴스 멤버를 사용하기 위해서는 인스턴스를 생성하고 이를 이용하여 사용해야 한다. 이 때 만들어진 인스턴스는 heap 영역에 적재된다.

final

🧐final '마지막의', '최종적인' 뜻을 가지고 있다. 그래서 그런지 프로그래밍에서도 뜻에 맞게 잘 사용 되는 거 같다. 닉값을 한다는 소리 :)

  • final 클래스 : 클래스에 final 키워드를 사용하면, 클래스를 상속할 수 없게 한다. 즉, 해당 final 클래스는 최종 구현 상태를 의미한다.
    ex) public final class FinalClass{}

  • final 메서드 : 메서드에 final 키워드를 사용하면, 해당 메서드는 하위 클래스에서 오버라이딩할 수 없게 된다. 즉, 해당 메서드의 구현을 변경할 수 없다.
    ex) public final void checkHeight(){
    System.out.println("안알려줌");

    }

  • final 변수 : 변수에 final 키워드를 사용하면, 해당 변수는 값을 변경할 수 없는 상수가 된다. 보통 상수화된 변수는 일반적으로 대문자로 표기하고, 한 번 값이 할당되면 변경할 수 없다.
    ex) static final int HEIGHT = 177;

🎯'final' 키워드는 자바에서 중요한 개념중 하나이다. final 키워드는 값, 메서드, 클래스에 대한 수정을 제한 하는 역할을 하기 때문에, final 키워드를 사용하여 불변성(Immutability)과 안정성(Safety)을 보장할 수 있다. 불변성과 안정성은 코드의 버그를 줄이고, 코드의 유지보수를 높여준다. 따라서 final 키워드의 사용은 좋은 소프트웨어 개발의 핵심 원칙 중 하나인 "불변성을 유지하라"를 지키기 위한 중요한 수단 중 하나이다.

profile
No. Try not. Do or Do not. There is no try.

0개의 댓글