1. final

ㄱ. 변수에 붙이는 경우 : 변수 선언시 마지막 값이 되도록(상수) 만들어준다. 처음 선언시의 초기화만 가능하고, 보통 상수로 사용할 때에는 static을 붙여 같이 사용한다. => 상수명은 전부 대문자로만 이루어져야 함

 

ㄴ. 메소드에 붙이는 경우 : 메소드에 final을 선언하면 그 메소드가 포함된 클래스를 상속받은 클래스에서 오버라이딩을 통해 재정의할 수없는 메소드가 된다.(final 메소드에 오버라이딩 시도시 에러 발생)

1
2
3
4
5
6
7
8
9
10
package kr.or.ksmart.A;
 
public class FinalTest {
    String str = "홍길동";
        
//    String형 str 변수를 리턴하는 name 메소드 선언
    public final String name() {
        return str;
    }
}
cs

 

1
2
3
4
5
6
7
8
9
10
package kr.or.ksmart.A;
 
public class FinalTest_Extend extends FinalTest {
//    FinaltTest 클래스를 상속받는 FinalTest_Extend 클래스
//    name 메소드를 오버라이딩 하지 못한다(컴파일 에러가 남)
//    => final로 정의해줬기 때문에
    public String name() {
        return "강감찬";
    }
}
cs

 

 

(실제로 이클립스 상에서 final을 수정하거나 삭제하라는 오류가 뜬다)

 

ㄷ. 클래스에 붙이는 경우 : final + 접근제한자 + 클래스명

abstract와 함께 사용 불가 - final은 상속 불가인데 abstract는 추상 클래스 생성시 사용하는 내용이므로 공존할 수 없음(컴파일 에러)

 

 

 

2. static

클래스나 인스턴스 생성시 각 인스턴스들은 독립적이기 때문에 서로 다른 값을 유지하는 경우에 따라 각각의 인스턴스들이 공통적으로 같은 값을 유지해야 하는 경우에 사용.

static이 붙은 변수는 클래스가 메모리에 올라갈 때 인스턴스가 자동적으로 생성되기 때문에 인스턴스를 생성할 필요가 없음.

static 메소드는 인스턴스 생성 없이 호출이 가능하나, 보통은 인스턴스 변수를 생성해야만 호출이 가능하므로 static 메소드 내에서는 인스턴스 변수를 허용함(인스턴스 변수가 존재한다 > static 변수가 이미 메모리에 있기 때문에)

먼저 클래스 멤버 변수중 모든 인스턴스에 공통된 값을 유지해야 하는 것이 있는지 살펴보고 static을 붙임(작성한 메소드 중 인스턴스 변수를 사용하지 않는 메소드에 대해 static을 붙임)

보통 클래스 변수와 관련된 작업을 하는 메소드나 변수에 static을 붙임.

 

 

3. final과 static의 차이

final은 절대 변하지 않는 상수이나 static은 어느 클래스 & 메소드에서나 사용 가능한 공용일 뿐 변수이기 때문에 언제든지 바뀔 수 있는 가변성을 가지고 있다.

+ Recent posts