ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] final
    Programming🧑‍💻/Java 2022. 10. 25. 10:48

    final

    final 변수

    - 변수를 final로 선언시

    클래스의 필드를 final로 설정하면 클래스를 통해 만들어진 객체의 해당 필드는 더이상 값의 변경이 불가능하다. 

    그래서 객체가 생성될 때 final로 선언된 필드의 값들을 모두 가지지 못하면 객체가 만들어진 이후 값을 부여할 방법이 없다. 

    따라서 객체 생성시 final로 선언된 필드 값들을 모두 가지고 있어야 객체의 생성이 가능하다. 

     

    - final로 선언된 필드의 자료형이 참조형일 경우

    final를 사용해 선언한 필드의 자료형이 참조형일 경우 객체가 생성된 이후 final 변수가 다른 객체를 가리키도록 할 수는 없지만

    대상이 되는 객체를 내부적으로 변경이 가능하다. 

    예를 들어 final int[] a = arr 로 a가 arr를 가리키고 있으면 이 변수 a는 다른 배열을 가리키도록 하지는 못하지만 a가 가리키고 있는 arr는 내부적으로 요소들의 변경이 가능하다. 

     

    final variable의 초기화 

    해당 필드를 가진 객체가 생성되기 전까지만 final 필드의 값을 부여하면 된다. 

     

    - final 변수의 초기화 방법

     

    1. 변수 선언과 함께 초기화하기

    가장 흔하게 사용되는 방식으로 변수를 선언하는 동시에 값을 할당한다. 

     

    2. instance initalizer block , constructor내부에서 초기화하기 

    변수 선언시 값을 초기화하지 않은 변수를 blank final variable이라 한다.

    blank final variable은 instance initalizer block 또는 constructor를 이용해 값을 할당한다. 

     

    3. static blank final variable을  static block을 이용해 초기화하기 

    만일 blank fianl varialble이 static으로 선언되면 static block을 이용해 해당 변수에 값을 할당한다. 

     

    class GFG {
    
        // a final variable
        // direct initialize
        final int THRESHOLD = 5;
    
        // a blank final variable
        final int CAPACITY;
    
        // another blank final variable
        final int MINIMUM;
    
        // a final static variable PI
        // direct initialize
        static final double PI = 3.141592653589793;
    
        // a blank final static variable
        static final double EULERCONSTANT;
    
        // instance initializer block for
        // initializing CAPACITY
        {
            CAPACITY = 25;
        }
    
        // static initializer block for
        // initializing EULERCONSTANT
        static{
            EULERCONSTANT = 2.3;
        }
    
        // constructor for initializing MINIMUM
        // Note that if there are more than one
        // constructor, you must initialize MINIMUM
        // in them also
        public GFG()
        {
            MINIMUM = -1;
        }
    
    }

     

    - final variable은 언제 사용하는가?

    final 변수의 일반 변수와의 유일한 차이점은 해당 변수에 값을 할당한 이후에는 새로운 값의 할당이 불가능하다는 것이다.

    따라서 program이 실행중에 값이 변화하지 않아야 하는 변수에 대해서만 final 변수를 사용한다. 

     

    - 참조형 변수에 final이 사용되는 경우

    참조형 변수에 final이 사용된 경우 원시형 변수와 같이 '재할당'이 불가하다.

    하지만 참조형 변수의 경우에는 재할당이 의미하는 것은 가리키던 객체를 나두고 다른 객체를 가리키는 것을 의미한다.

    따라서 참조형 변수가 가리키고 있는 객체는 내부적으로 값의 변경이 가능하다. 

     

    // Java Program to demonstrate
    // Reference of Final Variable
    
    // Main class
    class GFG {
    
    	// Main driver method
    	public static void main(String[] args)
    	{
    		// Creating sn object of StringBuilder class
    		// Final reference variable
    		final StringBuilder sb = new StringBuilder("Geeks");
    
    		// Printing the element in StringBuilder object
    		System.out.println(sb);
    
    		// changing internal state of object reference by
    		// final reference variable sb
    		sb.append("ForGeeks");
    
    		// Again printing the element in StringBuilder
    		// object after appending above element in it
    		System.out.println(sb);
    	}
    }
    
    // output
    // Geeks
    // GeeksForGeeks

    위의 경우에는 변수 sb는 동일한 객체를 가리키고 있지만 객체 자체가 변화함을 알 수 있다. 

     

     

    * method, block, constructor의 내부에 final 변수가 선언될시 지역변수로서 해당 지역내에서 값의 할당이 이루어져야한다. 

     

     

     

    final class

    - class를 final keyword를 이용해 선언시 해당 class는 다른 class들이 상속하는 것을 막는다.

    예를 들어 Integer, Float과 같은 모든 wrapper class들은 final로 선언함으로써 상속을 하지 못하도록 한다. 

     

    - class 자체의 변경을 방지하기 위해 final 변수를 이용한다. 

    final class A
    {
         // methods and fields
    }
    // The following class is illegal
    class B extends A 
    { 
        // COMPILE-ERROR! Can't subclass A
    }

     

    final method

    • 부모 클래스의 메서드가 자식 클래스들에도 똑같은 기능을 유지해야할 때 
    • 자식 클래스에서 해당 메서드가 오버라이딩 되는 것을 방지하기 위해 final을 사용하여 메서드를 선언한다. 
    class A 
    {
        final void m1() 
        {
            System.out.println("This is a final method.");
        }
    }
    
    class B extends A 
    {
        void m1()
        { 
            // Compile-error! We can not override
            System.out.println("Illegal!");
        }
    }

     

    final Keyword in Java - GeeksforGeeks

    A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

    www.geeksforgeeks.org


    댓글

Designed by Tistory.