Notice
Recent Posts
Recent Comments
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Spring & Java

final - 변하지 않는 값 본문

JAVA 객체지향 이해하기

final - 변하지 않는 값

dev.hyuck 2025. 12. 10. 15:12

● 메서드 - 모듈화의 시작

● 클래스와 객체

● JVM 메모리 영역

● 래퍼클래스 (기본형 참조형)

● static - 클래스가 공유

● final - 변하지 않는 값

● 인터페이스 - 표준화의 시작

● 객체지향 PART 1 -  캡술 (접근제어자)

● 객체지향 PART 2 -  상속

● 객체지향 PART 3 - 추상화

● 객체지향 PART 4 - 다형성

 

final - 변하지 않는 값

 

학습 키워드 점검

final - 값 변경 불가 또는 참조 변경 불가를 의미

상수 - 변하지 않는 값, static fianl로 선언하여 재사용

불변객체 - 내부 상태가 절대 변경되지 않는 객체

 

final의 용도

● 변수는 변경이 불가능하게 만듭니다.

● 클래스는 상속할 수 없게 만듭니다.

● 메서드는 수정할 수 없게 만듭니다. (오버라이딩 불가)

 

상수

● 상수는 변하지 않고 항상 일정한 값을 갖는 수 입니다.

● Java에서 상수는 대문자로 표현하는 것이 관례 입니다.

● 프로그램 실행중에 절대 변경되서는 안되기 때문에 static final키워드를 사용해 선언합니다.

● static 으로 선언된 변수는 프로그램 시작시 한 번만 초기화 되고 모든 인스턴스에서 같은 값을 공유합니다.

 

대표적인 상수 예시 PI (원주율)

● 원의 넓이, 둘레를 구할 때 공통으로 사용되는 값입니다. (변경되면 안됨)

public class Circle {

    final static double PI = 3.14159; // ✅ 상수 선언
}

System.out.println("상수활용: " + Circle.PI);

 

static으로 선언하는 이유(복습)

● 보통 상수는 여러 곳에서 값을 공유해 쓰일 목적으로 활용됩니다.

● 인스턴스 변수를 static 없이 선언할 경우 인스턴스마다 PI값이 중복 저장됩니다.

 

불변객체( Immutable Object )

불변객체 ( Immutable object ) 의 특징

● 불변객체는 내부 상태를 변경할 수 없는 객체 입니다.

● final을 속성 ( property, field ) 에 활용합니다.

● 세터(setter) 없이 설계 합니다.

● 변경이 필요한 경우 새로운 객체를 만들어야 합니다.

● String, Integer, 래퍼클래스


[ ! ] 잘못된 불변객체 사용

● final은 참조 변경을 막지만 내부상태 변경은 막지 않습니다.

public class Circle {

    final static double PI = 3.14159; // ✅ 직접 만든 원주율 상수
    double radius; // ⚠️ final 로 선언되어 있지 않기 때문에 외부에서 변경 가능

    Circle(double radius)  {
        this.radius = radius;
    }
}

final Circle c1 = new Circle(2);
c1 = new Circle(3); // ❌ final은 변수 c1이 한 번 참조한 객체는 다른 객체로 변경될 수 없음을 의미함 (참조 불변)

// 하지만 객체 내부의 속성 값은 변경 가능 (불변 객체가 아님)
c1.radius = 3; // ⚠️ 내부 상태 변경 가능 (객체 자체가 불변이 아님)

 

[ o ] 올바른 불변 객체 활용

● 속성을 final로 선언해 줍니다.

public final class Circle {

    final static double PI = 3.14159; 
    final double radius; // ✅ final 로 선언해서 값이 변경되지 않도록 합니다.

    Circle(double radius)  {
        this.radius = radius;
    }
}

 

[ ! ] 불변 객체의 값이 변경이 필요한 경우

● 불변성을 유지하면서 값을 변경하는 효과를 얻을 때 활용합니다.

● 기존 객체의 상태를 직접 변경할 수 없기 때문에 새로운 객체를 생성 합니다.

● 생성자를 새로 호출하거나 아래의 기능을 활용할 수 있습니다.

public final class Circle {
    public static final double PI = 3.14159;
    private final double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    // ✅ 반지름이 다른 새로운 Circle 생성 (불변 객체 유지)
    public Circle changeRadius(double newRadius) {
        return new Circle(newRadius); // 생성자 호출: 기존 객체 변경 X, 새 객체 생성
    }
}