클래스변수(cv)와 인스턴스변수(iv)

Kwangmo Yang·2022년 7월 25일
0

JAVA

목록 보기
2/6
post-thumbnail

네이버 블로그에도 한번 다룬 내용이였는데 살짝 까먹어서 복습해보자

클래스 변수는 인스턴스 변수에 static만 붙여준다.
인스턴스 변수는 객체 각각 고유한 값을 가지지만
클래스 변수는 모든 인스턴스가 공통된 값을 공유하게 됨

아래의 클래스를 보자

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

클래스 변수는 앞에다가 static만 붙혀주면 된다.

고정된 이란 뜻이란다. 그러니까 클래스변수는 모든 인스턴스가 공통된 값을 공유하게 된다. (뜻 모르면 창피해하지말고 번역기를 돌려보자 더 암기가 잘 된다) 코드를 하나씩 살펴보자

System.out.println("카드 높이 : "+Card.width);
System.out.println("카드 넓이 : "+Card.height);

결과값

예상했던 결과이다.
Card 클래스에 선언된 클래스 변수를 그대로 불러왔다.

다음코드는 Card 클래스를 통해 만든 인스턴스 객체를
활용해 실습해보겠다.

Card user = new Card();
Card com = new Card();
user.kind = "spade";
user.number = 3;
System.out.println("user의 카드종류는 " + user.kind + ", " + user.number + "이며, 
크기는 (" + user.width + ", " + user.height + ")");
com.kind = "dia";
com.number = 10;
System.out.println("com의 카드종류는 " + com.kind + ", " + com.number + "이며, 
크기는 (" + com.width + ", " + com.height + ")");

각 user, com 인스턴스 객체를 생성하고 인스턴스 변수에 각각
값을 넣어주었다.

출력결과는 역시 내가 원하는대로 출력이 되지만 실제 자바에서 코드를 보면 아래와 같이 뭔가 찝찝한 노란줄이 쳐있다.

파파고를 돌려보면

이렇게 어렵게 말하는데 간단히 보면,
정적(static) 필드인 클래스 변수는(cv) 정적(static)인 방법으로 접근 하라는 이야기다.

(본인 머릿속)
정적 = static = 고정된
아 그니까 너가 입력한 코드도 정상적으로 출력되긴 하지만
클래스변수는 고정된 값이기 때문에 너는 정상적인 접근 방법으로
클래스변수를 호출해야할 필요가 있어!
이말이다.

Card.width //올바른
Card.height //올바른

com.width // 동작은 되나 좋지 않은 접근 방법
com.height// 동작은 되나 좋지 않은 접근 방법


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

근데 왜 좋지 않은 접근 방법인가요?

user.width = 10;
user.height = 30;
System.out.println("com의 카드종류는 " + com.kind + ", " + com.number + "이며,"
+ " 크기는 (" + com.width + ", " + com.height + ")");

//결과값 : com의 카드종류는 dia, 10이며, 크기는 (10, 30)

위 코드를 잘 확인해보자 .
분명 user 라는 인스턴스 객체에만 높이와 넓이를 재할당 했는데
전혀 다른 객체주소인 com의 높이 넓이가 10,30이 출력된다.

이해 될라나... 아무튼 높이와 넓이는 클래스 메서드 이기 때문에
user 인스턴스 객체에만 높이,넓이 값을 재할당 해줘도 com에도 재할당 되는거임.

근데 애초에 class 변수를 사용하는데 메인메서드에서
user.width 이런식으로 사용을 하는게 잘못된거다.
어차피 공통속성을 가지고 있기때문에 클래스 변수를 준거니까

그냥 메인메서드에서 클래스변수를 호출할때는 내가 정한 인스턴스객체 이름이 아닌 클래스 명으로 쓰도록 하자.

이상

profile
국비교육중 22.04.26~

0개의 댓글