반응형

자바 Final Keyword 1편 보기. http://loganstory.com/229 

정리해보자면,

final 키워드는 변수,메소드,클래스에 사용될 수 있는데,

final은 오버로드와 오버라이드 그리고 상속이 제한된다는 점

하지만 순수호출은 가능하다는 점!

기억하고 계시나요?

그렇다면 맨 처음에 설명드렸던 초기화되지않은 파이널 변수에 대해서 알아보도록하죠.

Q) Blank or Uninitialized final variable이 무엇인가요?

A)선언되었을떄 초기화되지않은 파이널 변수를 Blank final variable이라고합니다.

만약, 여러분이 객체가 생성될 때 값이 초기화되고 바뀌지않는 변수를 만들고자 할 때 Blank final variable을 사용하시게 될텐데요.

(직원 고유번호, PIN번호 같은 곳에 쓰일 수 있다고합니다)

Blank final variable은 생성자 안에서만 초기화될수 있습니다.

이해를 도울 예제를 살펴보시죠.

blank final variable( 빈 파이널 변수)는 이렇게 생겼습니다.

          1. class Student{  
          2. int id;  
          3. String name;  
          4. final String PAN_CARD_NUMBER;  
          5. ...  
          6. }  

 

그럼 빈 파이널 변수를 초기화시킬 수 있을까요?

 생성자를 통해서만 가능합니다.

package fianl_keyword;


class Bike10{  

  final int speedlimit;//blank final variable  

   

  Bike10(){  

  speedlimit=70;  

  System.out.println(speedlimit);  

  }  

 

  public static void main(String args[]){  

    new Bike10();  

}  

}  

자. 살펴봅시다!

필드에 blank final variable을 선언해줬고,

생성자에서 speedlimit의 값을 70으로 초기화했습니다.

그리곤 메인메소드에서 찍어봤는데요.

70이 뙇!

그렇단 말은 생성자의 변수 초기화구문이 적용됬다는게 증명이 된거겠죠.

그리고 final 키워드앞에 static이 올수도있습니다.

그렇다면 static blank final variable을 생성할수도있다는 말이되지요.

허나, static block에서만 초기화가 가능합니다.

예제를 살펴보시죠.

package fianl_keyword;

class A{  

  static final int data;//static blank final variable  

  static{ data=50;}  

  public static void main(String args[]){  

    System.out.println(A.data);  

 }  

}

result = 50  

필드에 static blank final variable 생성해주고,

static{} 블럭안에서 해당 필드를 초기화해줍니다.

그리고 메인메소드에서 접근자 .(dot)을 통해서 호출을 해보면

50이라는 결과값이 나옵니다.

Q)  final 매개변수는 뭐에요..?

A) 쉽습니다. 메소드의 매개변수에 final키워드를 사용해주시면됩니다.

그럼 한번 입력받은 매개변수는 변경할 수 없는 상수가 되버리죠.


cube 메소드의 매게변수에 final int n 을 줍니다. 그리고 

연산식으로 n 변수를 연산해봅시다.


그리고 메인메소드에서 객체를 생성하고 매개변수로 5를 주면?


컴파일러 에러가 두둥!

에러를 해석해봅시다.package fianl_keyword;


class Bike11{  

  int cube(final int n){  

  n=n+2;//can't be changed as n is final  

  n= n*n;  

  }  

  public static void main(String args[]){  

    Bike11 b=new Bike11();  

    b.cube(5);  

}  

}  


Exception in thread "main" java.lang.Error: Unresolved compilation problems: 

This method must return a result of type int

The final local variable n cannot be assigned. It must be blank and not using a compound assignment

The final local variable n cannot be assigned. It must be blank and not using a compound assignment


at fianl_keyword.Bike11.cube(Bike11.java:4)

at fianl_keyword.Bike11.main(Bike11.java:10)



두둥... 에러내용을 해석해보자면 이렇습니다

"야, 사용자야 생각을 해보자.. 니가 매개변수에 final 줬지?

니가 값 바뀌는게 싫어서 매개변수를 상수로 정의했으면서 왜

그 상수로 연산식을 포함한 메소드를 실행시키는건데? 

돌아가 안되" 라고 하네요..

그럼 생성자에 final 키워드를 사용할 수 있을까요?

생성자는 상속되지않기때문에 final키워드를 사용할 수 없습니다..!!

모르시는 부분이나 애매한 부분은 댓글남겨주시면 감사하겠습니다 :)





반응형
by 발전소장 에르 :) 2017. 8. 8. 01:08