728x90

final 변수는 지역변수에 설정하는 경우 최초 1회만 설정이 가능

이후 변수값을 수정하려 하면 컴파일 에러 발생함

매개변수에 final이 붙으면 메소드 내부에서 매개변수의 값을 변경할 수 없다

 

final 지역변수

package final1;

public class FinalLocalMain {

    public static void main(String[] args) {
        //final 지역변수
        final int data1;
        data1 = 10; // 최초 1회만 할당 가능
       // data2 = 20; // 컴파일 오류

        //final 지역변수2
        final int data2 = 10;
        //data2 = 20; // 컴파일 오류
    }

    static void method(final int parameter){
       // parameter = 20; // 컴파일 오류
    }
}

 

 

final 필드(멤버변수)

 

final을 필드에 사용할 경우 해당 필드는 생성자를 통해 한번만 초기화 가능

package final1;

public class ConstructInit {

    final int value;

    public ConstructInit(int value){
        this.value = value;
    }
}

 

 

final 필드를 필드에서 초기화 하면 이미 값이 설정되어서 생성자를 통해서도 초기화가 불가능

package final1;

public class FinalInit {

    static final int CONST_VALUE = 10;
    final int value = 10;

    /*
    public FinalInit(int value){
        this.value = value;
        컴파일 에러
        */
    }
}

 

package final1;

public class FinalFieldMain {

    public static void main(String[] args) {
    
        //final 필드 - 생성자 초기화
        System.out.println("생성자 초기화");
        ConstructInit constructInit1 = new ConstructInit(10);
        ConstructInit constructInit2 = new ConstructInit(20);
        System.out.println(constructInit1.value);
        System.out.println(constructInit2.value);


        //final 필드 - 필드 초기화
        System.out.println("필드 초기화");
        FieldInit fieldInit1 = new FieldInit();
        FieldInit fieldInit2 = new FieldInit();
        FieldInit fieldInit3 = new FieldInit();
        System.out.println(fieldInit1.value);
        System.out.println(fieldInit2.value);
        System.out.println(fieldInit3.value);


        //상수
        System.out.println("상수");
        System.out.println(FieldInit.CONST_VALUE);
    }
}

---------------------------
생성자 초기화
10
20
필드 초기화
10
10
10
상수
10

 

 

 

 

final변수와 상수

 

●  상수 = 변하지 않는 값, 단 하나의 고정된 값

  그래서 상수는 static final을 사용함

  상수를 쓸 때는 대문자로 작성하고 구분은 _ 로 구분함(관례상)

  필드를 직접 접근하여 사용함

  상수는 런타임에는 변경이 불가능

 

 

final 변수와 참조

 

package final1;
public class Data {
	 public int value;
}

 

int value는 final 이 아니라서 변경이 가능하다!

 

package final1;
public class FinalRefMain {
 public static void main(String[] args) {
 
 	final Data data = new Data();
    
	 //data = new Data(); //final 변경 불가 컴파일 오류
    	 //참조 대상의 값은 변경 가능
 
 	data.value = 10;
	System.out.println(data.value);
    
 	data.value = 20;
 	System.out.println(data.value);
 }
}

 

data.value는 final이 아니기에 값 변경이 가능!

 

 

 

 

종합예시

package final1.ex;

public class Member {

    private final String id; //final 키워드 사용
    private String name;

    public Member(String id, String name){
        this.id = id;
        this.name=name;
    }

    public void changeData(String name){
        this.name = name;
    }

    public void print(){
        System.out.println("id:"+id+", name:"+name);
    }
}
package final1.ex;

public class MemberMain {
    public static void main(String[] args) {
        Member member = new Member("myid","kim");
        member.print();
        member.changeData("seo");
        member.print();
    }
}
728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] 다형성1 ★  (0) 2024.03.07
[JAVA] 상속★  (1) 2024.03.05
[JAVA] Static  (0) 2024.03.04
[JAVA] 접근 제어자  (0) 2024.03.03
[JAVA] 패키지  (0) 2024.03.02

+ Recent posts