본문으로 바로가기

클래스 멤버, 인스턴스 멤버

category onYouTube/Java 2021. 3. 24. 14:57
  • 클래스 변수는 static으로 선언되지만,
    인스턴스 변수는 staitc으로 선언되지 않음
  • 클래스 변수는 '클래스명.정적변수명' 또는 '인스턴스명.정적변수명'으로 표기해 사용할 수 있음
class Calculator {

	int r;
    	// 인스턴스 변수
	static double PI = 3.14;
   	// 클래스 변수
}


public class CalculatorDemo {

	public static void main(String[] args) {
    
		Calculator c1 = new Calculator();

		System.out.println(c1.PI);
		// 인스턴스를 통해서 PI에 접근
        
		System.out.println(Calculator.PI);
		// 클래스를 통해서 PI에 접근
	}
}

 

  • <클래스 변수의 용도>
       ① 인스턴스에 따라서 변하지 않는 값이 필요한 경우
       ② 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
       ③ 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
public class Calculator2 {
	
	static double Pi = 3.14;
	static int base = 0;
	int left, right;
	
	public void setOperation(int left, int right) {
    
		this.left = left;
		this.right = right;
	}
	
	public void sum() {
    
		System.out.println(this.left + this.right + base);
	}

	public static void main(String[] args) {
    
		Calculator2 c1 = new Calculator2();
		c1.setOperation(10, 20);
		c1.sum(); // 30
		
		Calculator2 c2 = new Calculator2();
		c2.setOperation(20, 40);
		c2.sum(); // 60
		
		Calculator2.base = 10;
		
		c1.sum(); // 40
		c2.sum(); // 70	
		// 클래스 변수 값의 변경 사항을 모든 인스턴스가 공유
	}
}

 

  • 클래스 메소드는 클래스에 직접 접근함으로써 사용됨
  • 클래스 메소드는 인스턴스 멤버에 접근할 수 없지만,
    인스턴스 메소드는 클래스 멤버에 접근할 수 있음
class C1 {

	static int static_variable = 1;
	int instance_variable = 2;
	
	static void static_static() {
    
		System.out.println(static_variable);
		// 클래스 메소드에서는 클래스 변수에 접근할 수 있음
	}
	
	static void static_instance() { 
    
		System.out.println(instance_variable); // 에러
		// 클래스 메소드에서는 인스턴스 변수에 접근할 수 없음
	}
	
	void instance_static() { 
    
		System.out.println(static_variable);
		// 인스턴스 메소드에서는 클래스 변수에 접근할 수 있음
	}
	
	void instance_instance() {
    
		System.out.println(instance_variable);
		// 인스턴스 메소드에서는 인스턴스 변수에 접근할 수 있음
	}
}


public class ClassMemberDemo { 

	public static void main(String[] args) {
    
		C1 c = new C1();
		
		c.static_static();
		// 인스턴스를 이용해서 정적 메소드에 접근 ➝ 성공
		// 정적 메소드가 정적 변수에 접근 ➝ 성공

		c.static_instance();	
		// 인스턴스를 이용해서 정적 메소드에 접근 ➝ 성공
		// 정적 메소드가 인스턴스 변수에 접근 ➝ 실패

		c.instance_static();		
		// 인스턴스를 이용해서 인스턴스 메소드에 접근 ➝ 성공
		// 인스턴스 메소드가 클래스 변수에 접근 ➝ 성공

		c.instance_instance();		
		// 인스턴스를 이용해서 인스턴스 메소드에 접근 ➝ 성공
		// 인스턴스 메소드가 인스턴스 변수에 접근 ➝ 성공

		C1.static_static();				
		// 클래스를 이용해서 클래스 메소드에 접근 ➝ 성공
		// 클래스 메소드가 클래스 변수에 접근 ➝ 성공

		C1.static_instance();		
		// 클래스를 이용해서 클래스 메소드에 접근 ➝ 성공
		// 클래스 메소드가 인스턴스 변수에 접근 ➝ 실패

		C1.instance_static();		
		// 클래스를 이용해서 인스턴스 메소드 메소드에 접근 ➝ 실패

		C1.instance_instance();		
		// 클래스를 이용해서 인스턴스 메소드 메소드에 접근 ➝ 실패
	}
}

'onYouTube > Java' 카테고리의 다른 글

생성자  (0) 2021.03.24
유효범위 (Scope)  (0) 2021.03.24
입력과 출력  (0) 2021.03.24
반복문  (0) 2021.03.24
배열  (0) 2021.03.24