JAVA - final, static, final static 키워드 상황별 정리
들어가기 앞서
처음 자바를 접했을 때 final 때문에 엄청 헷갈렸던 경험이 있다. final 키워드가 한 곳에만 사용할 수 있는게 아니고 변수, 메서드, 클래스 등에 사용이 가능했기 때문이다. 이번 기회를 통해 final 키워드에 모든 경우들을 정리하고 final과 같이 자주 쓰이는 static 키워드에 대해서도 같이 정리한다.
final
먼저 final 키워드에 정확한 의미는 오로지 한번 할당될 수 있음을 의미한다. 어디에 final 키워드를 붙이냐에 따라 의미가 달라지겠지만 근본적인 final로서의 의미는 변하지 않는다.
final != 상수
final 키워드는 프로그래밍 언어에서 constant, 상수와 같은 단어와 비교되어 사용된다. 하지만 위에서 final의 정의를 보았듯이 final == 상수는 잘못된 표현이다. final 변수를 통해 상수를 만들수 있지만 final을 붙인다고 무조건 상수인 것은 아니라는 뜻이다.
final 경우의 수
final키워드를 변수, 메서드, 클래스에 붙였을 때 그 의미가 무엇인지 정리한다.
final 변수 : 해당 변수가 생성자나 대입연산자를 통해 한번만 초기화 가능함을 의미한다. (여기에 static까지 붙이면 상수가 되는 것이다.)
final 메서드 : 상속 시 해당 메서드를 재정의 불가함
final 클래스 : 해당 클래스를 상속할 수 없음. 즉, 상속 계층 구조에서 마지막 클래스가 됨. (ex : String 클래스)
static
static 키워드는 프로그래밍 언어에서 정적, 전역의 의미로 사용이 된다. 자바에서 static을 붙이면 해당 데이터의 메모리 할당을 컴파일 시간에 할 것임을 의미한다. 이 말이 이해가 가지 않는다면 jvm에 메모리 구조를 공부하면 이해가 갈 것이다. static 데이터는 런타임 중에 동적으로 할당되는 데이터와는 다르게 프로그램 실행 직후 부터 끝날때까지 메모리 수명이 유지된다. 이러한 특징으로 아래와 같은 특징들을 가진다.
static 멤버 변수 : 클래스 변수라고도 부르며 모든 해당 클래스는 같은 메모리를 공유한다. 기존 멤버 변수와 같이 static 멤버 변수는 객체를 생성하지 않고 (인스턴스) 클래스명.변수명 으로 접근 가능하다.
class MyGrade{
public int kor = 100;
public int eng = 90;
public static int math = 80; //static 멤버 변수
}
class StaticTest{
public static void main(String[] args){
MyGrade grade = new MyGrade();
System.out.println(grade.kor);
System.out.println(grade.eng);
System.out.println(MyGrade.math); // 클래스에 바로 접근해서 사용가능
}
}
이렇게 사용이 가능한 것은 위에도 말했지만 static 키워드가 붙은 것들을 이미 객체가 생성되기 전에 static 메모리 영역에 할당이 되어 있기 때문이다.
static 메서드
static 메서드도 동일하게 객체의 생성 없이 호출이 가능하다. (하지만 지양함. 이유는 마지막에)
대표적인 예로 Math 클래스를 들 수 있다. 랜덤 값을 반환해주는 random() 함수를 호출할때 Math.random()으로 호출한다. Math 클래스에 대한 객체를 생성하지 않고 바로 사용한다. 이것이 바로 static이 붙어 있기 때문에 가능한 것이다.
모든 것을 static 으로?!
바로 위에서 static 사용을 지양한다고 한 이유를 설명하려 한다. static을 사용하면 객체 생성도 없이 사용할 수 있으니 모든 것을 static으로 선언하면 편한거 아닌가라고 한번쯤은 생각해볼 수 있다. 하지만 성능을 생각하면 지양하는 것이 맞다. static 영역의 데이터는 프로그램의 시작부터 종료가 될 때까지 메모리에 남아있기 때문에 무분별하게 많이 사용하다 보면 메모리가 부족할 우려가 있기 때문이다. 상황에 맞게 static 키워드를 이용하자.
static final
마지막으로 static final 을 정리한다. 위에 final과 static에 설명을 다 보았다면 이제 static final의 의미를 알 것이다.
static final을 상수를 만들때 사용하며 클래스에 존재하는 단 하나의 상수라는 뜻이다.
예를 들어 A라는 클래스에 static final 로 선언된 B라는 변수가 있다면 선언과 동시에 초기화된 값을 프로그램 종료시까지 가지고 있는 것이고 final 키워드만 사용한다면 객체 생성시마다 초기화를 통해 값을 다르게 할 수도 있다는 것이다.
그러니 상황에 맞게 키워드를 이용하여 프로그래밍하자.