백기선님 자바 기초 스터디 6주차 과제 질문을 참조하여 포스트를 작성하였습니다.
이번 포스트에서는 자바의 상속 - final 키워드에 대해 알아보겠습니다.
자바에서 final
키워드는 다양한 컨텍스트에서 사용될 수 있습니다. final
은 변수, 메서드, 클래스에서만 적용될 수 있는 비접근 제어자(Non-access modifiers) 입니다.
비접근 제어자란 접근 제어자가 아닌 제어자입니다. 접근 제어자는 public, protected, default, private처럼 접근을 제어하는 역할을 하는 제어자를 말합니다. 비접근제어자에는 static, final, abstract, transient, volatile, synchronized, native가 있습니다.
final
키워드는 사용되는 곳에 따라 다른 컨텍스트로 사용될 수 있습니다.
final
변수변수가 final
변수로 선언되면, 해당 변수는 수정될 수 없어 상수로 사용됩니다. 수정될 수 없다는 말은, final
변수는 반드시 초기화 되어야한다는 것입니다. 만약 final
변수가 참조 변수라면, 이는 변수를 다시 바인딩하여 다른 객체를 참조할 수는 없다는 것을 의미합니다.
final
변수는 구분을 위해 모두 대문자로 표시하고, 단어를 분리할 때는 밑줄을 사용하는 것이 관례입니다.
// Final variable PI
final double PI = 3.141592653589793;
final
변수를 초기화하지 않으면, 컴파일러는 컴파일 에러를 반환합니다. final
변수를 초기화하는 방법에는 3가지 방법이 있습니다.
선언과 동시에 초기화하는 방법으로, 가장 흔히 사용되는 방법입니다. 만약 선언 시에 초기화하지 않는다면 아래 두 방법으로 초기화할 수 있습니다.
빈 final
변수는 instance-initilizer 블럭이나 생성자 내부에서 초기화될 수 있습니다. 만약 클래스에 생성자가 하나 이상 있을 경우, 모든 생성자에서 초기화가 되지 않으면 컴파일 에러가 발생합니다.
static block에서 초기화될 수 있습니다.
코드 예시 :
// Java Program to demonstrate Different
// Ways of Initializing a final Variable
// Main class
class GFG {
// a final variable
// direct initialize
final int THRESHOLD = 5;
// a blank final variable
final int CAPACITY;
// another blank final variable
final int MINIMUM;
// a final static variable PI
// direct initialize
static final double PI = 3.141592653589793;
// a blank final static variable
static final double EULERCONSTANT;
// instance initializer block for
// initializing CAPACITY
{
CAPACITY = 25;
}
// static initializer block for
// initializing EULERCONSTANT
static{
EULERCONSTANT = 2.3;
}
// constructor for initializing MINIMUM
// Note that if there are more than one
// constructor, you must initialize MINIMUM
// in them also
public GFG()
{
MINIMUM = -1;
}
}
일반 변수와 final
변수의 유일한 차이점은 값의 재할당 가능 여부입니다. 따라서 final
변수는 프로그램을 실행하는 동안 일정하게 유지하고자 하는 값에 대해서만 사용해야 합니다.
final
메서드메서드를 final
키워드로 선언하면, 해당 메서드는 오버라이딩 될 수 없게 됩니다.
서브 클래스 전체에서 동일한 구현을 따라야 하는 메서드일 경우, final
키워드를 사용하여 선언해야 합니다.
class A
{
final void m1()
{
System.out.println("This is a final method.");
}
}
class B extends A
{
void m1()
{
// Compile-error! We can not override
System.out.println("Illegal!");
}
}
final
클래스클래스를 final
키워드로 선언하면, 해당 클래스는 상속될 수 없습니다.
final
클래스는 두 가지 용도로 사용됩니다.
final class A
{
// methods and fields
}
// The following class is illegal
class B extends A
{
// COMPILE-ERROR! Can't subclass A
}
final
키워드를 사용할 때, Static
키워드와 종종 함께 사용되는 모습을 볼 수 있습니다. static
키워드는 무엇인지 살펴보겠습니다.
static
변수는 인스턴스가 생성되기 이전에, JVM의 메모리 공간 중 데이터 영역에 저장됩니다. JVM에 의해 클래스가 메모리 공간에 할당되는 순간 초기화까지 완료되는 것입니다.
인스턴스 생성 이전에 바로 메모리 상에 올라가 있기 때문에, 인스턴스를 생성하지 않아도 바로 static
멤버로 접근이 가능합니다.
static
키워드를 사용하면 클래스의 모든 인스턴스에서 같은 값을 가지기 때문에 상수 변수나 메서드에 주로 사용됩니다.
주로 주어진 클래스의 동일한 변수나 메서드를 공유할 때 메모리 관리 차원에서 사용하는 키워드입니다. 그리고 이 때 변수나 메서드가 변하지 않는다면 final
키워드와 함께 사용되는 것입니다.
static
키워드는 블럭, 변수, 메서드, 클래스에서 사용할 수 있습니다.