Java - 기본기

17. 변수 선언위치에 따른 변수의 종류 : 클래스 변수 && 인스턴스 변수

TerianP 2021. 10. 26.
728x90

1. 선언 위치

  • 변수는 선언 위치에 따라 다음과 같이 2가지로 구분할 수 있다.
{
	int iv; // 인스턴스 변수
	static int cv; // 클래스 변수(static 변수, 공유 변수)

void method(){
		int lv = 0; // <= 메서드 영역, 지역 변수
	}
}
  • 클래스 영역 : 인스턴스 변수, 클래스 변수(static 변수, 공유 변수) ⇒ iv(인스턴스 변수) & cv(클래스 변수)
    • 클래스 영역에서 생성된 변수 중 인스턴스 변수는 객체가 생성될 때 생성되며, 클래스 변수(static) 는 클래스가 메모리에 올라갈 때 생성된다.
    • 클래스 변수는 자동으로 생성되며, 객체 생성을 따로 할 필요가 없다. 따라서 아무때나 사용 가능하다. 정확히는 사용을 위해서 객체 생성 후 참조변수를 거쳐 선언하거나 하는 것이 아닌, "클래스명.클래스변수명 = 값" 으로 선언 가능하다.
    • 선언문만 가능 → 클래스 영역에서는 변수 선언, 메서드 선언 등 '선언' 만 가능하다.
    • 변수 선언 시 순서는 상관 X
    • sysout.println 등 불가능
  • 메서드 영역 : 지역 변수 ⇒ lv
    • 메서드 영역에서의 지역 변수는 메서드가 종료되면 지역 변수도 메모리에서 내려감(메모리에서 제거됨)

 

2. 클래스 변수와 인스턴스 변수

  • 먼저 핵심만 짚고 넘어가자!
    • 클래스 변수 : 해당 클래스의 객체들이 갖는 공통 속성
    • 인스턴스 변수 : 해당 클래스의 객체들이 갖는 서로 다른 특성 ⇒ 개별 특성
  • 예를 들어서 롤이나 카오스, DOTA와 같은 AOS 게임을 만들려고 한다. 해당 게임에서 게임 캐릭터들의 공통된 특성과 개별 특성을 각각 클래스 변수와 인스턴스 변수로 나타내면 다음과 같이 표현 할 수 있다.
  • AOS 중에서 제가 가장 좋아하는 히오스로 설명을 한번 해보겠습니다.
    • 이 게임에서는 당연히 모든 영웅들의 이름이 서로 다릅니다 ⇒ 인스턴스 변수
    • 각 영웅들이 쓰는 스킬마다 데미지가 있는데 당연히 모두 서로 달라요! ⇒ 인스턴스 변수
    • 모든 영웅들은 공통적으로 5개의 스킬을 갖습니다(Q W E R 패시브) ⇒ 클래스 변수
    • 모든 영웅들이 공통적인 레벨을 갖진 않지만 서로 같은 팀의 5명은 같은 레벨을 갖습니다(일명 공산주의 게임) ⇒ 클래스 변수
class HOS{ // 가장 좋아하는 히오스로 만들겠습니다
	String name; // 모든 케릭터는 이름이 서로 다르다 => 인스턴스 변수
	int dmg; // 모든 캐릭터의 데미지는 서로 달라요! => 인스턴스 변수
	
	static int LV; // 히오스에서는 같은 팀은 모두 같은 레벨입니다ㅋㅋ => 클래스 변수
	static int skill_num; // 모든 캐릭터는 5개의 스킬을 갖습니다 => 클래스 변수
}
  • 이제 활용해서 코드로 짜보자
		HOS.game_name = "히오스 최고!"; // 클래스 변수는 객체 생성 없이 사용 가능
		System.out.println(HOS.game_name); 
		
		HOS hos1 = new HOS();
		hos1.name = "우서"; // 인스턴스 변수 설정
		hos1.dmg = 75; // 인스턴스 변수 설정
		
		System.out.println("나는 시공의 폭풍에서 온 "+hos1.name);
		System.out.println("나의 평타 데미지는 "+hos1.dmg);
		
		
		HOS hos2 = new HOS();
		hos2.name = "겐지";
		hos2.dmg = 44*3; // 평타가 3번!
		
		System.out.println("나는 시공의 폭풍에서 온 "+hos2.name);
		System.out.println("나의 평타 데미지는 "+hos2.dmg);
		
		
		System.out.println(hos1.name+" 와 "+hos2.name+" 가 있는 레드팀의 레벨은 "+HOS.LV);
		
		System.out.println("두 영웅은 모두 "+HOS.skill_num+" 개의 스킬을 갖습니다");
		
		HOS.LV = 10; // static 으로 정의된 클래스변수는 이렇게 '클래스명'.'변수명' 으로 정의함
		HOS.skill_num = 5; // 마찬가지로 '클래스명'.'변수명'
		
		System.out.println("히오스는 레벨 "+HOS.LV+ " 가 되면 스킬이 " + HOS.skill_num +"개가 됩니다");

 

  • 실제 출력해보면 아래처럼 나온다

요렇게 출력 됩니다!

오늘 공부의 요점은 딱 하나! 변수는 선언 위치에 따라 즉 클래스에 위치하는가 아니면 메서드 안에 위치하는가에 따라서 클래스 변수와 지역 변수로 나뉘며, 클래스 변수는 다시 인스턴스 변수(static가 없음) 와  클래스 변수(static 붙음)으로 나눌 수 있다.

이때 인스턴스 변수는 객체가 생성될 때 생성되며, 클래스 변수는 클래스가 메모리에 올라갈 때 생성된다.

댓글