[Java] final 키워드로 구현 의도를 나타내보자

Daon (HyeongIk Jo)·2024년 3월 17일
9

개글스

목록 보기
2/8
post-thumbnail

Java를 사용하다보면 종종 final이란 키워드를 만나볼 수 있다.
아래는 오늘 소개해볼 final을 적용해볼 수 있는 구간들이다.

// 클래스
public final class Person {
	
    // (전역) 변수
	private final Name name;
    
	public Person(final Name name) {
    	this.name = name;
    }
    // 메서드
    final void setName(final Name newName) {
    	name = newName;
    }
}

final 키워드란

Java의 final 키워드는 비접근 제어자로 변수, 메서드, 클래스에 사용되며 이들의 수정을 제한시킨다.

final 변수

원시 타입 변수부터 보자.

final이 있고 없는 두 변수의 값을 수정하려는 시도를 하였다.
final을 명시한 변수의 경우 IntelliJ가 컴파일 에러의 발생을 감지하여 빨갛게 밑줄을 나타내었다.

그럼 참조 타입 변수의 경우는 어떨까? String을 인스턴스 변수로 가지는 Name 클래스 예시를 통해 알아보자.

참조 타입 변수의 경우 setter를 통한 인스턴스 변수 수정은 정상 동작하였으나 생성자를 통해 새로운 객체를 할당하는 경우 컴파일 에러가 발생하였다.

우리는 여기서 final 이 하는 일을 재정리할 수 있다.

final을 Variable에 사용하는 경우 '재할당'을 불가능하게 한다.

다른 예시로 상수와 인자가 있다.
상수의 경우 보통 private static final 또는 public static final 형태로 변수를 선언한다. static을 통해 컴파일 시점에 메모리 할당을 한번만 하기 때문에 효율성 측면에서 이점을 가진다.

인자의 경우 메서드 내부에서 인자를 변경할 수 없도록 해줄 수 있다.

void doSomeWork(final String name) {
    name = "daon";  // compile Error! 
}

메서드 & 클래스

위의 동작을 이해하였다면 메서드와 클래스는 이해하기 쉽다.
메서드의 경우 자식 클래스에서 final 키워드가 사용된 부모 클래스의 메서드를 재정의 할 수 없다. 이를 시도하면 컴파일 에러가 발생한다.

class Parent {
	final void makeDance() {
    }
]

class Child extends Parent {
	
    // Compile Error!
	@Override
    void makeDance() {
    }
}

클래스에 final을 사용한다면 해당 클래스는 상속할 수 없는 클래스가 된다. 즉 부모 클래스가 될 수 없다. 상속을 시도한다면 컴파일 에러가 발생한다.

final class FinalClass {
	// ... 
}

// Compile Error!
class ChildClass extends FinalClass {
}

대표적으로 String 클래스가 존재한다.

불변(Immutable)과의 차이

final로 재할당을 명시적으로 방지할 수 있지만 불변과는 엄연히 다른 개념이다.
위에 예시로 들었던 Name 참조 타입 변수를 다시 보자.

public class Name {
	private String name;

    Name(String name) {
    	this.name = name;
    }

    public String getName() {
    	return name;
    }

	public void setName(String newName) {
    	name = newName;
	}
}

위의 결과와 같이 name의 인스턴스 변수는 수정이 되었다.
final은 다른 참조나 다른 객체를 가리키도록 객체의 참조를 변경할 수는 없지만 상태를 변경할 수는 있다.

이와 달리 불변 객체는 실제 값을 변경할 수 없지만 참조를 다른 값으로 변경할 수 있다.

정리

final 키워드를 사용하여 코드를 통해 작성자의 설계 의도를 나타낼 수 있다.
그러나 가독성 측면과 확장성을 제한한다는 트레이드 오프가 있기에 자기만의 기준을 가지고 적용하는 것이 중요하다.


참고문헌

https://www.w3schools.com/java/ref_keyword_final.asp
final Keyword in Java
final vs Immutability in Java

profile
To be a Backend Developer

2개의 댓글

comment-user-thumbnail
2024년 3월 18일

깔끔 정리 굿 👍 저는 불변인 지역 변수에 습관적으로 final을 붙이다가 오히려 가독성을 해칠 수 있다는 피드백을 받았는데 다온의 final 붙이는 기준이 어떻게 되는지 궁금하네요..!!

답글 달기
comment-user-thumbnail
2024년 3월 18일

코드 예시를 통해 final 키워드에 대해 정리해주셔서 이해하는데 도움이 많이 됐어요 👍🏻

답글 달기

관련 채용 정보