클래스 변수에 붙게 되는 static에 대해 조금 더 언급하고자 합니다. 사실 저도 static이라고 하면 클래스 변수와 인스턴스 변수를 구분하는 용도? 정도로만 알고 있었는데 메모리라는 측면에서 큰 차이가 있다는 것을 알게 되었습니다.
그중 static 이 들어간 클래스의 메서드와 변수의 경우 new 명령어를 쓰지 않고 바로 클래스명.변수 또는 클래스명.매서드를 쓸 수 있다는 것은 다 알고 있을 것입니다.
반대로 static 이 들어가지 않은 클래스의 메서드나 변수의 경우 반드시 new를 통해 객체를 생성한 후 해당 클래스의 변수나 메서드를 쓸 수 있었습니다.
이 클래스는 클래스 변수 a, b와 인스턴스 c, d를 가지고 있고 complie 시 클래스 변수 a 값이 5가 되고 다시 ++a를 통해 6이 되고 a의 값을 클래스 변수 b가 참조해 a = 6, b = 6 이 됩니다.
그렇다면 인스턴스 변수 c, d는 값을 초기화하지 않았으니 0 이겠다 라고 생각할 수 있습니다. 하지만 사실은 둘 다 0 이 아니라 아직 존재하지 않습니다. 둘은 객체가 생성되어야 값이 초기화되고 메모리에 올라갑니다. 즉 객체를 생성하기 전까지 int c, d는 어디에도 존재하지 않고 객체가 만들어진 순간 c, d가 어딘가 존재하게 됩니다.
객체를 하나 생성하겠습니다.
드디어 c, d 가 메모리 어딘가 존재하는 실체가 되고 그 값이 6, 0으로 초기화되었습니다.
이제 이 int a, b, c, d 그리고 method1, method2의 차이를 보겠습니다.
아까 설명했듯이 complie 하게 될 때 메모리에 올라가는 static 놈들은 new를 통해 객체를 생성하지 않아도 main에서 바로 사용할 수 있습니다.
complie 하니 결괏값이 출력됩니다.
그런데 말이죠!
인스턴스 변수들을 클래스 변수처럼 쓰려하니 빨간 줄이 생깁니다. 왜 그런 것일까요?
int a, b의 값이 6이고 int c, d의 값은 0 일 것이다. 왜냐하면 인트형의 변수가 초기화되지 않으면 디폴트 값은 0이니깐 이라고 생각할 수 있지만 조금 전 언급했듯이 int c, d는 아직 존재하지 않습니다. 그래서 값이 0 이 아니라 그냥 c, d 자체가 메모리에 없습니다 라고 했습니다.
그래서 new를 통해 객체를 생성해 int c, d를 존재하게 만들겠습니다.
p1이라는 객체를 생성하고 클래스 변수처럼 클래스명. 이 아닌 객체명. 으로 인스턴스 변수와 인스턴스 메서드를 사용할 수 있게 되었습니다.
정리하자면 static 이 붙은 이른바 클래스 XX이라는 녀석들은 complie을 한번 했을 때 바로 메모리에 할당되어 존재하게 됩니다. 그래서 클래스 XX를 쓸 때 new 연산자를 통해 객체를 만들어 줄 필요가 없는 것입니다. 반면에 인스턴스 XX 은 complie 되더라도 new 연산자를 통해 객체를 생성하지 않는 한 메모리에 할당되지 않은 존재하지 않는 것입니다. 그래서 이 변수, 메서드를 활용하기 위해서는 객체를 생성해 메모리에 할당하게 해 존재하는 것으로 만들어야 하는 것입니다.
이상 왜 클래스 static 은 new 연산자가 필요 없는지 왜 인스턴스는 new 연산자가 필요한지 알아보았습니다.
'자바' 카테고리의 다른 글
예외처리 (0) | 2020.01.02 |
---|---|
생성자, Constructor (0) | 2019.11.15 |
자바 클래스? 객체지향? (0) | 2019.11.08 |
자바 클래스 초기화 블럭 (0) | 2019.11.01 |
자바 변수의 초기화, 초기화 블럭 (0) | 2019.11.01 |