컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 인스턴스 멤버와 정적 멤버

구로그 2023. 7. 5. 20:42
728x90
✏️ 클래스 멤버: 필드, 메소드

인스턴스 멤버
: 객체마다 가지고 있는 멤버
정적 멤버
: 클래스에 위치시키고 객체들이 공유하는 멤버 

 

 

✓ 인스턴스 멤버 

객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드. 인스턴스 필드, 인스턴스 메소드라고 부른다. 

인스턴스 필드객체마다 따로 존재하고 인스턴스 메소드메소드 영역에 저장되고 공유된다. 

사용할 때는, 우선 객체(인스턴스)를 생성한 후 참조 변수로 접근한다. 

public class Car {
	// 필드 
	String model = "현대";
	int speed = 40;
	
	// 생성자 
	Car(String model){
		this.model = model;
	}
	
	// 메소드
	void setSpeed(int speed) {
		this.speed = speed;
	}
	
	void run() {
		for(int i=10; i <= 50; i+= 10) {
			this.setSpeed(i);
			System.out.println(this.model + "가 달립니다.(시속:" + this.speed + "km/h)");
		}
	}
}
public class CarExample {
	public static void main(String[] args) {
		Car myCar = new Car("포르쉐");
		Car yourCar = new Car("벤츠");
		
		myCar.run();
		yourCar.run();
	}
}

 

 

 정적 멤버와 static 

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

필드와 메소드 선언 시 static 키워드를 붙인다.

 

❗️ 필드 구분
객체마다 가지고 있어야 할 데이터 = 인스턴스 필드
객체마다 가지고 있는 필요가 없는 공용 데이터 = 정적 필드 

❗️메소드 구분
인스턴스 필드를 포함하고 있다면 = 인스턴스 메소드
인스턴스 필드를 포함하지 않는다면 = 정적 메소드 

 

 

클래스 이름과 함께 도트 연산자로 접근하여 사용할 수 있다. 

public class Calculator {
	static double pi = 3.14159;
	
	static int plus(int x, int y) {
		return x + y;
	}
	
	static int minus(int x, int y) {
		return x - y;
	}
}
public class CalculatorExample {
	public static void main(String[] args) {
		double result1 = 10 * 10 * Calculator.pi;
		int result2 = Calculator.plus(10, 5);
		int result3 = Calculator.minus(10, 5);
		
		System.out.println("result1 : " + result1);
		System.out.println("result2 : " + result2);
		System.out.println("result3 : " + result3);
	}
}

 

❗️ 주의사항

- this 키워드 사용 불가

- 정적 메소드 내부에서는 인스턴스 필드, 인스턴스 메소드를 사용할 수 없다.

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

stati void method3() {
    ClassName obj = new ClassName();
    obj.field1 = 10;
    obj.method1();
}

 

 

 싱글톤 

단 하나의 객체만 만들도록 보장해야하는 경우. 

싱글톤을 만들려면 private을 붙여주어 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.   

그리고 자신의 타입인 정적 필드(private)를 하나 선언하고 자신의 객체를 생성해 초기화한다. 

public class 클래스 {
    private static 클래스 singleton = new 클래스();
    
    private 클래스() {}
    
    static 클래스 getInstance() {
    	return singleton;
    }
}

 

  final 필드와 상수 

final 필드는 초기값이 저장되면 이것이 최종값이 되어 프로그램 실행 도중 수정할 수 없다.

final 타입 필드 [=초기값];

 

final 필드는 상수와 달리 객체마다 저장되고 생성자의 매개값을 통해 여러가지 값을 가질 수 있다.

상수는 객체마다 저장할 필요가 없는 공용성을 띠고 있으며 여러 가지 값으로 초기화될 수 없다 (static이면서 final

 

static final 필드는 객체마다 존재하지 않고 클래스에만 존재한다. 

static final 타입 상수 = 초기값;

 

 

 

반응형