# static 키워드와 클래스 변수
---
<div class="embed-responsive embed-responsive-16by9">
<iframe src="https://www.youtube.com/embed/HOVuJXJXKF4" frameborder="0" allowfullscreen></iframe>
</div>
## static 키워드
이번시간에는 여지껏 무엇인지도 모르고 무작정 따라 사용했던 static 키워드! 이제는 그 베일을 벗겨보겠습니다. **static**은 "정적인" 이라는 뜻을 가진 키워드입니다. 클래스의 관점에서 **static**키워드는 필드와 메소드에 사용할 수 있습니다.
## 클래스 변수와 인스턴스 변수
클래스의 필드에 static을 선언하면 이 변수는 **클래스 변수**가 됩니다. 클래스 변수란 해당 클래스로부터 생성된 모든 객체들이 `공유하는 변수`입니다. 반대로 클래스의 필드에 static이 없는 변수는 인스턴스변수라 부릅니다. 인스턴스 변수는 하나의 객체가 같는 고유한 속성을 저장하는 변수 입니다. 아래 소스코드는 클래스 변수를 통해 전체 학생 수를 카운팅 하고, 만들어진 순서에 따라 id 값을 부여하는 예제코드 입니다.
```
public class Student {
// 클래스(공유) 변수
static int count = 0;
// 인스턴스(멤버) 변수
int id;
String name;
// 생성자
Student(String name) {
count++;
id = count;
this.name = name;
}
public static void main(String[] args) {
Student a = new Student("Tom");
Student b = new Student("John");
Student c = new Student("Kate");
System.out.println("전체 학생수: " + Student.count);
}
}
```
위 코드는 객체를 생성할 때마다, 생성자에서 클래스 변수인 count를 증가시켜주고있습니다. 따라서 출력결과는 다음과 같습니다.
```
전체 학생수: 3
```
## static 메소드
static 선언이 된 메소드는 객체의 생성없이 수행될 수 있습니다. 우리가 사용해 왔던 `Math.random()` 메소드가 대표적인 static 메소드의 예입니다.
반대로 일반 메소드는 객체를 통해서만 실행 될 수 있습니다.
```
// 객체생성
Hero h = new Hero();
// h에 연결된 객체에게 punch() 메소드를 수행시킴
h.punch();
```
---
## 확인하기
1. 클래스 변수란?
2. 인스턴스 변수란?
3. static 메소드의 특징은?