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 붙음)으로 나눌 수 있다.
이때 인스턴스 변수는 객체가 생성될 때 생성되며, 클래스 변수는 클래스가 메모리에 올라갈 때 생성된다.
'Java - 기본기' 카테고리의 다른 글
19. 오버로딩, 생성자, 기본 생성자, 생성자 this(), 참조변수 this (0) | 2021.12.09 |
---|---|
18. 메소드 : 선언부와 구현부, 메서드 호출, return문, 반환값 (0) | 2021.10.26 |
16. 객체 배열, 클래스의 정의 (0) | 2021.10.22 |
15. 객체 지향 언어란? 클래스와 객체(활용편) : 클래스와 객체 활용한 게임 만들기 (0) | 2021.10.19 |
14. 객체 지향 언어란? 클래스와 객체(개념편) (0) | 2021.10.17 |
댓글