java&spring

[Java] 예약어 final 정리

sungjine 2017. 3. 7. 19:25
반응형

final 예약어를 예제와 함께 알아보자.

 

- 순서 -

1. 클래스에 final이 붙으면?

2. 메소드에 final이 붙으면?

- 변수에 final이 붙을 때 공통 - 

3. 클래스 변수에 final이 붙으면?

4. 인스턴스 변수에 final이 붙으면?

5. 지역 변수에 final이 붙으면?

6. 매개 변수에 final이 붙으면?

7. 변수가 참조 자료형일 때 final이 붙으면?

 

--------------------------------------------------------------------------

 

1. 클래스에 final이 붙으면?

 

final class SuperClass {

}

 

public class SubClass extends SuperClass { // 에러가 난다.

}

 

상속되지 않는다. 즉 더는 상속이 되지 않아야 하는 클래스에 붙이면 된다.

가까운 예로 String 클래스를 까보면 final이 붙어있는 것을 볼 수 있다.

 

--------------------------------------------------------------------------

 

2. 메소드에 final이 붙으면?

 

class SuperClass {

final void test(){}

}

 

public class SubClass extends SuperClass {

void test(){} // 에러가 난다.

}

 

오버라이딩 되지 않는다. 즉 부모의 메소드를 재정의 하지 못하게 막는 것이다.

 

class SuperClass {

final void test(){}

final void test(int number){}

}

 

오버로딩은 잘 된다.

 

--------------------------------------------------------------------------

 

- 변수에 final이 붙을 때 공통 -

% 변수에 final이 붙으면 초기화를 한 후에는 변경할 수 없다는 것을 알아두고 아래 내용을 읽자 %

 

final int variable = 1;

variable = 2; // 에러

 

--------------------------------------------------------------------------

 

3. 클래스 변수에 final이 붙으면?

 

public class FinalTest {

final static int variableA = 1;  // 정상

final static int variableB;       // 에러

}

 

클래스 변수는 선언과 동시에 초기화를 하지 않으면 에러가 난다.

 

--------------------------------------------------------------------------

 

4. 인스턴스 변수에 final이 붙으면?

 

public class FinalTest {

final int variableA = 1;  // 정상

final int variableB;       // 에러

}

 

클래스 변수와 마찬가지로 선언과 동시에 초기화를 하지 않으면 에러가 나지만 생성자에 초기화를 해주면 에러가 나지 않는다.

 

public class FinalTest {

final int variableA = 1;  // 정상

final int variableB;       // 에러나지 않음

SubTest(){

variableB = 2;

}

}

 

--------------------------------------------------------------------------

 

5. 지역 변수에 final이 붙으면?

 

public class FinalTest {

void method(){

final int variableA = 1; // 정상

final int variableB;

variableB = 2;           // 정상

}

}

 

지역 변수는 메소드 안에서만 참조되므로 언제 초기화하는지 중요하지 않다.

 

--------------------------------------------------------------------------

 

6. 매개 변수에 final이 붙으면?

 

public class FinalTest {

void method(final int variable){

variable = 2; // 에러

}

}

 

매개 변수는 이미 초기화가 되어서 넘어왔기 때문에 초기화 할 필요가 없다. 따라서 값을 다시 선언해주면 에러가 난다.

 

--------------------------------------------------------------------------

 

7. 변수가 참조 자료형일 때 final이 붙으면?

 

public class FinalTest {

void method(){

final OtherClass otherClass = new OtherClass();

otherClass.a = 2;                   // 정상

otherClass.b = 1;                   // 에러

otherClass = new OtherClass(); // 에러

}

}

class OtherClass {

int a = 1;

final int b = 2;

}

 

참조 자료형도 마찬가지로 변수에 다시 객체를 선언한다면 에러가 난다. 하지만 초기화된 객체 안의 변수에는 final이 아니므로 수정이 가능하다. 즉 참조 자료형의 변수가 final이라도 그 안에 있는 변수가 final이 아니면 수정할 수 있다.

반응형