본문 바로가기

시즌1/Java Tips

Java! 이해하고 개발하자. ① final 에 대한 이해

거의 모든 프로그래밍 언어는 영어권에서 정의가 되었습니다.
자바도 마찬가지로 썬 마이크로시스템즈의 제임스 고슬링의 주도하에 정의가 된 언어입니다.
그렇기 때문에 당연하게도 언어 자체가 영어로 정의 되어 있습니다.

어렸을 적(국민학교 4학년 쯤으로 기억을 합니다.), 그 당시 컴퓨터 학원에서는 애플 컴퓨터로 베이직을 가르치곤 했습니다.
당시는 영어 교육에 대한 바람도 불지 않았고, 대다수의 국민학생이 영어라곤 알파벳만 읽을 수 있는 수준이었습니다.
당연하게도 영어로 정의된 베이직을 외워서 썼습니다.
대표적으로 GOTO 문장.....읽을 때도 "고투"로 읽지 않고 "지오티오"라고 읽었었습니다. "지오티오"를 쓰면 어디로 가더라를 디립다 외웠습니다.
참 아련한 추억입니다.

나이가 들어, 영어를 어느 정도 하는 지금...주로 자바를 사용하고 있습니다.
근데, 곰곰히 생각해 보니, 국민학교 시절 하던 "외움의 미학"을 아직도 사용하고 있더군요.
자바에서 "final" 이라는 예약어는 특정 method가 더 이상 overiding이 되지 않아야 할 때 쓴다. 라고 외우고 있더군요.
왜 저는 final 이라는 단어의 의미를 이해한 뒤 자연스럽게 아~ 그래서 이렇게 쓰이는구나 하는 고차원적인 언어 이해를 하지 못하는 걸가요?
아마도 그렇게 배우면서 컸기 때문이 아닐런지...

   final 이 무슨 뜻이지?  

final이 무슨 뜻이지?
final하면 저는 Final Fantasy 10 이 떠오릅니다. PS2로 발매된 유명 RPG 게임이죠. 개인적으로 진짜 더 이상의 판타지 RPG 게임은 없다 싶을 정도로 심취했던 게임입니다.

그럼, final이란 단어의 의미는 무엇일까죠? 요즘은 초등학생들도 영어를 하는 세상이니, 모르실 분이 없으실 것입니다.

네이버 영어 사전에서 final의 사전적 의미는 다음과 같습니다.

 

많은 뜻이 있습니다. 당연한 말씀. 영어와 국어는 틀리기 때문에 대부분의 단어가 일치하는 번역이 있기가 힘이 듭니다. 당연히, 비슷한 국어를 늘어 놓앗으니, 많습니다.

그럼, 이 중에 우리가 주목해야 하는 의미는? 바로, "최종적인" 입니다. 그렇습니다. 우리가 자바에서 쓰고 있는 final이라는 keyword는 최종적인이라는 의미와 가장 맞아 떨어집니다.

그럼, 그 용법을 살표 보겠습니다.



   final 변수(Variable)  

자바 프로그래밍을 하다 보면 흔히, 상수를 정의하고자 할 때 final을 많이 씁니다.
다음고 같이 말입니다.

 public static final int MAX_VALUE = 12345;

왜 우리는 이렇게 쓸까요? 저는 어려서(?) 부터 저렇게 써 왔기 때문에 쭉 써왔습니다. 왜 저렇게 써야 하는지를 생각해 본적이 없습니다..

그렇다면, final은 상수를 정의하기 위한 keyword 인가? 당연히 아니죠.

위에서도 보았듯이 final의 의미는 최종적인 부터 시작해 많은 뜻이 있습니다. 이 의미를 번수에 적용을 해 보면, 최종적인 변수(?)가 됩니다. 이상하죠...변수의 뜻은 변하는 수입니다. 그렇다면, 최종적으로 변한 수....결국 더 이상의 변화가 없는 수에 해당합니다.

그렇습니다. 더 이상의 변화가 없어야 하는 변수를 지칭하기 위해서 final이라는 keyword를 사용하는 것입니다.

그렇다면, 위 상수 정의가 이해가 갑니다. 더 이상의 변화가 없는 수가 바로 상수입니다.

우리는 흔히들 경험적으로, 상수를 정의할 때는 final static을 씁니다.

하지만 이해를 하고 보면, "상수는 값의 변화가 없어야 하기 때문에, 상수로 사용할 변수 앞에는 final을 붙인다"가 맞습니다.

다른 용법을 보시면,

 public class Test {
    public void method(final int a, int b){
        // 정상
       b = a;
       // 컴파일 에러
       a = b;
   }
}

이제는 척하면 척이죠? 변수 a는 method 내에서 값의 변화가 없어야 하기 때문에, 개발자가 의도적으로 그리고, 명시적으로 final로 선언을 하였습니다.

"흠...method에 전달되는 parameter a는 내부 로직상 변경이 되면 안되는 변수이니 final로 선언해야 겠네..."

라고 생각하는 개발자가 착한 개발자입니다.

그럼, final로 선언된 변수에 값을 변경해 버리면 어떻게 될까요? Java에서는 final 로 선언된 변수는 초기화가 된 후, 값이 바뀌면 안된다고 명시를 하였기 때문에 컴파일 에러가 발생하게 됩니다.

Test.java:7: cannot assign a value to final variable a
                a = b;
                ^

이제 final 변수에 대한 이해가 좀 되셨습니까?

참고로, 이 글은 초보 개발자를 위해 Java라는 언어에 대한 이해를 돕기 위해 작성된 글입니다.
여러 고수 분들의 딴지 부탁 드립니다.

=====
final method와 final class는 Coming Soon....