반응형

final 키워드

작성 계기

근래에 안드로이드 개발을 단기로 하게 되면서 전세계에서는 많이 사용하지만, 내 입장에서는 실무 개발을 해본적이 없는 JAVA로 개발을 해야 했기 때문에 기초적이지만, 기록으로 남긴다.

final의 기본 개념

final 변수

  • 한번만 초기화가 가능함.
    C/C++ 에서는 const 키워드와 성격이 거의 비슷하나 사용 방식은 차이가 있음.

    final 메서드

  • 해당 메서드를 Overide를 하거나 숨길 수 없음.
    아직 JAVA 경험이 많이 없어서 일 수 있으나, 실제로 사용된 코드를 본적은 없음

    final 클래스

  • 더 이상 상속이 불가능함.
    대표적인 사례로 java.lang.System, java.lang.String 등 있다(C++의 경우 String을 상속받아서 확장해서 사용하는 경우가 많음.)

final을 써야 하는 예시

magic number(상수)

어떤 소프트웨어를 개발을 해도 쉽게 직면하는 고민이다. 코드 유지보수와 높은 성능의 소프트웨어가 되기 위해서 magic number를 적절한 혹은 특정 namespzce 에 넣을 때 static과 함께 사용된다.

public class ConstVal {
    final static int powerCode = 0xFF;
    ...
}

익명 클래스

익명 클래스에서 변수를 참조할 때, 자신을 생성한 지역 클래스의 변수를 참조할 경우 사용. 이는 익명 클래스의 인스턴스가 살아 있으나 해당 인스턴스가 참조한 변수가 메모리상 없어지는 것을 방지하기 위해서 정해진 규칙이라 한다.

대부분은 지역 클래스라는 용어를 사용하다 보니 이해를 바로 못 하는 경우가 많은 듯 하다. 실제로 익명 클래스가 인스턴스를 만드는 시점은 지역 클래스의 메서드내에서 코드 실행중에 생성이 된다.

문제는 메서드내의 임시로 선언하고 사용한 변수들은 메서드 실행이 종료가 되면, 후에 GC에 의해서 메모리상에서 제거가 되는데, 이 때 메서드 내에서 생성된 익명 클래스의 인스턴스는 그대로 유지가 된다. 이 때 만약 이 인스턴스가 메모리에서 제거된 변수를 참조하면, 문제가 발생할 수 밖에 없다. 이 때 final 키워드를 사용하면, 해당 변수는 별도로 저장을 하기 때문에 제거가 되지는 않는다고 한다.(람다식에서도 유효한지는 차후 조사해서 추가를 해야 할 듯함.)

참조자료

반응형

+ Recent posts