대학교

자바 - (7) 인스턴스 멤버와 정적 멤버

매 석 2023. 11. 1. 19:45
반응형

인스턴스 멤버

클래스에는 필드, 메소드와 같은 멤버가 필요하다.

하지만 클래스 멤버를 객체마다 가지게 되면 엄청난 낭비가 될 수 있다.

물론 객체의 필드값이 다르면 다른 객체를 가져야 하지만 같다면

서로 같은 멤버를 가져도 된다.

이를 자바에서 구분하기 위해 인스턴스와 정적 멤버로 나눈다.

인스턴스 멤버란 객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데,

이들을 각각 인스턴스 필드와 메소드로 부른다.

이전에 작성했던 것들은 모두 인스턴스 멤버이다.

출처 : 혼자 공부하는 자바

객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용한다.

생성자와 메소드의 매개 변수 이름이 필드와 같을 경우, 필드 임을 지정하기 위해 주로 사용한다.

출처 : 혼자 공부하는 자바

 

 

정적 멤버

정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고

사용할 수 있는 필드와 메소드를 말한다.

이를 각각 정적 멤버, 정적 메소드라고 부른다.

출처 : 혼자 공부하는 자바

아래와 같이 추가로 객체를 생성하지 않고 바로 사용할 수 있다.

그 이유는 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때

클래스별로 관리되기에 클래스의 로딩이 끝나면 바로 사용할 수 있기 때문이다.

출처 : 혼자 공부하는 자바

물론 원칙적으로 클래스 이름으로 접근해야 하지만 객체 참조 변수로도 접근이 가능하다.

정적 메소드 선언 시 그 내부에 인스턴스 필드 및 메소드는 사용 불가하다.

또한 그 객체 자신 참조인 this 키워드도 사용 불가하다.

출처 : 혼자 공부하는 자바

아래와 같이 main 메소드도 정적 메소드이기에

객체 생성 없이 인스턴스 필드와 메소드를 바로 사용할 수 없다.

출처 : 혼자 공부하는 자바

정리하자면 인스턴스는 객체마다 다를 수 있는 필드값을 가질 때 사용하고,

객체마다 다를 필요 없는 필드값은 정적 필드를 사용한다.

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

그렇지 않을 경우는 정적 메소드로 선언한다.

 

 

final 필드

초기값이 저장되면 최종값이 되어 프로그램 실행 도중 수정이 불가하다.

이도 마찬가지로 인스턴스와 정적으로 나누어 선언할 수 있다.

인스턴스는 생성자 단계에서 초기화를 거치고, 정적의 경우 선언과 초기화를 동시에 한다.

출처 : 혼자 공부하는 자바

출처 : 혼자 공부하는 자바

 

 

실습문제

- 정답 코드

package task65;

public class CurrencyConverter {
	private static CurrencyConverter rate;
	static double R;
	private CurrencyConverter(double r) {
		R=r;
	}
	
	static double toDollar(double won) {
		return won/R;
	}
	static double toKRW(double dollar) {
		return dollar*R;
	}
	static void setRate(double r) {
		rate = new CurrencyConverter(r);
	}
}
package task65;
import java.util.Scanner;
public class CurrencyConvertEx {

	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		System.out.print("환율(1달러)>> ");
		double r = s.nextDouble();
		CurrencyConverter.setRate(r);
		double dollar = CurrencyConverter.toDollar(1000000);
		System.out.printf("백만원은 $%.2f입니다.\n",dollar);
		double won = CurrencyConverter.toKRW(100);
		System.out.printf("$100는 %.2f원입니다.\n",won);
	}

}