Java

[JAVA] static과 final

HSRyuuu 2023. 5. 17. 11:17

static 키워드 : 공통으로 사용하는 변수가 필요한 경우 사용


  • 여러 인스턴스가 공유하는 기준값이 필요한 경우 
  • 인스턴스가 생성될 때 만들어지는 변수가 아니고, 처음 프로그램이 메모리에 로딩될 때 메모리를 할당
  • 클래스 변수, 정적 변수라고 도 함 ( <-> 인스턴스 변수 )
  • 인스턴스 생성과 상관없이 사용하므로 클래스 이름으로 직접 참조

1. static 변수

ex) 학생이 생성될때마다 학번을 1씩 증가시켜서 저장해 줌

public class Student {
	
	private static int studentNum=10000;
	
	private int studentName;
	private int studentID;
//  Student 객체를 생성할 때마다 studentNum++ 하여 studentID로 설정해준다.	
	public Student() {
		studentNum++;
		studentID=studentNum;
	}

	public Student(int studentName) {
		this.studentName = studentName;
	}
//studentNum은 private 변수 이므로 get 메소드를 만들어준다.
    public static int getStudentNum(){
    return studentNum;
    }
}

2. static 메서드 (클래스 메서드)

  • static 메서드는 객체 생성 없이 호출할 수 있다. (클래스 이름으로 호출 / 가능은 하지만 지양)
  • static 메서드 내에서는 인스턴스 변수를 사용할 수 없다.
  • 일반 메서드에서 static 변수는 사용할 수 있다.
public static int getStudentNum(){
	//studentName = "Kim"; // ->static 메서드 내에서 인스턴스변수 사용 불가 
    return studentNum;
}

3. 변수의 유효범위, 메모리

변수 유형 선언 위치 사용 범위 메모리 생성과 소멸
지역변수
(로컬 변수)
함수 내부 함수 내부에서만 사용 스택 함수가 호출될때 생성되고,
함수가 끝나면 소멸
멤버변수
(인스턴스 변수)
클래스내에서 멤버
변수로 선언
private일 경우 클래스 내부에서만 사용하고, 아닐경우 참조변수로
다른 클래스에서 사용 가능
인스턴스가 생성될 때 힙에 생성되고, gc 동작될 때 소멸됨
static 변수
(클래스 변수)
static 예약어를 사용하여 클래스 내부에 선언 private일 경우 클래스 내부에서만 사용하고, 아닐경우 참조변수로
다른 클래스에서 사용 가능
데이터 영역 프로그램이 처음 시작할 때 데이터영역에 생성되고, 프로그램이 끝나고 메모리를 해제할 때
소멸 됨

 

final 키워드


변하지 않는 상수가 필요한 경우 사용한다.

 

final 키워드를 이용해서 상수로 선언한 경우 변수 명은 대문자로 사용한다.

지역변수의 상수

  • 데이터 타입 앞 final 키워드를 명시한다.
  • 맨 처음에 변수를 선언한 이후에 값을 더 이상 수정할 수 없도록 한다.

소속 변수인 필드를 상수로 선언하기 위해  사용

  • 어떤 클래스 내부에서 사용할 상수의 경우 static과 함께 사용하여 정적으로 하는 것이 좋다.
public class Circle{
    static final double PI = 3.141592;
    
    double radius;
    double x;
    double y;
    //...
}

 

반응형