본문 바로가기

Java

11-1장 final 제어자

- final 제어자는 필드, 지역변수, 메서드, 클래스 앞에 위치 가능

 

1. final 변수 

 

 - final 제어자는 변수를 선언할 때만 지정가능 

 - 한 번 대입된 값을 수정할 수 없음

 

 -final 필드 

class A1 {
	//선언과 동시에 값을 대입할 때
    int a =3;
    final int b =5;
    A1() {
    }
}

class A2 {
	//선언과 값의 대입을 분리했을 때 
    int a;
    final int b;
    A2() {
    	a=3;
        b=5;
     }
}

class A3 {
	//final 필드값을 대입한 후에는 추가 값 대입 불가능 
    int a = 3;
    final int b = 5;
    A3() {
    	a=7;
        //b=9; (불가능)
    }
}

- final 필드의 초기화는 반드시 생성자에서 진행

 

- final 지역 변수 

class B {
	void bcd() {
    	int a =3;
        final int b =5;
        a = 7;
        //b=9; (불가능)
    }
}

 - 클래스 B 내 bcd() 메서드에서 정의한 지역 변수 b는 final로 선언돼 있으므로 값 수정 불가 

 

 - 필드가 final로 선언됐을 때 메모리 상황

 A a = new A()

class A {
	int a;
    final int b;
    A() {
    	a = 3;
        b = 5;
    }
}

 - 필드는 final 필드 여부에 관계없이 객체 속에 포함

 - 객체가 만들어질 때 final로 선언된 필드값은 상수(final)영역에 1개 복사 

 

 -지역변수가 final로 선언됐을 때 메모리 상황

 B b = new B()

class B {
	void bcd() {
    	int a = 3;
        final int b = 5;
     }
}

 - 메서드의 실행 과정에서 지역변수들은 스택 메모리에 저장

 - final 지역변수는 상수 영역에 1개 복사 

 - 값의 복사는 값을 선언한 후 최초로 값이 초기화될 떄 딱 한번 일어남 

 

2. fianl 메서드와 final 클래스 

 

 1) final 메서드 

  

  - 최종 메서드 

  - 메서드의 기능을 변경할 수 없는 메서드

  - 자식 클래스에서 해당 메서드를 오버라이딩할 수 없음

 

class A {
	void abc() {
    }
    final void bcd() {
    }
}

class B extends A {
	void abc() {
    }
    //void bcd() {} -> 불가능
}

 

2) final 클래스 

 

 - 최종 클래스

 - 더 이상 자식클래스가 없음

 - 상속 자체가 아예 불가능 

 - ex) String 클래스 

final class A {
 	//...
}
//class B extends A{} ->불가능

 

'Java' 카테고리의 다른 글

12-1장 추상 클래스  (0) 2023.06.02
11-2장 abstract 제어자  (0) 2023.06.02
6-1 장 클래스와 객체의 개념  (2) 2023.04.24
5-2장 문자열을 저장하는 String  (0) 2023.04.23
5-1장 배열 (2)  (0) 2023.04.22