final class Animal{
}
class Dog extends Animal{
//Dog는 final class인 Animal을 상속할 수 없다.
}
final
final 키워드는 보통 상수를 선언하기 위해 사용되자민 , 클래스 메서드 변수에 선언하면 조금씩 할 수있는 것들이 제안된다. 자바에서 final 키워드는 여러 컨텍스트에서 단 한 번만 할당될 수 있는 entity를 정의할 때 사용된다.
final 키워드는 3가지에 적용할 수 있다 .
1.final 변수 (원시 타입 , 객체 타입 , 클래스 필드 , 메서드 인자)
2.final 메서드
3.fianl 클래스
각각 어떻게 사용되는지 알아보자
1.fianl 변수
-원시 타입 변수
로컬 원시 타입 변수에 final을 선언하면 한번 초기화된 변수는 변경할 수 없는 상수 값이된다 .
public class FinalTest {
public static void main(String[] args) {
final int a = 1 ;
a = 3 ; //a는 상수로 선언되어 변경이 불가하다.
}
}
- Object 타입
오브젝트 타입 변수에 final을 선언하면 그 변수에 다른 참조 값을 지정할 수 없다 . 원시 타입과 동일하게 한번 쓰여진 변수는 재변경이 불가하지 , 객체 자체가 immutable 하다는 의미는 아니다 .
final Person p = new Person("UGO");
//다른 인스턴스를 대입할 수 없다 .
p = new Person("Hong");
//하지만 immutable 하다는 것은 아니기 떄문에 필드의 변경은 가능하다.
p.setName("Hong");
System.out.println(p.name);
//결과 Hong
-메서드의 인자
메서드 인자에 final 키워드를 붙이면, 메서드 안에서 변수값을 변경할 수 없다.
public void setName(final String name) {
name = "HONG"; //에러 발생
this.name = name;
}
-멤버 변수
클래스의 멤버 변수에 final로 선언하면 상수값이 되거나 write-once 필드로 한 번만 쓰이게 된다. final로 선언하면 초기화되는 시점은 생성자 메서드가 끝나기 전에 초기화가 된다. 하지만, static 이냐 아니냐에 따라서 아래와 같이 초기화 시점이 달라진다.
static final 멤버 변수(static final int x= 1)
-값과 함께 선언 시
-정적 초기화 블록에서
instance final 멤버 변수 (final int x = 1)
-값과 함께 선언시
-인스턴스 초기화 블럭에서
-생성자 메서드에서
class Person{
// static final 변수의 초기화
//1.스테틱 초기화시 초기화됨
static final String name;
static {name = "ugo";}
//2.스테틱 변수에 값을 직접 할당할 때
static final int age = 10;
//instance final 변수의 초기화
//1.값과 함께 선언 시
final String nameI = "ugo";
//2.인스턴스 초기화 시
final int ageI;
{ageI = 10;}
//3.생성자에서
public Person(int ageI) {
this.ageI = ageI;
}
}
*초기화 블럭 실행 특징
인스턴스 초기화 블럭
-객체를 생성할떄마다 블록이 실행
-부모 생성자 이후에 실행 됨
-생성자보다 먼저 실행 됨
정적 초기화 블럭
-클래스 로드시 한번만 블록이 실행 됨
2.final 메서드
메서드를 final로 선언하면 상속받은 클래스에서 오버라이드가 불가능하게 된다. 구현한 코드의 변경을 원하지 않을 때 사용한다. side-effect가 있으면 안 되는 자바 코어 라이브러리가 주로 final로 선언 되어 있다.
class Animal{
final void speak(){};
}
class Dog extends Animal{
//Dog 클래스는 speak 메서드를 overriding 할 수 없다.
}
3.final 클래스
클래스에 final을 선언하면 상속이 불가하다 . Util 형식의 클래스나 여러 상수 값을 모아둔 Constants 클래스를 주로 final로 선언한다.
'JAVA' 카테고리의 다른 글
JAVA 스터디 12 - 패키지 (0) | 2021.03.23 |
---|---|
JAVA 스터디 11 - Object 클래스 (0) | 2021.03.18 |
JAVA 스터디 9 - 추상 클래스와 추상메서드 (0) | 2021.03.18 |
JAVA 스터디 8 - 상속 (0) | 2021.03.18 |
JAVA 스터디 7 - 자료구조 LinkedList , Stack , Queue (0) | 2021.02.13 |