언어(Language)/Java

[Java] 정적(static) 멤버

송기동 2023. 8. 3. 15:09
728x90

정적(static) 멤버

- 클래스 레벨에 선언되므로 클래스의 모든 인스턴스에서 동일한 값을 공유

- 클래스가 로드될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지

   → 프로그램 실행 중 항상 메모리에 상주

   → 해당 클래스의 인스턴스를 생성하지 않고도 접근할 수 있음

- 특정 인스턴스에 속하지 않으므로 해당 변수를 사용하려면 클래스 이름을 사용해 접근해야 함

- 종종 상수 값으로 사용됨, 프로그램의 여러 부분에서 공통적으로 사용됨

- 여러 스레드에서 동시에 접근할 수 있기 때문에 스레드 안정성을 보장해야 함

   → 동기화를 통해 여러 스레드 간의 안전한 접근을 보장할 수 있음


정적 멤버 선언

- static 키워드를 추가하면 된다.

public class 클래스명 {

    static 데이터타입 필드 = 초기값; // 정적 필드 선언
    
    static 리턴타입 메소드명(매개변수, ...){ ... } // 정적 메소드 선언
}

# 정적 필드 선언

- 객체마다 가지고 있을 필요성 없는 공용적인 필드

- 객체 생성 없이도 사용할 수 있음

   → 생성자에서 초기화 작업을 하지 않음

public class Calculator {
	String color;	// 계산기별로 색깔이 다를 수 있다.
    static double pi = 3.14159;	// 계산기에서 사용하는 파이(π) 값은 동일
}

 

# 정적 메소드 선언

- 인스턴스 필드를 이용하지 않는 메소드

- 객체가 없어도 실행 됨

   → 내부에 인스턴스 필드나 인스턴스 메소드를 사용하지 못함 (사용하려면 객체를 먼저 생성하고 참조 변수로 접근해야 함)

   → 객체 자신의 참조인 this 사용 불가

public class Calculator {
	String color;					// 인스턴스 필드
    void setColor(String color) { this.color = color; } // 인스턴스 메소드
    static int plus(int x, int y) { return x + y; }		// 정적 메소드
    static int minus(int x, int y) { return x - y; }	// 정적 메소드
}

- plus() 메소드는 외부에서 주어진 매개값들을 가지고 처리하므로 정적 메소드로 선언

- 인스턴스 필드인 color를 변경하는 setColor() 메소드는 인스턴스 메소드로 선언

# 정적 멤버 사용

int result1 = Calculator.plus(10, 5);
int result2 = Calculator.plus(10, 5);

- 클래스 이름과 함께 도트(.) 연산자로 접근

- 객체 참조 변수(new 키워드)로도 접근이 가능하지만 클래스 이름으로 접근하는 것이 정석

 

728x90