티스토리 뷰
반응형
final
final의 효과
클래스나 메소드 혹은 변수에 final 제어자가 붙을 수가 있는데 각각 다음과 같은 제한이 생긴다.
- final 클래스
- 다른 클래스에서 상속을 하지 못 한다.
- 클래스가 final일 시 해당 클래스의 내부 메소드도 final로 선언되나, 변수의 경우는 final 개념을 갖지 않는다.
- final 메소드
- 상속 받은 클래스에서 오버라이딩을 못한다.
- final 변수(인스턴스 변수 == 전역 변수)
- 선언과 동시에 초기화하거나 생성자 내에서 값을 지정할 수 있다. 이 또한 그 이후에는 수정이 불가하다.
- final 변수(지역 변수)
- 선언과 동시에 초기화하거나 메소드를 실행 시 값을 지정할 수 있다. 단, 그 이후에는 수정이 불가하다.
- static final 변수(클래스 변수)
- 선언과 동시에 값을 지정하여야하며 그 이후에는 수정이 불가하다.
소스를 통해 예를 살펴보자
//1. final 클래스
final class Book {
//2. 클래스 변수
private static final String title = "Harry Potter";
//3. 인스턴스 변수
private final String subTitle = "philosophers stone";
private final String author;
//6. final 변수가 아님
static int notFinal = 20; //변경 가능
//7. final method
void finalMethod() {} //재정의 불가
//3-1
public Book() {
author = "harry";
}
//4. final 메소드
public final void func() {
//5. 지역 변수
final int page = 200;
final int price;
price = 1000;
//이제 이 이후에는 price 수정이 불가하다.
}
}
- Book 클래스는 final 클래스이므로 상속 받아서 파생 클래스를 만들지 못한다.
- 클래스 변수는 반드시 선언 시 초기화를 해주어야 하며 다른 곳에서는 초기화를 하지 못한다.
- 클래스 변수와 다르게 인스턴스 변수는 선언 시 초기화를 해주거나,
- 생성자를 통해 값을 지정해줄 수 있다.
- 해당 메소드는 final 메소드이므로 상속 받는 클래스에서 오버라이딩을 하지 못한다. (이 자체는 final 클래스와 별개로 예제로 보여주기 위한 것이니 신경 쓰지 않아도 된다.)
- final 지역 변수는 일반 변수와 같이 생명 scope이 동일하지만, 한번 초기화되면 그 이후 값을 변경할 수 없다.
- final 클래스 내에 일반 변수는 final 특징을 갖지 않는다.
- final 클래스 내에 일반 메소드는 해당 클래스가 상속을 받지 못하므로 자동으로 final 특징을 갖는다.
C++ const와 Java final 차이
- const는 선언 시 값을 지정해야한다.
- finals은 선언 시 값을 지정하거나, 나중에 생성자 혹은 setter로 지정 가능하다.
final 객체의 일반변수는 final 변수가 아니다!
public class MyFinal {
int notFinal = 10;
public static void main(String args[]) {
final MyFinal t1 = new MyFinal();
MyFinal t2 = new MyFinal();
//t1 = t2; //1. t1은 final Class이므로 컴파일 에러 발생
System.out.println(t1.notFinal);
t1.notFinal = 20; //2. final 변수가 아니므로 변경이 가능
System.out.println(t1.notFinal);
}
}
반응형
'Java > Java 기초' 카테고리의 다른 글
[Java 기초] 데몬 스레드 (0) | 2020.02.21 |
---|---|
[Java 기초] static (0) | 2020.02.16 |
[Java 기초] public static void main(String [] args) (0) | 2020.02.15 |
[Java 기초] Immutable (0) | 2020.02.15 |
[Java 기초] Exception (0) | 2020.02.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 팩토리 메소드 패턴
- @Lazy
- springboot
- 점층적 생성 패턴
- java
- 김영한
- 연관관계
- 빌더 패턴
- 스프링부트
- flatMap
- try catch finally
- JPA
- java8
- 생성자
- 인프런
- try with resources
- Spring
- ifPresent
- 이펙티브자바
- mustache
- jdk버전
- Effective Java
- 정적팩터리메서드
- junit
- effectivejava
- 자바8
- 복사 팩토리
- package-private
- 이펙티브 자바
- 빈 순환 참조
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함