-
[자바] 클래스 멤버와 인스턴스 멤버자바 2022. 8. 4. 11:44728x90
클래스 멤버와 인스턴스 멤버
멤버란?
인스턴스 변수 - 인스턴스 마다 서로 다른 값을 가지고 있다. ( 매소드에서 left, right 의 값이 다르다 )
클래스 변수 - 공동으로 공유하는 값 ( 모두 같은 값을 가진다. )class Calculator { static double PI = 3.14; // 클래스 변수 ( 전역 변수라고 생각 ) int left, right; // left값과 right값은 인스턴스마다 다른 값을 가진다 public void setOperands(int left, int rigjt) { this.left = left; this.right = right; } public void sum() { System.out.println(this.left + this.right); } public void avg() { System.out.println((this.left + this.right) / 2); } } public class CalcaulatorDemo { public static void main(String[] args) { Calculator c1 = new Calculator(); Calculator c2 = new Calculator(); System.out.println(c1.PI); // 3.14 같은 값을 갖는다 System.out.println(c2.PI); // 3.14 System.out.println(Calculator.PI); // 3.14 이런식으로 호출이가능하가 c1.setOperands(10,20); // left, right는 인스턴스마다 다른 값을 가질 수 있다. c1.sum(); } }
클래스 변수의 용도
- 인스턴스에 따라 변하지 않는 값 ( ex ) PI )
- 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우 ( ex) Calculator.PI 만 구하고 싶은 경우 )
인스턴스를 생성하는 이유는 인스턴스 변수에 따른 다른 값을 얻고 싶은 경우에만 생성하기 때문이다.
- 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우클래스 메소드
인스턴스를 생성하지 않고 sum과 avg를 실행
class Calculator2 { // static -> 클래스 메소드 -> 클래스에 직접 접근해서 실행이 가능하다. public static sum(int left, int right) { System.out.println(left + right); } public static avg(int left, int right) { System.out.println((left + right) / 2); } } public class CalcaulatorDemo { public static void main(String[] args) { Calculator2.sum(10,20); Calculator2.suavgm(10,20); } }
가장 중요한 부분
1. 인스턴스 메소드 ( static 이 없는 멤버 )는 클래스 멤버에 접근할 수 있다.
2. 클래스 메소드는 인스턴스 멤버에 접근 할 수 없다.
( 클래스라는 것은 인스턴스 이전에 있다. 이유는 클래스로부터 인스턴스가 만들어지기 때문이다. 그래서 클래스가 아직 생성되지 않은 인스턴스에 접근하는것이라고 생각을 해보면 접근할 수 없다는 것을 알수있다)class c1 { static int static_val = 1; int instance_val = 2; // 클래스 매소드가 클래스 변수를 호출하는 메소드 static void static_static() { //System.out.println(static_val); 에러 발생 } // 클래스에서 인스턴스 변수에 접근하는 메소드 static void static_instance() { //System.out.println(instance_val); 에러 발생 } void instance_static() { System.out.println(static_val); } void instance_instance() { System.out.println(instance_val); } } public class classDemo { public static void main(String[] args) { c1 c = new c1(); // 인스턴스를 생성해 접근 c.static_static(); // 1 c.static_instance() // err : staic 메소드에서는 인스턴스에 접근할 수 없다. c.instance_static(); // 1 c.instance_instance(); // 2 // 클래스로 접근 c1.static_static(); // 1 c1.static_instance(); // err : staic 메소드에서는 인스턴스에 접근할 수 없다. c1.instance_static(); // err : 인스턴스를 만들기 전에 클래스로 어떻게 접근함? c1.instance_instance(); // err : 위와 마찬가지로 인스턴스를 아직 만들지 않음 } }