ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바] 클래스 멤버와 인스턴스 멤버
    자바 2022. 8. 4. 11:44
    728x90

    클래스 멤버와 인스턴스 멤버

    멤버란?

    인스턴스 변수 - 인스턴스 마다 서로 다른 값을 가지고 있다. ( 매소드에서 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 : 위와 마찬가지로 인스턴스를 아직 만들지 않음
        }
    }

    '자바' 카테고리의 다른 글

    [자바] 생성자 및 상속  (0) 2022.08.04
    [자바] 유효범위  (0) 2022.08.04
    [자바] 메소드  (0) 2022.08.04
    [자바] 입출력  (0) 2022.07.26
    [자바] 스트림  (0) 2022.07.25
Designed by Tistory.