일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Checked Exception
- 이펙티브자바
- 이펙티브 자바
- spring-security
- 보안 그룹
- error
- 파라미터 그룹
- Effective Java
- 생각정리
- 피리티어
- 자바스터디
- 자바
- try-with-reources
- Final
- RDS
- exception
- java
- ec2
- 예외
- AWS
- Unchecked Exception
- bytecode
- Annotation
- 바이트코드
- JVM
- springboot
- https
- Spring
- Today
- Total
개발 일지
자바 스터디 2주 차 발표 준비 자료입니다.
https://github.com/WanOnPreStudy/JavaQuestionStudy
GitHub - WanOnPreStudy/JavaQuestionStudy: 백엔드 자바 질문 스터디
백엔드 자바 질문 스터디. Contribute to WanOnPreStudy/JavaQuestionStudy development by creating an account on GitHub.
github.com
간단하게 정리하고 들어가자면…
- final 키워드는 해당 선언이 최종 상태이고 수정할 수 없음을 의미합니다.
- 그렇기 때문에 변경하면 안 되는 것을 지정할 때 사용합니다.
- 클래스, 메서드, 변수 선언 시에 사용할 수 있습니다.
final 클래스
클래스에 final을 사용하면 그 클래스는 최종 상태가 되어 더 이상 상속이 불가능합니다.
아래 코드를 보면 상속 시 에러가 발생합니다.
final 메서드
메서드에 final을 사용하면 상속받은 클래스에서 final 메서드를 Override(재정의)할 수 없습니다.
아래 코드를 보면 Override시 에러가 발생합니다.
fianl 변수
변수에 final을 사용하면 이 변수는 수정될 수 없습니다. 수정될 수 없기 때문에 초기화 값은 필수적입니다.
초기화가 되지 않은 final 변수가 있다면 컴파일 에러가 발생합니다.
아래 코드처럼 final 변수의 값을 변경하려고 하면 에러가 발생합니다.
Final 참조형(reference type)
바로 위에서 변수에 final을 사용하면 수정될 수 없다고 했는데 여기서 조금만 더 들어가 보면, 수정할 수 없다는 범위는 그 변수의 값에 한정합니다. 다시 말해서 다른 객체를 참조할 때(참조 타입의 경우) 참조하는 객체의 내부의 값은 변경할 수 있다는 의미입니다.
참조 타입은, 객체(Object), 배열(Array), Integer/Long과 같은 Wrapper Class가 해당합니다.
이유는 자바 메모리 구조 때문인데
기본 자료형 지역변수는 데이터의 값이 Stack 영역에 저장되고 (int, double, byte, boolean 등)
참조형(Reference Type) 변수는 Heap 영역에 데이터가 저장되고 Stack영역에는 주소 값만 저장됩니다.
final 키워드를 변수에 사용하면 그 영역에만 변경할 수 없다는 영향을 미칩니다. 그렇기 때문에 주소 값(가리키는 객체)은 변경할 수 없지만 가리키고 있는 객체의 내부의 값은 final의 영향밖에 있기 때문에 변경이 가능합니다.
위 코드를 보면 가리키는 객체를 변경하지 못하지만, 객체 내부의 값은 변경할 수 있다는 사실을 알 수 있습니다.
왼쪽 (setAge()를 통해 내부 값을 변경 가능하지만, new Person()으로 값 재할당 불가능)
오른쪽 ( 배열 내부 원소의 값은 변경할 수 있지만, 다른 배열 객체로는 변경 불가)
정리
- final 키워드를 클래스에 사용하면 상속을 제한한다.
- 메서드에 사용하면 오버라이드를 제한한다.
- 변수에 사용할 경우 해당 값의 변경을 제한한다
- 함조형 변수에 사용할 경우 가리키는 객체는 바꿀 수 없지만, 객체 내부 값은 final 영향 밖이기 때문에 변경이 가능하다
Reference
'Java' 카테고리의 다른 글
[Java] try-with-resources (0) | 2022.11.16 |
---|---|
[Java] 바이트 코드(2) :: 바이트 코드 예제 (0) | 2022.11.13 |
[Java] 바이트 코드(1) :: 바이트 코드란? (1) | 2022.11.10 |
[Java] Checked Exception, Unchecked Exception, Error (0) | 2022.11.07 |
[Java] 변수의 세가지 타입 (클래스 변수, 인스턴스 변수, 지역 변수) (0) | 2022.11.03 |