반응형
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | , 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다? 이걸로는 안됩니다!전 우아한형제들 기술이사, 누적 수강생 40만 명 돌
www.inflearn.com
final 변수와 상수
- 이름 그대로 끝이라는 뜻으로 변수에 붙으면 더는 값을 변경할 수 없다.
- `class`, `method`를 포함한 여러 곳에 붙을 수 있다.
지역 변수
public class FinalLocalMain {
public static void main(String[] args) {
//final 지역 변수1
final int data1;
data1 = 10; //최초 한번만 할당 가능
//data1 = 20; //컴파일 오류
//final 지역 변수2
final int data2 = 10;
//data2 = 20; //컴파일 오류
method(10);
}
// 매개변수
static void method(final int parameter) {
//parameter = 20; //컴파일 오류
}
}
- `final`을 지역 변수에 설정할 경우 최초 한 번만 할당할 수 있다. 이후에 변수의 값을 변경하려면 컴파일 오류가 발생한다.
- `final`을 지역 변수 선언 시 바로 초기화한 경우, 이미 값이 할당되었기 때문에 값을 할당할 수 없다.
- 매개변수에 `final`이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다. 따라서 메서드 호출 시점에 사용된 값이 끝까지 사용된다.
멤버 변수
public class ConstructInit {
final int value;
public ConstructInit(int value) {
this.value = value;
}
}
- `final`을 필드에 사용할 경우 해당 필드는 생성자를 통해서 한 번만 초기화될 수 있다.
- 생성자를 사용해서 `final` 필드를 초기화하는 경우, 각 인스턴스마다 `final` 필드에 다른 값을 할당할 수 있다.
public class FieldInit {
static final int CONST_VALUE = 10;
final int value = 10;
}
- `final` 필드를 필드에서 초기화하면 이미 값이 설정되었기 때문에 생성자를 통해서도 초기화할 수 없다.
- 이 경우에는 모든 인스턴스가 같은 값을 가진다.
- 모든 인스턴스가 같은 값을 사용하기 때문에 결과적으로 메모리를 낭비하게 된다(JVM에 따라서 내부 최적화를 시도할 수 있다). 또 메모리 낭비를 떠나서 같은 값이 계속 생성되는 것은 개발자가 보기에 명확한 중복이다. 이럴 때 사용하면 좋은 것이 바로 `static` 영역이다.
- `static` 변수에도 `final`을 선언할 수 있다.
상수(Constant)
상수는 변하지 않고, 항상 일정한 값을 갖는 수를 말한다. 자바에서는 보통 단 하나만 존재하는 변하지 않는 고정된 값을 상수라 한다. 이런 이유로 상수는 `static final` 키워드를 사용한다.
자바 상수 특징
- `static final` 키워드를 사용한다.
- 대문자를 사용하고 구분은 `_`(언더스코어)로 한다. (관례)
- 일반적인 변수와 사우를 구분하기 위해 이렇게 한다.
- 필드를 직접 접근해서 사용한다.
- 상수는 기능이 아니라 고정된 값 자체를 사용하는 것이 목적이다.
- 상수는 값을 변경할 수 없다. 따라서 필드에 직접 접근해도 데이터가 변하는 문제가 발생하지 않는다.
public class Constant {
//수학 상수
public static final double PI = 3.14;
//시간 상수
public static final int HOURS_IN_DAY = 24;
public static final int MINUTES_IN_HOUR = 60;
public static final int SECONDS_IN_MINUTE = 60;
//애플리케이션 설정 상수
public static final int MAX_USERS = 2000;
}
- 보통 이런 상수들은 애플리케이션 전반에서 사용되기 때문에 `public`을 주로 사용한다. 물론 특정 위치에서만 사용된다면 다른 접근 제어자를 사용하면 된다.
- 상수는 중앙에서 값을 하나로 관리할 수 있다는 장점도 있다.
- 상수는 런타임에 변경할 수 없다. 상수를 변경하려면 프로그램을 종료하고, 코드를 변경한 다음에 프로그램을 다시 실행해야 한다.
final 변수와 참조
변수는 크게 기본형과 참조형 변수가 있다.
- 기본형 변수는 `10`, `20` 같은 값을 보관하고, 참조형 변수는 객체의 참조값을 보관한다.
- `final`을 기본형 변수에 사용하면 값을 변경할 수 없다.
- `final`을 참조형 변수에 사용하면 참조값을 변경할 수 없다.
public class Data {
public int value;
}
public class FinalRefMain {
public static void main(String[] args) {
final Data data = new Data();
//data = new Data(); final 변경 불가 컴파일 오류
//참조 대상의 값은 변경 가능
data.value = 10;
System.out.println(data.value);
data.value = 20;
System.out.println(data.value);
}
}
- 참조형 변수 `data`에 `final`이 붙었다. 변수 선언 시점에 참조값을 할당했으므로 더는 참조값을 변경할 수 없다.
- 참조형 변수에 들어있는 참조값만 변경하지 못한다는 뜻이다. 이 변수 외에 다른 곳에 영향을 주는 것이 아니다.
- 참조 대상의 객체 값은 변경할 수 있다.
- `Data.value`는 `final`이 아니다. 따라서 값을 변경할 수 있다.
정리하자면 참조형 변수에 `final`이 붙으면 참조 대상 자체를 다른 대상으로 변경하지 못하는 것이지, 참조하는 대상의 값은 변경할 수 있다.
반응형
'Java > 김영한' 카테고리의 다른 글
[Java/김영한] 다형성 (3) | 2025.03.03 |
---|---|
[Java/김영한] 상속 (1) | 2025.02.28 |
[Java/김영한] 자바 메모리 구조와 static (0) | 2025.02.22 |
[Java/김영한] 접근 제어자 (0) | 2025.01.16 |
[Java/김영한] 패키지 (1) | 2024.09.08 |