헷헤.. Swift만 하다가 JAVA를 처음 해봤는데요.. 일부 비슷한 부분이 있어서 신기하기도 하고 재밌기도 하네여. 이번엔 final, static, 그리고 static final 키워드에 대해서 알아보겠습니당.
final은 말 그대로 최종을 의미하며, 무언가를 제한한다는 의미를 갖게 됩니다. final 키워드는 변수, 메서드, 클래스에 사용될 수 있는데, 이는 어디에 사용되느냐에 따라서 모두 다른 의미를 갖게 됩니다.
변수에 final을 붙이게 된다면 이 변수는 다시 수정할 수 없다는 의미를 갖게 됩니다. 수정이 불가능하기 때문에 초기값이 꼭 필요하지만, 객체 안의 변수라면 생성자, static 블럭을 통한 초기화까지는 허용됩니다.
수정 시도를 하게 된다면 컴파일 에러가 나게 되겠죠?
final String name = "chaentopia";
name = "챈토피아"; // 컴파일 에러
메서드에 final을 붙이게 되면 override를 제한하게 됩니다. 클래스를 상속하게 되면 메서드를 상속해서 재정의 할 수 있는데, 이때 final이 붙은 메서드는 override가 불가능하게 됩니다.
class Person {
private final String name;
public Person(String name) {
this.name = name;
this.age = age;
}
public void talk() {
System.out.println("저는 " + name + "입니다.");
}
}
class Student extends Person [
public Student(String name) {
super(name);
}
@Override
public void talk() {
System.out.println("저는 " + name + "이고, 학생입니다");
}
}
이렇게 override 할 수 있는 클래스에서
class Person {
private final String name;
public Person(String name) {
this.name = name;
this.age = age;
}
final public void talk() { // final 추가
System.out.println("저는 " + name + "입니다.");
}
}
class Student extends Person [
public Student(String name) {
super(name);
}
@Override
public void talk() { // 컴파일 에러
System.out.println("저는 " + name + "이고, 학생입니다");
}
}
메서드에 final을 붙인다면 컴파일 에러가 날 수 있다.
final 키워드를 클래스에 붙이면 상속 불가능한 클래스가 됩니다. 다른 클래스를 상속해서 재정의 할 수 없다는 뜻이 됩니다.
final class Chat { // final 추가
final String greeting;
Chat() {
greeting = "안녕하세요";
}
}
class Korean extends Chat() { // 컴파일 에러
}
이렇게 final 키워드를 클래스 앞에 붙이게 된다면 이를 상속 받지 못하게 됩니다.
그렇다면 static은 무엇일까요? static도 말 그대로 동적이 아닌 정적이라는 의미이며, 이 키워드를 사용해서 static 변수와 static 메서드를 만들 수 있습니다. 이 키워드를 사용한 변수나 메서드는 어떤 객체에 소속되는 것이 아니라, 클래스에 고정되어 있는 변수나 메서드임을 의미합니다.
static은 메모리에 고정적으로 할당이 되며, 객체 생성 없이 사용할 수 있습니다.
static int count = 1;
public static void talk() { }
이렇게 앞에 static을 붙여서 사용하게 되며, 이를 판단하는 기준은 해당 변수를 공용으로 사용하는지 아닌지로 나뉘게 됩니다.
class Test {
public void start() {
System.out.println("시작합니다.")
}
public static void end() {
System.out.println("끝납니다.")
}
}
public class Main {
public static void main(String[] args) {
Test.start(); // 안됨
Test.end(); // 됨
Test test = new Test();
test.start(); // 됨
test.end(); // 안됨
}
}
static 유무의 차이를 아시겠나요?
static이 붙은 키워드는 클래스가 메모리에 올라갈 때 정적 메서드가 자동적으로 생성하기 떄문에 인스턴스를 생성하지 않고도 클래스만으로도 메서드를 호출할 수 있습니다.
-> 대표적인 유틸리티 클래스로는 java.lang.Math가 있다고 합니다.
Math.max()
Math.min()
그렇다면 앞서 말한 static과 final을 합친 static final은 무엇을 의미할까요? 직역하면 정적인 최종.. 이 되겠는데요, 이는 상수를 선언하고자 할 때 사용하는 키워드입니다. 상수는 변수와 달리 변하지 않는 값을 의미하며, 이 static final이 붙으면 모든 영역에서 고정된 값으로 사용하게 되는 상수입니다.
static final double PI = 3.141592;
이렇게 함께 선언하게 된다면 3.141592라는 불변의 값을 갖게 됩니다.
즉, 정리하자면
keyword | 설명 |
---|---|
final | 값이 한 번 정해지면 바꿀 수 없음 |
static | 정적, 고정된 의미를 갖고 있음 |
static final | 모든 영역에서 고정된 값으로 사용하는 상수 |