JAVA(static) 클래스 변수와 인스턴스 변수

HyunHwa Cho·2022년 5월 20일
0

자바에는 클래스 변수 와 인스턴스 변수가 존재한다.

두가지 모두 클래스 안에 속하는 변수 이다.

차를 예를 들어보자.

차에는 다양한 속성이 있다. 문 개수,바퀴 개수, 브랜드 등등

이것을 코드로 나타내면

class Car {
int doors;  //문 개수  -> 인스턴스 변수
String brand; //브랜드 종류 -> 인스턴스 변수

static int wheels; //바퀴 개수 ->클래스 변수
}

이렇게 나타낼수 있다. 여기서 어떤것은 변수 앞에 static이 붙은게 있고 안 붙은것이 있다.

개별적인 속성을 가지는 것은 인스턴스 변수로 분류 하고 공통적인 속성을 가지는 변수는 클래스 변수에 분류한다.

차에서 문이 2개인것도 있고 4개인것도 있으니 인스턴스 변수로 static이 붙지않는다.
마찬가지로 여러브랜드의 차들이 있기때문에 동일하게 static이 붙지않는다.

하지만 모든 일반적인 차의 갯수는 4개이기때문에 static을 붙여줌으로써 클래스 변수로 선언 해 주는 것이다.

ps. 여기서 모든 차들은 4륜 자동차로 가정한다.

그리고 클래스변수는 클래스가 사용되어질때 바로 메모리에 올라가 사용할수 있지만 인스턴스 변수 같은경우에는 사용을 위해서 반드시 객체가 생성되어야 한다.

Car car = new car(); // 객체 생성.

그리고 클래스변수와 인스턴스 변수 사용 규칙(?) -> 관례 같은 것을 알아보자 위의 예시를 바탕으로

class Car {
int doors;  //문 개수  -> 인스턴스 변수
String brand; //브랜드 종류 -> 인스턴스 변수

static int wheels; //바퀴 개수 ->클래스 변수
}

Car car1 = new car();
car1.doors = 4;     //ok
car1.brand = "BMW"; //ok
car1. wheels = 4; // 가능은하나 권장하지 않음.

Car.wheels = 4; // ok (관례상으로 정석)

위와같이 인스턴스 변수는 생성된 객체를 사용하여 변수를 지정해주면 되지만 클래스 변수같

은 경우에는 객체보다는 클래스를 사용하여 변수를 사용하는 것이 좀더 올바르다고 볼수있다.



다음은 포커카드를 이용하여 코드를 작성하여 인스턴스 변수와 클래스 변수의 특징을 예제화 하였다. (유튜브 자바의정석-기초편 강의를 참조하여 직접 작성함)
public class Ex6_3 {
    public static void main(String[] args) {
        System.out.println("Card.width = " +Card.width);
        System.out.println("Card.height = " +Card.height);

        Card c1 = new Card();
        c1.kind = "Heart";
        c1.number = 7;

        System.out.println("c1카드의 종류는" + c1.kind + "이며 숫자는" 
        + c1.number + "입니다."+ " 그리고 카드의 넓이와 높이는" + Card.width+","+Card.height+"입니다.");

        Card c2 = new Card();
        c2.kind = "Spade";
        c2.number = 4;
        System.out.println("c2카드의 종류는" + c2.kind + "이며 숫자는" 
        + c2.number + "입니다."+ " 그리고 카드의 넓이와 높이는" + Card.width+","+Card.height+"입니다.");

        c1.width = 50;   //Card.width = 50; 이 올바른 표현
        c1.height = 100; //Card.height = 100; 이 올바른 표현
        
        /*width 와 height는 클래스변수로 객체인 c1.으로 사용 하였지만 
        아래의 결과값을 보면 c1과 c2 모두 width와 height 수치가 변화한 모습을 볼수있다. 
        이유는 width와 height는 static이 붙은 클래스 변수이기 때문이다.
        이 클래스 변수는 공통변수로 같은 클래스 내에서 공통적으로 적용된다. 
        그러므로 위의 내용과 같이 
        c1.width c1.height 보다 
        card.width card.height로 쓰여지는게 좀더 올바르다고 볼수잇다.*/
        

        System.out.println("c1카드의 종류는" + c1.kind + "이며 숫자는"
        + c1.number + "입니다."+ " 그리고 카드의 넓이와 높이는" + Card.width+","+Card.height+"입니다.");
        System.out.println("c2카드의 종류는" + c2.kind + "이며 숫자는" 
        + c2.number + "입니다."+ " 그리고 카드의 넓이와 높이는" + Card.width+","+Card.height+"입니다.");

    }
}

class Card{
    static int width = 100;
    static int height = 250;
    String kind;
    int number;
}

//결과값
//Card.width = 100
//Card.height = 250
//c1카드의 종류는Heart이며 숫자는7입니다. 그리고 카드의 넓이와 높이는100,250입니다.
//c2카드의 종류는Spade이며 숫자는4입니다. 그리고 카드의 넓이와 높이는100,250입니다.
//c1카드의 종류는Heart이며 숫자는7입니다. 그리고 카드의 넓이와 높이는50,100입니다.
//c2카드의 종류는Spade이며 숫자는4입니다. 그리고 카드의 넓이와 높이는50,100입니다.
profile
개발 공부 및 기록용 블로그 입니다.

0개의 댓글