Java

[Java] final

공대생안씨 2024. 7. 9. 17:52

1. final

  • final 키워드가 붙으면 더 이상 변경 불가능 함!
  • 클래스, 메서드 포함 여러곳에 사용 가능

 

1-1. final 변수

1-1-1. final 지역 변수 (매개변수)

public static void main(String[] args) {
	
	// final 지역 변수
	final int data1;
	data1 = 10;
	
	~~data1 = 20;~~ // final 변수 값을 변경하면 컴파일 오류 발생!
	
	// final 지역 변수
	final int data2 = 10;
	
	~~data2 = 20;~~ // final 변수 값을 변경하면 컴파일 오류 발생!	
}

                   // final 매개 변수
static void method(final int parameter) {

	~~parameter = 20;~~ // final 변수 값을 컴파일 변경하면 오류 발생!
}
  • data1
    • 선언 이후 초기화, 최초 1회만 값 설정 가능
  • data2
    • 선언과 동시에 초기화
  • parameter
    • 메서드 호출 시점에 대입된 값이 메서드 종료 까지 계속 유지됨

 

1-1-2. final 멤버 변수 (필드)

  • 초기화 방법 1 - 생성자 통해 초기화
public class Test {
	final int value;
	
	// 생성자로 한번만 초기화 가능	
	public Test(int value) {
		this.value = value;
	}
}

public class Main {
	public static void main(String[] args) {
		
		// 생성자로 final 멤버 변수 초기화		
		Test test1 = new Test(10);
	}
}
  • 초기화 방법 2 - 필드에서 초기화
public class Test {
	// static 변수에도 final 선언가능
	static final int CONST_VALUE = 10;
	// 필드 초기화
	final int value = 10;
}
📌 final

모든 인스턴스에 대해 같은 (여기서는 10) 필드 값을 가짐
힙 영역에 모든 객체마다 value 저장하므로 메모리 낭비
또한 같은 값 계속 생성 ⇒ (개발자 입장) 중복 ⇒ static (final) 사용!
📌 static final ⇒ “바뀌지 않는 공용 변수 선언”

static final 로 선언 ⇒ static 영역에 존재 + final (값 변화 x)
static 영역 : 딱 1개만 존재하는 영역 ⇒ 메모리 낭비 해결!

 

1-2. 상수

  • 변하지 않고 일정한 수
  • 장점
    • 중앙 관리 가능 ⇒ 코드 1개 (상수 값) 만 수정하면 모두 반영됨
    • 매직 넘버 문제 해결 가능 ⇒ 매직 넘버(: 어떤 문맥으로 사용되었는지 모르는 수)
  • static final 키워드
  • 대문자 사용, 구분은 _ (언더스코어) → (관례)
static final int FULL_SCORE = 100;
static final int ZERO_SCORE = 0;
  • 필드 직접 접근
    • 상수는 고정된 값 자체를 사용
    • 직접 접근해도 값 변경 불가능 ⇒ 캡슐화가 깨지지 않음
    public class Constant {
    	
    	static final double PI_VALUE = 3.14;
    	
    }
    
    public class Main {
    	public static void main(String[] args) {
    		// 필드 직접 접근
    		System.out.println("파이 값 = " + Constant.PI_VALUE);
    	}
    }
    	
    

 

1-3. final 변수와 참조

  • final - 기본형 변수 : 값 변경 x
  • final - 참조형 변수 : 마찬가지로 참조 값 변경 x ( = “참조하는 대상 변경 x”)
public class Data {
	int value;
}

public class Main {
	public static void main(String[] args) {
		
		// data : final 참조변수
		final Data data = new Data();
		
		~~data = new Data();~~    // final 참조변수이므로 새 참조값 할당 불가! => 에러
		
		// 참조 대상의 값은 변경 가능!
		data.value = 10;      // 참조 대상을 변경하는 것 x => 대상 내부의 필드 값 변경 가능!
	}
}