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 |