본문 바로가기

JAVA

인스턴스 맴버와 정적 맴버

정적 필드와 정적 메소드를 선언하려면 필드와 메소드 선언 시에 static을 꼭 붙혀주어야 한다.

정적 필드, 메소드는 클래스에 고정된 맴버이므로 클래스의 로딩이 끝나면 바로 사용할 수 있다. 

 

객체마다 가지고 있어야 할 데이터라면 인스턴스 필드를 선언

객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드를 선언하는 것이 좋다. 

 

public class Calculator{
	
	//계산기 별로 색상이 다를 수 있어서 인스턴스 필드 선언
	String color; 
	//계산기에서 사용하는 파이의 값은 동일하므로 정적 필드 선언
	static double pi = 3.14159;
	//계산기에서 사용하는 덧셈의 값은 동일하므로 정적 메소드 선언
	static int plus(int x, int y) { return x+y; }
	
}

 

클래스가 메모리로 로딩되면 정적 맴버를 바로 사용할 수가 있는데, 클래스 이름과 함께 도트(.) 연산자로 접근 가능하다.

 

클래스 . 필드;

클래스 . 메소드 (매개변수);

 

int result = Calculator.plus(10, 5); //15
		
Calculator calculator = new Calculator();

int result2 = calculator.plus(10, 5);

 

원칙적으로는 클래스 이름으로 접근해야하지만, 다음과 같이 참조 객채로 접근도 가능하다. 

 

정적 메소드 선언 시 주의점

 

객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.  또한 객체 자신의 참조인 this 키워드도 사용이 불가능하다. 

 

public class Test01{
	
	int field1;
	void method1() {}
	
	static int field2;
	static void method2() {}
	
	static void method3(){
		
		this.field1=10; //컴파일 에러
		method1(); //컴파일 에러
		
		field2 = 10;
		method2();
	}
}

 

정적 메소드에서 인스턴스 맴버를 사용하고 싶다면 다음과 같이 객체를 먼저 생성하고 참조 변수로 접근해야한다.

main() 메소드를 실행할 때 참조 객체를 만들고 인스턴스 필드와 메소드를 사용하는 것에 대한 이해가 될 것이다. 

 

 

 

 

 

 

 

 

'JAVA' 카테고리의 다른 글

Equals와 hasCode  (0) 2021.08.07
예외 클래스  (0) 2021.08.06
final 필드와 상수  (0) 2021.08.06
싱글톤  (0) 2021.08.06
StringBuilder 란  (0) 2021.08.02