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 메소드는 객체에 종속된 것이 아님

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 필드 값 변경 불가