hyeongwoo's blog

[Java] final 본문

JAVA

[Java] final

toribro 2024. 2. 10. 23:45

자바에서 final키워드는 변수 앞에 붙거나 메소드의 반환형 앞에 붙는다.

자바에서 final 키워드가 변수앞에 붙으면 그 변수는 한번 초기화되면 다시는 변경할 수 없는

상수가 된다.

메소드내 지역변수 앞에 final이 붙으면 최초 초기화후 변경이 불가하다.

final int a=2; //상수

 

또한 멤버 변수에도 final이 붙을수 있는데 이때도 최초에 초기화후 변경이 불가하다

하지만 인스턴스별로 생성되는 멤버 변수가 다르기 때문에 인스턴스를 참조하는 객체에서만 

변경이 불가하고 객체별로는 다른 값을 가질 수 있다. 

 

이게 무슨 말이냐면

public class 클래스1{

  private final int a;
  
  //final 멤버변수는 반드시 생성자에서 초기화 해주어야한다.
  public 클래스1(int a){
     this.a=a;
  }
  
  public void setA(int a) {
    //this.a=a //다시 초기화 불가 에러!!!
  }

  public int getA(){
     return a;
  }
  
  
  public static void main(String args[]){
  	
     클래스1 c1=new 클래스1(2);
     클래스1 c2=new 클래스1(3);
     ---- 인스턴스별로는 다른 값을 가질 수 있다.
   }
  
}

 

엄밀히 말하면 클래스 전체로볼때는 상수역할은 하지 못한다. 

하지만 모든 객체들이 한개의 값만 가지게 할 수 있도록 하는 방법이 있는데

static final 선언이다. 

static 변수는 모든 클래스가 공유하는 변수이고 거기에 final을 붙여버리면 클래스당 딱 한번만 초기화가 가능하므로

클래스범위에서 상수 역할을 할 수 있다.  static final 변수는은  static영역과 인스턴스 영역의 메모리 초기화 시점 차이 때문에  생성자로 인스턴스 단위로 초기화가 불가하다.

 

public class 클래스1{

  private static final int a=2;//static final 변수는 즉시 초기화 한다. //생성자에서 초기화 불가
  //한번 초기화 하면 변경 불가

  public 클래스1(){
  
  }
  
  public static void (int a1){
    // a=a1;//다시 초기화 불가
  }
  
  public static int getA(){
     return a;
  }
  
  
  public static void main(String args[]){
  
  	클래스1 c1=new 클래스1();
    클래스1 c2=new 클래스1();
    System.out.println(클래스1.getA()); //클래스로 접근
    
    System.out.println(c1.getA());
    System.out.println(c2.getA());
    //모든 클래스영역이 공유한다.
     
  }
  
}

 

 

final 키워드는 메소드에도 사용할 수 있는데 메소드에 사용하게 되면 상속된 클래스에서 메소드 재정의가 불가하다

주의할것은 상속은 가능하다. 재정의가 안되는 것이다.

public class Main{


    class  A{

        public final int a(){
            return 1;
        }

        public int b(){
           return 2;
        }

        public final int c(){
          return 3;
        }
    }

    class B extends A{

        //public int a(){} // final   서브클래스에서 재정의 불가

          public  int b(){
             System.out.Println("재정의 함수");
             return 3;     
          }//재정의가능


    }


    public static void main (String[] args){

        A a = new A();
        B b = new B();
        b.b(); //재정의 함수 호출
        b.c(); //재정의 안하고 단순 상속은 가능

      }
}

 

'JAVA' 카테고리의 다른 글

[Java] 컬렉션  (0) 2024.02.12
[Java] 제네릭  (0) 2024.02.12
[Java] IO_(입출력스트림)  (0) 2024.02.02
[Java] None_Static영역과 Static영역  (0) 2024.02.02
[Java] 다형성  (0) 2024.01.27