final 키워드
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 13번째.
Java에서 final 키워드는 수정을 방지합니다. 이 키워드는 변수, 메서드, 클래스에 적용될 수 있으며, 각각 다른 효과를 가집니다.
변수에 final을 적용하면 상수가 됩니다. 즉, 한 번 할당되면 그 값을 변경할 수 없습니다:
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // 생성자에서 한 번 할당할 수 있음
}
public void setRadius(double r) {
// this.radius = r; // 에러! final 변수는 재할당할 수 없음
}
}final 변수는 선언 시점이나 생성자에서 초기화되어야 합니다. 그 이후에 이를 재할당하려는 시도는 컴파일 오류를 발생시킵니다.
참조 타입의 경우, final은 참조가 다른 객체를 가리킬 수 없음을 의미하지만, 객체의 내용은 여전히 변경될 수 있습니다:
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // 오류! 재할당할 수 없음
name.append(" Doe"); // OK! 객체 내용은 변경 가능필드와 함께 final을 사용하는 것은 의도를 명확하게 전달합니다. 이는 초기화 이후에 이 값이 절대 변경되지 않아야 함을 다른 개발자에게 알려줍니다. 이는 설정 값, ID 또는 객체의 수명 동안 일정하게 유지되어야 하는 모든 데이터에 특히 유용합니다.
챌린지
쉬움학생이 등록된 후 절대 변경되지 않아야 하는 데이터를 보호하기 위해 final 키워드를 사용하는 Student 등록 시스템을 구축해 봅시다.
코드를 구성하기 위해 두 개의 파일을 생성합니다:
Student.java: 특정 정보가 한 번 설정되면 영구적으로 고정되는 Student 클래스를 생성합니다:final필드studentId(String) - 생성 시 할당되며 절대 변경할 수 없음final필드enrollmentYear(int) - 학생이 등록한 연도로, 이 또한 영구적임- 일반 private 필드
name(String) - 학생이 이름을 변경할 경우 업데이트 가능 - 세 가지 값을 모두 받아 필드를 초기화하는 생성자
- 학생 ID를 위한 게터
getStudentId() - 등록 연도를 위한 게터
getEnrollmentYear() - 이름을 위한 게터
getName()및 세터setName() - 다음 형식을 반환하는
getInfo()메서드:"ID: [studentId] | Name: [name] | Enrolled: [enrollmentYear]"
Main.java: Student 객체를 생성한 다음, 이름을 업데이트하고 정보를 표시합니다. 학생 ID, 초기 이름, 등록 연도, 그리고 업데이트할 새 이름까지 총 네 개의 입력을 받습니다. 다음 두 줄을 출력하세요:- 이름 변경 전의 학생 정보
- 이름 변경 후의 학생 정보
studentId (String), name (String), enrollmentYear (int), newName (String) 순서대로 네 개의 입력을 받게 됩니다.
final 필드가 학생의 ID와 등록 연도를 어떻게 보호하는지 확인해 보세요. 이들은 변경되어서는 안 되는 영구적인 기록인 반면, 이름은 세터를 통해 업데이트될 수 있습니다.
치트 시트
Java에서 final 키워드는 수정을 방지합니다. 이 키워드는 변수, 메서드, 그리고 클래스에 적용될 수 있습니다.
변수에 적용될 때, final은 해당 변수를 상수로 만듭니다. 즉, 한 번 할당되면 그 값을 변경할 수 없습니다.
public class Circle {
private final double PI = 3.14159;
private final double radius;
public Circle(double radius) {
this.radius = radius; // 생성자에서 한 번 할당 가능
}
public void setRadius(double r) {
// this.radius = r; // 오류! final 변수는 재할당할 수 없음
}
}final 변수는 선언 시점이나 생성자에서 반드시 초기화되어야 합니다. 그 이후에 다시 할당하려고 시도하면 컴파일 오류가 발생합니다.
참조 타입(reference types)의 경우, final은 참조가 다른 객체를 가리킬 수 없음을 의미하지만, 객체 내부의 콘텐츠는 여전히 변경될 수 있습니다.
private final StringBuilder name = new StringBuilder("John");
// name = new StringBuilder("Jane"); // 오류! 재할당할 수 없음
name.append(" Doe"); // OK! 객체 내용은 변경 가능필드에 final을 사용하는 것은 의도를 전달합니다. 즉, 초기화 이후에 값이 절대 변하지 않아야 함을 나타내며, 이는 설정값, ID 또는 상수 데이터를 다룰 때 유용합니다.
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 입력 읽기
String studentId = scanner.nextLine();
String name = scanner.nextLine();
int enrollmentYear = scanner.nextInt();
scanner.nextLine(); // 개행 문자 소비
String newName = scanner.nextLine();
// TODO: 초기 값으로 Student 객체 생성
// TODO: 이름 변경 전 학생 정보 출력
// TODO: setter를 사용하여 학생 이름 업데이트
// TODO: 이름 변경 후 학생 정보 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조