일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 자바의 정석 기초편 ch12
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch4
- 자바 고급2편 - io
- 데이터 접근 기술
- @Aspect
- 자바의 정석 기초편 ch5
- 2024 정보처리기사 시나공 필기
- 2024 정보처리기사 수제비 실기
- 자바의 정석 기초편 ch7
- 스프링 mvc2 - 검증
- 자바의 정석 기초편 ch1
- 자바 중급2편 - 컬렉션 프레임워크
- 람다
- 자바로 계산기 만들기
- 자바의 정석 기초편 ch2
- 스프링 고급 - 스프링 aop
- 스프링 mvc1 - 스프링 mvc
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch9
- 자바의 정석 기초편 ch14
- 자바 고급2편 - 네트워크 프로그램
- 스프링 트랜잭션
- 스프링 입문(무료)
- 자바로 키오스크 만들기
- 스프링 mvc2 - 타임리프
- 자바의 정석 기초편 ch6
- 자바 기초
- 자바의 정석 기초편 ch11
- 자바 중급1편 - 날짜와 시간
- Today
- Total
개발공부기록
Java Final 키워드에 대해서 설명, 각각의 쓰임에 따라 어떻게 동작하는가?(Class, Method, Variable) 본문
Java Final 키워드에 대해서 설명, 각각의 쓰임에 따라 어떻게 동작하는가?(Class, Method, Variable)
소소한나구리 2025. 3. 4. 16:21Java의 final 키워드란?
자바의 final 키워드는 이름 그대로 끝이라는 뜻처럼 final 키워드가 적용된 대상의 변경을 금지하여 코드의 가독성과 안전성, 유지보수성을 향상시키는 데 도움을 주는 키워드이다.
final 키워드는 클래스, 메서드, 변수에 사용할 수 있다
Class에 사용되는 final
final 키워드가 선언된 클래스는 확장할 수 없으므로 다른 클래스가 final로 선언된 클래스를 상속받을 수 없다
상속 하려고하면 IDE에서 컴파일 오류가 발생하는 것을 확인할 수 있다
컴파일 오류를 무시하고 상속하고 실행해보면 Finalclass가 final이라서 상속할 수 없다는 문구와 함께 실행이 되지 않는다
Method에 사용되는 final
final로 선언된 메서드는 오버라이드 될 수 없으므로 상속받은 서브 클래스에서 final 키워드가 붙은 메서드를 변경할 수 없다
final 키워드가 붙어있는 finalMethod()와 final 키워드가 없는 notFinalMethod()를 가진 Parent 클래스를 BasicClass가 상속받은 다음애 상속받은 메서드를 재정의하려고하면 final 키워드가 붙은 finalMethod()는 컴파일 오류가 발생하는 것을 확인할 수 있다
마찬가지로 컴파일 오류를 무시하고 실행해보면 Parent 클래스의 finalMethod() 메서드는 final이기 때문에 재정의 할 수 없다는 문구와 함께 실행이 되지 않는다
Variable에 사용되는 final(지역 변수, 멤버 변수)
지역변수(매개변수도 지역변수)
지역변수에 final 키워드를 설정할 경우 최초 한번만 값을 할당할 수 있으며 이후에 변수의 값을 변경하면 컴파일 오류가 발생한다
매개변수도 지역변수의 종류이므로 매개변수에 final이 붙으면 메서드 내부에서 값을 변경할 수 없어 메서드 호출시점에 사용된 값이 끝까지 사용되야 한다
메서드 블록 안에 final 키워드가 붙은 c 지역변수에 값을 최초 할당한 후 값을 수정하려고 하면 컴파일 오류가 발생한다
메서드의 매개변수인 a에 final 키워드가 붙어있을 때 메서드 내부에서 변수 a의 값을 수정하려고하면 마찬가지로 컴파일 오류가 발생하는 것을 확인할 수 있다.
멤버 변수
멤버 변수도 지역변수와 마찬가지로 한 번 값이 할당되면 값을 변경할 수 없다
값이 할당된 final 멤버 변수를 다른 곳에서 값을 변경하려고하면 오류가 발생하는 것을 확인할 수 있다
멤버 변수의 경우에는 생성자를 통해서 값을 할당해주는 경우가 많은데, 그런 경우에도 딱 한번만 할당이 가능하며 final 키워드가 붙은 멤버 변수의 값을 변경하기 위해 메서드를 만들려고하면 컴파일 오류가 발생하는 것을 확인할 수 있다
컴파일 오류를 무시하고 실행해보면 final 변수인 name의 값을 할당할 수 없다는 문구와 함께 실행되지 않는다
참조형 변수와 기본형 변수의 final
final을 기본형 변수에 사용하면 할당된 값을 변경할 수 없고 참조형 변수에 사용하면 참조변수가 참조하는 참조값(메모리 주소값)을 변경할 수 없다.
final 키워드로 생성한 User 타입 참조형 변수인 user에 새로운 new User() 객체를 생성하여 참조값을 할당하려고하면 컴파일 오류가 발생하는 것을 확인할 수 있다.
그러나 여기서 주의해야 할 점이 있는데, 여기서 작성한 User 클래스의 내부의 값은 final이 아니기 때문에 참조형 변수인 user에 새로운 참조값(메모리 주소값)을 할당할 수 없을 뿐이지, User 클래스 내부의 변수의 값은 변경할 수 있게 된다
즉 클래스의 내부의 값도 변경하지 않게 하려면 클래스 내부의 필드(멤버 변수)도 final 키워드를 작성해야 한다.
+ Effectively final keyword - 사실상 final
- Java8에서 추가된 기능으로 지역 변수에 final 키워드를 사용하지는 않았지만 값을 변경하지 않은 지역 변수는 상수와 동일하게 취급한다는 뜻이다
- 이에 대한 상세한 내용은 지역 변수 캡처에 대해 깊게 다루어야 하므로 https://nagul2.tistory.com/410 글을 참고 하면 된다
'이론 직접 정리 > 자바' 카테고리의 다른 글
자바의 예외, RuntimeException, CheckedException, UncheckedException의 차이점, RuntimeException이 필수 처리 예외가 아닌 이유, 예외 처리 방안 (0) | 2025.03.24 |
---|---|
Shallow Copy와 Deep Copy의 차이?, 자바에서 Deep Copy를 하기 위해서는 무엇을 사용해야 할까? (0) | 2025.03.13 |
Java는 Call By Value? Call By Reference? (0) | 2025.03.13 |
Managed - Unmanaged 언어의 차이는 무엇이고 어떤 장, 단점이 있는가 (0) | 2025.03.13 |
불변 객체는 무엇이며 Java에서 어떻게 구현하는가, String 클래스가 불변인 이유 (0) | 2025.03.05 |