JAVA
[Java.2-5] static 과 final
식빵민
2022. 4. 15. 21:30
- Runtime Data Area (실시간 데이터 영역) : JVM이 프로그램을 수행하기 위해 OS로 할당 받는 메모리 영역
PC 현재 수행중인 JVM Instruction 주소 |
Native Method Stack Java 외의 언어로 작성된 Native 코드들을 위한 stack |
JVM Stack 메소드에서 사용하는 지역변수 |
Heap new 연산자로 생성된 인스턴스 및 배열 |
Method Area 바이트 코드 필드 정보 메소드 정보 static 선언된 변수 |
static
- non-static 멤버의 특성
- 공간적 특성 : 멤버들은 객체마다 독립적으로 별도 존재 (인스턴스 멤버라고도 함)
- 시간적 특성 : 필드와 메소드는 객체 생성 후 비로소 사용 가능
- 비공유 특성 : 멤버들은 다른 객체에 의해 공유되지 않고 배타적
- static 멤버의 특성
- 공간적 특성 : static 멤버는 클래스 당 하나만 생성 (클래스 멤버라고도 함)
- 시간적 특성 : static 멤버는 클래스가 로딩될 때 공간 할당
- 공유의 특성 : static 멤버는 동일한 클래스의 모든 객체의 의해 공유
- 객체를 생성하지 않고 사용 가능
class Sample{
public int n;//non-static 변수
public static int m;//static 변수
public void f(){
n = 20;
}//non-static 메소드
public static void g(){
m = 40;
}//static 메소드
}
public class Ex{
public static void main(String args[]){
Sample s1, s2;
s1 = new Sample();
s1.m = 10;//static 멤버 변수 m = 10
s2 = new Sample();
s2.g();//static 멤버 변수 m = 40
}
}
- 전역 변수, 전역 함수를 만들 때 사용
- 전역 변수나 전역 함수는 static으로 클래스에 작성
- static 멤버를 가진 클래스 : Math 클래스(java.lang.Math)
- 모든 필드와 메소드가 public static 으로 선언
- 다른 모든 클래스에서 사용할 수 있음
public class Math{
public static int abs(int a);
public static double cos(double a);
...
}
Math m = new Math();//오류! Math 생성자는 private
int n = m.abs(-5);//오류! Math 생성자는 private
int n = Math.abs(-5);//ㄴ> 올바른 사용법
- static 메소드의 제약 조건
- static 메소드는 non-static 메소드에 접근 할 수 없음
- 객체가 생성되지 않은 상태에서도 static 메소드는 실행될 수 있기 때문에, non-static 메소드와 필드 사용 불가
- 반대로, non-static 메소드가 static 멤버 사용하는 것은 가능
- static 메소드는 this 사용 불가
- static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로 현재 객체를 가리키는 this 레퍼런스 사용 불가
- static 메소드는 객체에 종속된 것이 아님
- static 메소드는 non-static 메소드에 접근 할 수 없음
final
- final 클래스 : 클래스 상속 불가
final class FinalClass(){} class SubClass extends FinalClass{}//!컴파일 오류! FinalClass 상속 불가
- final 메소드 : 오버라이딩 불가
public class ClassA{
public final int f();
}
public class ClassB{
public int f();//!컴파일 오류! 오버라이딩 불가
}
- final 필드 : 상수 선언할 때 사용
- 선언시, 초기값 지정 필수
- 실행 중 값 변경 불가
final double pi = 3.14;
double area = 3*3*pi;//final 필드 사용
pi = 3.1//!컴파일 오류! final 필드 값 변경 불가