Programming/Java

[JAVA] 클래스 변수와 인스턴스 변수

Supreme_YS 2021. 10. 8. 16:18

남궁성님의 자바의 정석 강의를 기반으로 작성했습니다.


- 선언 위치

* 클래스 영역 : 인스턴스 변수, 클래스 변수

* 메서드 영역 : 지역 변수

 

- 클래스 변수 : 공통적인 사항

- 인스턴스 변수 : 개별적인 사항

예. 카드에서 공통적인 사항은 카드의 폭, 높이, 두께 등, 개별적인 사항은 카드의 문양, 숫자 등이 있습니다. 이를 코드화하면 아래와 같습니다.

Class Card {
	// 개별 속성 : 인스턴스 변수
    String kind; // 카드의 무늬
    int number; // 카드의 숫자
    
    // 공통 속성 : 클래스 변수
    static int width; // 폭
    static int height; // 높이
}

* 위 코드를 사용하는 방법

Card c = new Card(); // 객체를 생성
c.kind = "Heart";    // IV 객체 사용
c.number = 7;        // IV 객체 사용
c.width = 200;       // CV 객체 사용
c.height = 300;      // CV 객체 사용

위 코드에서 실행상의 문제는 없지만, 클래스 변수(CV)는 반드시 클래스 이름을 사용함으로써 객체를 사용해야 합니다. 클래스 변수는 모든 객체가 공유할 수 있는 전역적인(Static) 변수이기 때문이죠. 따라서, 위 코드를 정석으로 수정을 한다면 아래의 코드 블럭과 같습니다.

Card c = new Card();
c.kind = "Heart";
c.number = 7;
//CV 객체는 반드시 클래스 이름으로 객체를 사용해야 한다
Card.width = 200;
Card.height = 300;

아래 코드는 예제 코드입니다.

public class CvIv {
    public static void main(String args[]) {
        System.out.println("클래스 변수 입니다. 객체 생성없이 사용이 가능합니다.");
        System.out.println("Card.width = " + Card.width); // 클래스 변수는 객체 생성없이 사용이 가능하다.
        System.out.println("Card.height = " + Card.height);
        System.out.println("------------------------");

        System.out.println("인스턴스 변수 입니다. 객체를 반드시 생성해서 클래스의 멤버에 접근이 가능합니다.");
        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;
        System.out.println("------------------------");
        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
        System.out.println("c1의 width와 height를 각각 50, 80으로 변경합니다.");
        c1.width = 50;
        c1.height = 80;

        System.out.println("c1은 " + c1.kind + ", " + c1.number + "이며, 크기는 (" + c1.width + ", " + c1.height + ")");
        System.out.println("c2는 " + c2.kind + ", " + c2.number + "이며, 크기는 (" + c2.width + ", " + c2.height + ")");
        System.out.println("c2의 width와 height를 변경한 적 없지만 공통적으로 변경되어 있는 것을 알 수 있습니다.");
    }
}

class Card {
    String kind;             // 인스턴스 변수
    int number;              // 인스턴스 변수
    static int width = 100;  // 클래스 변수
    static int height = 250; // 클래스 변수
}

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

[JAVA] return문, return, 리턴문, 호출스택  (0) 2021.10.09
[JAVA] 자바의 메서드(Method)  (0) 2021.10.08
[JAVA] 자바의 클래스  (0) 2021.10.08
[JAVA] 자바의 객체지향  (0) 2021.10.08
[JAVA] 자바의 정석  (0) 2021.10.05