본문으로 바로가기

[Java] final 이란?

category 프로그래밍/자바 2019. 1. 8. 02:53

final Modifier?

:final 이란 사전적 의미로 "최종적인" 뜻을 가진다.

:final 키워드는 변수,클래스,메소드에 사용될수 있다.


- final 제어자를 쓸수있는 위치에 따른 기능


1. 클래스

: final 클래스는 확장할수 없다. 즉, 하위클래스를 만들수 없다.

: 해당 클래스를 변경으로부터 보호하기 위해 사용

: final 클래스의 메소드는 오버라이딩 안됨


2. 메소드

: final 메소드는 오버라이드 할수없다.


 언제 왜 final 메소드를 사용하나? 오버라이딩 되지 않도록 하는 이유 -> Template Method Pattern에 답이있다.


3. 상수 -> static final

final => 절대 값을 바꿀수 없다.

static => 인스턴스를 생성하지 않아도 사용할수 있다.

: 상수의 변수명은 모두 대문자를 사용한다.

: 정정 초기화(static initialization,생성자) -> static {} static 블록을 사용한다.


4. 로컬변수 field -> final

한번값을 대입하면 바꿀수 없다. 

final로 지정한 변수는 변수 선언시 대입해야한다. ( 반드시 초기화 시켜줘야한다는 말)


 => final은 필드에 언제 사용하고 언제 사용하지 않을까?

 : 필드는 객체의 상태를 나타냄. 한번 만들어진 다음에 바뀌지 않는다는 것을 말하기 위해 final을 사용.

 : 변경될수 있는 필드가 아닌 모든 것은 모두 final로 두는것이 맞다.


   -장점)

   : 메모리 효율이 좋아지고 성능도 향상되며 코드도 보기 좋아진다.

 


Why 가능할까?


1)

final StringBuilder a = new StringBuilder();

a.append("hello");

a.append("world");


=> final을 붙이면 초기화는 한번밖에 안되는데 왜 가능할까?

: final은 레퍼런스를 바꾸지 못하게 하는것이다(상태의 변경만 가능)

: StringBuilder의 특성상 레퍼런스가 바뀌는것이 아니라 값만 바뀌는것이기 때문에 가능



2)

final String a = "hello";

a.concat("world");

=> 이건 무슨의미일까? 

=> concat 메소드는 기존의 문자열에 새로운 문자열을 합쳐서 새로운 메모리 공간에 할당하는것이다. 또한 새로운 공간에 메모리를 

     할당하고 그 주소값을 리턴하는것이다.

     만약 a = a.concat("world"); 였다면 error를 발생한다.

=> String 레퍼런스가 바뀌는것이 아니다.




'프로그래밍 > 자바' 카테고리의 다른 글

[Java] 해싱(Hashing)이란?  (0) 2019.01.08
[Java] Object 클래스란?  (0) 2019.01.08
Exception 처리방법  (0) 2019.01.06
[JAVA] 자바 class 파일 실행방법  (1) 2018.12.31
Java에서 interface란?  (0) 2018.12.21