JAVA/java 이론

[자바JAVA]final필드와 상수

자바칩 프라푸치노 2020. 10. 10. 15:38

1. final필드

최종적인 값을 갖고 있는 멤버 변수

= 값을 변경할 수 없다.

class앞에 붙으면 더 이상 확장 되지 않는다. 상속불가.

 

- final의 초기화 방법

멤버 변수 선언시,

생성자에서 단 한번 초기화

 

2. 상수

static final

객체 마다 가지는 불변의 정적 필드

- 이름은 전부 대문자로 작성

다른 단어가 결합되면 _으로 연결

 

(예제)

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
package sec02_exam_final;
 
public class Person {
 
    //불변의 인스턴스 필드(선언과 동시에 초기화를 하거나, 혹은 생성자에서 단 한번만 초기화가 이루어진다.)
    final String NATION = "KOREA"//상수를 선언
    final String SSN;
    String name;
    
    //불변의 정적 필드(메모리의 멤서드영역에 올라가므로 반드시 선언과 동시에 초기화해야함)
    //역할: 공용데이터
    static final int AGE = 100;
    
    //매개변수가 있는 생성자
    public Person( String sSN, String name) {
//        this.NATION = nATION; 이미 초기화가 되어 있기 때문에 변경할 수 없다.
        
        //this.NATION = "aaaa"; // nation = "KOREA"초기화를 이미 진행했다.
        //this는 객체 자기 자신의 주소(참조변수와 동일)
        //this는 Person이라는 인스턴스(new)가 만들어질 때 , 비로소 활성화된다.
                
        this.SSN = sSN;
        this.name = name;
        //this.AGE = age;
    }
    
    
    
}
 
cs

Person클래스에

멤버변수로 

final String NATION

final String SSN 

이 왔는데 이 두개는 상수입니다. final 이므로 한번 초기화 하면 값을 못바꾸고요, 

static이 안붙었기 때문에 인스턴스 필드입니다.

 

static final int AGE 는 불변의 정적 필드로서 선언과 동시에 바로 초기화를 해주어야합니다.

SSN은 선언시 초기화 하지않고 생성자에서 단 한번 초기화해주고 있습니다.

 

 

(실행클래스)

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
31
32
33
34
35
36
37
package sec02_exam_final;
 
public class PersonEx {
 
    public static void main(String[] args) {
        
        Person person = new Person("123456-123456""홍길동");
//        Person person2 = new Person("123456-123456", "을지문덕");
//        
//        person = person2; //홍길동은 쓰레기 객체가 됨.
        System.out.println(person.NATION);
        System.out.println(person.SSN);
        System.out.println(person.name);
        System.out.println();
        
        //아래코드는 ㄴ상수는 절대로 한번만 초기화 가능하고 수정이 안된다.
        //하여 예외가 발생한다.
//        person.NATION = "USA";
//        person.SSN = "123456-123654";
        
        person.name = "광개토대왕";
        System.out.println(person.NATION);
        System.out.println(person.SSN);
        System.out.println(person.name);
        System.out.println(Person.AGE); //static방법으로 접근
 
        
        //결론
//        1. static final : 정적 불변의 상수, 메모리 상단(클래스 영역, 메서드 영역, 정적영역)
//        에 하나만 생성이 되고 공유되는 상수이다.
//        2. final : 불변의 인스턴스 상수, 메모리의 힙에 할당이 된다. new연산자를 몇 번 외치든 간에
//        만들어진 인스턴스 만큼 생성된다.
 
    }
 
}
 
cs

Person객체를 만들어주었습니다.

매개변수로 SSN과 name이 초기화됩니다.

NATION은 위에서 Korea라고 초기화를 해주었고

SSN은 생성자에서 찍은 123456-123456 이며,

name은 홍길동입니다.

 

<출력결과>

 

728x90