본문 바로가기

Study

[JAVA]Static vs Final 차이(cf. Finally, Finallize())

정적멤버(=Static Member)

 

정적 멤버

 

-정적(Static)은 고정된이라는 의미임

-정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미함.

Class내의 정적 멤버

정적 멤버 선언

 

-필드와 메소드 선언시 static 키워드를 추가적으로 붙이면 됨

public class 클래스{
// 정적 필드
static 타입 필드[=초기값]

// 정적 메소드
static 리턴 타입 메소드(매개변수 선언, ....) {...}
}

 

정적 멤버 사용의 판단 기준

 

1. 필드

1) 인스턴스 필드 : 객체마다 가지고 있어야 할 데이터

2) 정적 필드 : 객체마다 가지고 있을 필요가 없는 공용 데이터

 

예) 원의 넓이를 구할 때 size는 변하는 값이므로 인스턴스 필드, pi는 변하지 않는 값이므로 static으로 선언

public class Caclurator{
 String size;
 static double pi = 3.14;
}

 

2. 메소드 

1) 인스턴스 메소드 : 인스턴스 필드를 포함한다면 인스턴스 메소드로 선언

2) 정적 메소드 : 인스턴스 필드를 포함하고 있지 않다면 정적 메소드로 선언

 

정적 멤버 사용 가능 시점

 

-클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음

 

정적 멤버 사용 방식

 

클래스.필드;
클래스.메소드(매개값, ...);

public class AAA{
static double a = 1234;
static int b(int c, int d) {....}
}
double result1 = 3 * 3 * AAA.a;
                             // 클래스명.메소드명
int result2 = AAA.b(10, 10);
                // 클래스명.메소드명

 

*원칙적으로는 클래스 이름으로 접근해야 함. 

But, 객체 참조 변수로도 접근이 가능하다. 

AAA aaa = new AAA();
double result1 = 3 * 3 * aaa.a;
int result2 = aaa.b(10, 10);

 

정적 메소드 선언 시 주의사항

 

-정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없음.

-객체 자신의 참조인 this 키워드도 사용 불가능

 

따라서, 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성한 후 참조 변수에 접근해야 함

1) 불가능 예시

public class AAA{

1) 인스턴스 필드와 메소드 선언

2) 정적 필드와 메소드 선언

3) 정적 메소드
static void method3(){
this.인스턴스 필드 = 1; (X)
this.인스턴스 메소드(); (X)

정적 필드 = 1; (O)
정적 메소드(); (O)
}

}

2) 가능 예시

static void method3(){
AAA aaa = new AAA();
aaa.인스턴스필드 = 1;
aaa.인스턴스메소드();
}

Final

final 

 

-final : 최종적이라는 의미

-final 필드는 초기값이 저장되면 최종적인 값이 되어서 프로그램 실행 도중 수정할 수 없음

 

final 필드 선언 방법
final 타입 필드 [=초기값];

 

<final 필드에 초기값을 줄 수 있는 방법>

1. 필드 선언 시 주기

-단순 값은 필드 선언 시에 주는 것이 간단함

 

2. 생성자에서 주기

-복잡한 초기화 코드가 필요하거나 객체 생성 시에 외부 데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야 함. 생성자로 지정할 경우, final필드의 최종 초기화를 완료하지 않으면 컴파일 에러가 발생함.

public class Menu{
final String category = "KOREA";
final String price;
String flavor;

public Menu(String price, String flavor){
  this.price = price;
  this.flavor = flavor;
}
}

 

출처 : 혼자 공부하는 자바(도서)

'Study' 카테고리의 다른 글

[JAVA]라이브러리와 프레임워크 차이  (0) 2022.02.09
[JAVA]제네릭이란? 사용 방법, 사용 이유  (0) 2021.12.28
[JAVA]JVM과 JAVA 실행 방식  (0) 2021.12.27
[JAVA]ajax란 무엇인가?  (0) 2021.12.26
[Study / JSPProject]폴더  (0) 2021.10.21