본문 바로가기
Work & Study/JAVA (& 혼공자Java)

자바(Java) - 인스턴스 멤버와 정적 멤버2 (정적 멤버 & static)

by a.k.a DUKI 2020. 10. 15.
728x90
반응형

정적(static) 멤버

 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다

 

 

정적 멤버 선언

정적 필드와 정적 메소드 선언은 선언시 static을 추가적으로 작성하면 된다.

public class 클래스{
	//정적 필드
    static 타입 필드 [=초기값];
    
    //정적 메소드
    static 리턴 타입 메소드 (매개변수 선언, ...){ ...}
}

혼공자 유툽 참고

정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스(바이트코드)를 로딩해서 메소드 메모리 영역에 저장할 때 클래스별로 관리 된다. 그래서 클래스 로딩이 끝나면 바로 사용할 수 있다.

 

정적 멤버 사용

크래스 이름과 함께 도트(.) 연산자로 접근한다.

클래스.필드;
클래스.메소드(매개값, ... );

 

예시1) Calculator클래스

public class Car {
	// 정적 필드
	staic double pi = 3.14159;

	
	// 정적 메소드
	static int plus(int x, int y) { 
    	ruturn  x + y; 
    }
    static int minus(int x, int y) { 
    	return x - y;
    }
}

 필드 pi와 정적 메소드 plus(), minus() 아래처럼 사용할 수 있다.

double result1 = 10 * 10 * Calulator.pi;
int result2 = Calulator.plus(10,5);
int result3 = Calulator.minus(10,5);

System.out.println("result1: " + result1);
System.out.println("result2: " + result2);
System.out.println("result3: " + result3);

 

인스턴스 멤버와 정적 멤버 선택 기준

객체마다 다를 수 있는 필드 값은 인스턴스 필드로 선언

객체마다 다를 필요가 없는 필드 값은 정적 필드로 선언

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

메소드 블록에 인스턴스 필드 또는 인스턴스 메소드를 사용할 경우는 인스턴스 메소드로 선언

메소드 블록에 인스턴스 필드 또는 인스턴스 메소드를 사용지 않는 경우는 정적 메소드로 선언

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;
    }

 

 

정적 메소드 선언 시 주의 할 점

  1. 정적 메소드 선언 시 그 내부에 인스턴스 필드 및 메소드 사용할 수 없다.
  2. 정적 메소드 선언 시 그 객체 자신 참조인 this키워드 사용할 수 없다.
	//인스턴스 필드와 메소드
	int field1;
	void method1() { ... }
	
	//정적 필드와 메소드
	static int field2;
	static void method2() { ... }
	
	
	//정적 메소드
	static void Method3{
		this.field1 = 10; //컴파일 에러
		this.method1();   //컴파일 에러
		field2 = 10;      //정상 작동
		method2();        //정상 작동 
	}

만약, 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 아래처럼 객체를 먼저 생성하고 참조 변수로 접근 해야한다.

	static void Method3{
		ClassName obj = new ClassName();
		obj.field1 = 10;
		obj.method1();
	}

 

예시2) 정적 메소드 선언 시 주의 할점

public class Car {
	// 인스턴스 필드
	int speed;

	// 인스턴스 메소드
	void run() {
		System.out.println(speed + "으로 달린다.");
	}
	
	public static void main(String[] args) {
		Car xCar = new Car(); //객체 생성
		xCar.speed = 100;
		xCar.run();
	}

}

 

 


※용어 정리

  • 정적 멤버: 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 이들을 각각 정적 필드, 정적 메소드라 부른다.

  • static: 정적 멤버를 선언할 때 사용하는 키워드

 

본 내용은 #혼자공부하는자바 책을 참고해 공부하려 작성했습니다.
728x90
반응형