자바/정리

(JAVA)클래스 맴버, 인스턴스 맴버.

acid7937 2022. 11. 9. 16:31

이전 글) 클래스와 인스턴스 https://acid7937.tistory.com/13

관련은 적지만...클래스 변수랑 헷갈리실 까봐) 매서드 호출 https://acid7937.tistory.com/12

 

이번에는 클래스 맴버와 인스턴스 맴버에 대해 알아볼것이다.

 

먼저 맴버란 변수와 메서드를 일컫는 말이다.

 

인스턴스는 클래스에서 튀어 나온 제품이고 클래스는 포괄하는 설계도 이다.

 

즉 클래스의 맴버는 인스턴스에서 사용이 가능하지만... 인스턴스의 맴버는 클래스에서 사용이 불가능하다.

 

코드로 살펴보자.

 

public class Calculator2 {

    int left, right; //인스턴스 변수
    static double PI = 3.1415; //클래스 변수
    static int base =0; //클래스 변수

    public void enter(int left, int right) { //인스턴스 매서드로 사용하기 위해 static이 빠져있다.
        this.left = left;
        this.right = right;
    }

    public void avg() {
        System.out.println((this.left + this.right+ base + PI) / 2); //클래스 변수가 인스턴스 매서드 안에 들어가 있다.
    }

    public void sum() {
        System.out.println(this.left + this.right + base + PI); //클래스 변수가 인스턴스 매서드 안에 들어가 있다.
    }

    public static void main(String[] args) {
        Calculator2.base=10;
        Calculator2 c1 = new Calculator2();

        c1.enter(10,20);
        c1.sum();
        c1.avg();

        Calculator2 c2 = new Calculator2();
        c2.enter(20,40);
        c2.sum();
        c2.avg();

    }

}

 

코드의 출력 결과는 아래와 같다.

 

43.1415
21.57075
73.1415
36.57075

 

이전글의 설명들과 지금 설명되어지는 코드의 변경이 약간 있었다. (이전 글 클래스와 인스턴스 https://acid7937.tistory.com/13)

 

코드를 살펴 보면

 

1.Static 이라는것이 보이고

2.println에 갑자기 base랑 PI 값이 들어가고 

3.Main안에 Calculator2.base=10; 이 추가된 것도 보일것이다. 하나씩 설명하겠다.

 

1) Static 이 보이는 것은 클래스 맴버라는 뜻이다. 현재는 클래스 변수로 사용하기 위해 선언 하였다. 클래스 맴버는 클래스와 인스턴스에서 사용이 가능하다. 2번에서 마저 설명하면...

 

2) 클래스 변수로 만든 base와 PI를 아래에 넣은게 보일 것이다.

public void sum() {
    System.out.println(this.left + this.right + base + PI); //클래스 변수가 인스턴스 매서드 안에 들어가 있다.
}

2번에 설명한 클래스 맴버는 인스턴스에서 사용될수 있음을 보여 주고 있다. 그러면 인스턴스에서는 클래스의 값도 인스턴스에 그대로 포함 시켜서 계산하게 된다. 답답하시겠지만 우선 3번으로

 

3) 이번에는 base에다 10이란 값을 넣은것을 확인해 보자.

Calculator2.base=10;

값을 넣을때  C1인 인스턴스로 접근한것이 아닌 클래스로 직접 접근한 것이 보일것이다. 이렇게 클래스 변수는 클래스에서만 변경이 가능하며 그 값은 클래스에서도 사용이 가능하고 인스턴스에서도 사용이 가능하다. 계산 과정으로 살펴보자.

 

인스턴스인  c1.sum(); 을 살펴보면 10과 20의 값을 받아서 30으로 만드는건 이전 링크에서 길게 설명했으니 잘 아실것이다.

 

하지만 인스턴스 메서드를 살펴보면

 

System.out.println(this.left + this.right + base + PI);

 

에서 base 값과 PI 값이 추가 되어 같이 더해주어야 한다.

 

우리는 Calculator2.base=10;로 클래스 변수에 0에서 10으로 바꿔 주었고 고정된 PI 값 또한 더해준다면

*즉 c1.sum(); 의 값은 43.1415가 된다. (10+20+10+3.1415)

 

슬슬 의문이 들것이다. 그래서 왜 쓰는것인가...? (읽으면서 인스턴스는 클래스의 태생인점을 잊지말자 즉 역행은 안됨)

 

1.인스턴스끼리 값 공유

2.굳이 인스턴스에 넣을 필요가 없는 경우

3.인스턴스가 못바꾸는 값을 원하는 경우 - (final도 있음).

 

1) 클래스 변수로 하나로 인스턴스 끼리 값을 공유하면 말할 필요도 없이 편하지 않은가? 설명이 필요없다. (혹시 코드의 주석을 못보신분들을 위해 쓰자면 int left, right; 가 전역변수로 쓰이지만 인스턴스 변수로 사용되고 있다.)

 

2) 예를들어 다른 의미로도 쓰이는 넓은 범위의 값이 있을수도 있잖는가? 파이값이 꼭 해당 인스턴스에 안쓰일수도 있고..

 

3) 클래스 값은 인스턴스에서 변경이 불가능 하다. (Static 있으면 빨간줄 뜰꺼임)

 

3-1) 아직 설명하지 않았지만 앞으로 상속이나 오버라이딩등을 알아볼 예정이다. 그런데 클래스, 변수 혹은 메서드 앞에 final이라는 제어자를 붙여준다면  해당 값은 죽어도 못바꾼다(이후에 볼 상속이란것도 안됨). final은 그것만 알면 될것 같다. 그래서 보통 PI=3.1415 같은 절대 변할수 없는 변수를 지정할때 쓰거나 절대 변할수 없는 클래스 혹은 메서드에 사용을 한다.