본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JAVA

JAVA 스터디 10 - final

반응형
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로 선언한다.

 

 

반응형