본문 바로가기
  • 시 쓰는 개발자
프로그래밍 문법/Java

6장 객체지향 (2) 클래스변수 , 인스턴스변수

by poetDeveloper 2024. 3. 10.

JAVA의 정석 강의를 들으며 공부하며 정리했습니다. 너무 자잘한 내용은 안적었습니다.

 

[자바의 정석 - 기초편] ch6-11 선언위치 변수종류

<영역의 구분>

영역은 클래스 영역과 메소드 영역으로 나뉜다. 클래스 영역에는 선언문만 가능하다. 프린트문 같은 것들은 불가능하다.

 

<변수의 구분>

1. 인스턴스 변수(iv) : 클래스 영역에 선언된 변수. 인스턴스 변수를 묶어놓은 것이 객체이다.

2. 클래스 변수(cv) : 클래스 영역에 선언된 변수. 인스턴스 변수에 static을 붙이면 클래스 변수가 된다.

3. 지역변수(lv) : 메소드 영역에 선언된 변수

변수의 종류 선언 위치 생성 시기
클래스 변수(cv)
(static이 붙은 인스턴스 변수)
클래스 영역 클래스가 메모리에 올라갈 때
인스턴스 변수(iv) 인스턴스가 생성됐을 때
지역 변수(lv) 클래스 영역 이외의 영역
(메소드, 생성자, 초기화 블록 내부)
변수 선언문이 수행됐을 때

[자바의 정석 - 기초편] ch6-12, 13 클래스변수 인스턴스변수

예를 들어 포커카드가 있다고 하자.

포커 카드는 카드별로 서로 다른 무늬와 숫자를 가지지만, 카드 자체의 가로 세로 길이는 모두 동일해야 한다. 이처럼 개별적인 속성이 인스턴스 변수(iv), 공통 속성이 클래스 변수(cv)가 된다. 이를 다음과 같이 나타낼 수 있다.

class Card {
    String kind; // 무늬
    int number; // 숫자

    // 공통적으로 유지되어야 하는 속성은 static을 붙여서 써준다.
    // 클래스 선언할 때 바로 초기화 되는 값이다. 그래서 객체생성 없이도 Card.width처럼 바로 사용할 수 있는 값이다.
    static int width = 100; // 가로 폭
    static int height = 200; // 세로 높이
}

 

ivcv를 설정하는 코드는 다음과 같다.

Card c = new Card(); // 객체 하나 생성

// iv 설정하기
c.kind = “HEART”;
c.number = 5;

// cv 설정하는 방법 (1), 에러는 안 나지만 iv를 설정하는 것으로 오해할 수 있기 때문에 권장하지 않는다.
c.width = 200;
c.height = 300;

// cv 설정하는 방법 (2), cv를 설정할 때는 클래스 이름으로 직접 설정해준다.
Card.width = 200;
Card.height = 300;

당연히 iv는 객체마다 만들어지지만 cv는 객체마다 할당되는 게 아니고 다른 공간에 하나만 만들어진다. 만약 객체마다 cv값을 따로 가지게 되면 다음과 같은 두 가지 문제가 있다.

  1. cv는 서로 같은 값을 공유하고 있어야 하는데 한쪽에서 실수로 수정하면, 여기는 값이 100인데 저기는 200이 되어버리는 사고가 발생한다. 즉 항상 똑같은 값을 유지하기가 쉽지 않다.
  2. 카드 크기처럼 서로 같은 값을 서로 다른 객체에서 별도의 메모리공간으로 가지고 있으면 메모리 낭비가 발생한다.