상세 컨텐츠

본문 제목

[Java] final, static, static final

server

by 셉인 2024. 4. 4. 11:20

본문

728x90

[Java] final, static, static final

Java에서 final, static, 그리고 static final 키워드는 각각 다른 목적과 의미를 가지고 있으며, 변수, 메서드, 클래스에 적용될 수 있다. 이러한 키워드들은 Java 프로그래밍의 기본 구성 요소로, 객체 지향 프로그래밍의 중요한 개념들을 구현하는 데 도움을 준다.

1. final : 최종적인

해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능 하다

  • 변수에 적용할 경우: 변수에 final을 사용하면, 그 변수는 상수가 된다. 즉, 한 번 초기화된 후에는 그 값을 변경할 수 없다. 객체 참조 변수의 경우, 참조하는 객체를 변경할 수 없지만, 객체 내부의 상태는 변경할 수 있다.
  • 메서드에 적용할 경우: 메서드에 final을 사용하면, 해당 메서드는 오버라이딩(Overriding)될 수 없다. 즉, 하위 클래스에서 같은 시그니처를 가진 메서드를 재정의할 수 없다.
  • 클래스에 적용할 경우: 클래스에 final을 사용하면, 해당 클래스는 상속될 수 없다. 즉, 다른 클래스가 이 클래스를 확장할 수 없다.
public class Person {
    // final 변수
    final String name;

    // 생성자에서 final 변수 초기화
    public Person(String name) {
        this.name = name;
    }
    
    // name 값을 반환하는 메서드
    public String getName() {
        return name;
    }
}

public class Test {
    public static void main(String[] args) {
        // Person 인스턴스를 생성하고 이름을 초기화
        Person person = new Person("Seb");
        
        // name 값을 출력
        System.out.println(person.getName());
        
        // 아래 코드는 컴파일 오류
        //final 변수는 값을 변경할 수 없다.
        // person.name = "Server"; // 컴파일 오류
    }
}

 

name 변수의 불변성 보장

-> 불변 객체를 만들거나, 값이 변경되어서는 안 되는 변수를 다룰 때 유용

2. static : 고정된 

객체 생성 없이 사용할 수 있는 필드와 메서드를 생성하고자 할 때 활용

클래스 변수(정적 변수)와 클래스 메서드(정적 메서드)에 사용

  • 변수에 적용할 경우: 변수에 static을 사용하면, 그 변수는 클래스 변수가 된다. 이는 클래스의 모든 인스턴스가 공유하는 변수이며, 인스턴스를 생성하지 않고도 클래스 이름을 통해 접근할 수 있다.
  • 메서드에 적용할 경우: 메서드에 static을 사용하면, 그 메서드는 클래스 메서드가 된다. 클래스 메서드는 인스턴스 메서드와 달리 객체의 인스턴스 없이 호출될 수 있으며, 인스턴스 변수에 직접 접근할 수 없다.
  • 블록에 적용할 경우: static 블록(정적 초기화 블록)은 클래스가 처음 로딩될 때 한 번 실행되며, 주로 정적 변수를 초기화하는 데 사용된다.

예) 

public class Counter {
    // 정적 변수
    static int count = 0;
    
    // 인스턴스 생성 시 count를 1 증가시키는 생성자
    public Counter() {
        count++;
    }
    
    // count 값을 반환하는 정적 메서드
    public static int getCount() {
        return count;
    }
}

public class Test {
    public static void main(String[] args) {
        // 인스턴스를 생성합니다.
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    	Counter c3 = new Counter();

    // 정적 메서드를 호출하여 현재 count 값을 출력
    // 인스턴스 생성 없이 직접 클래스 이름을 사용하여 getCount() 메서드에 접근
    System.out.println("현재 카운터 값: " + Counter.getCount());
	}
}

 

"클래스이름.필드"로 사용 가능

 

주의 : 정적 메서드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에 인스턴스 필드나 메소드, 그리고 this 키워드 사용X

-> 인스턴스 성질은 객체 생성 후 사용할 수 있으므로 

3. static final : 고정된 + 최종적인 -> 상수

모든 영역에서 고정된 값으로 사용하는 상수

  • static final은 함께 사용될 때, 클래스 레벨의 상수를 정의하는 데 사용된다. static으로 인해 클래스의 모든 인스턴스가 이 변수를 공유하고, final로 인해 그 값이 변경될 수 없다. 따라서 static final 변수는 클래스의 상수로, 컴파일 타임에 값을 할당받아야 하며, 실행 중에는 그 값을 변경할 수 없다.
public class Math {
    // static final 변수로 원주율 PI를 정의
    public static final double PI = 3.14159;
}

public class Test {
    public static void main(String[] args) {
        // Math 클래스의 PI 상수에 접근하여 값을 출력
        // 인스턴스 생성 없이 클래스 이름으로 직접 접근 가능
        System.out.println(Math.PI);
        
        // 아래 코드는 컴파일 오류를 발생
        // static final 변수는 변경할 수 없다.
        // Math.PI = 3.14; // 컴파일 오류
    }
}

 

728x90

관련글 더보기

댓글 영역