on
JAVA(static variable) - 4
Object와 OOP(Object-Oriented Programming)
Fastcampus 강의, programmers 강의와 부족한 부분들을 검색하면서 공부할 예정이다.
Collaboration
- OOP에서는 객체간의 협력이 이뤄진다.
- 협력을 위해서는 필요한 메세지를 전송하고 이를 처리하는 기능이 구현되어야 한다.
- argument로 객체 자체가 전달되는 경우가 발생.
협력?? Java에서 왜 저런 단어가 쓰일까? 라는 생각으로 강의를 들었다. 결론은 객체는 객체 본인만으로 표현하게 되면 한계가 존재하기 때문에 다른 객체와 함께 유기적으로 연동되어야 한다는 것.
사진출처 : fastcampus
위와 같은 상황을 Java로 구현하려 해봤는데 생각보다 쉽게 되지가 않았었다… 처음에 학생, 버스, 지하철 class file 3개만 만들어놓고 instance variable은 설정했으나 method를 어떻게 처리해야할지 감이 안잡혔었다.
헷갈린 부분
버스를 탄다
라는 행위를 어떻게 구현해야할지 몰랐다. 학생 입장에서는 “버스를 탄다” 이고, 버스 입장에서는 “승객을 한명 태웠다” 이건데 이걸 코드로 어떻게 구현해야할지 감이 안잡혔던 것이다.
// Student.java 의 method
void takeBus() {
}
거짓말 안하고 위 코드에서 멈췄었다… 도대체 학생의 돈은 Bus class의 method에서 처리해야 하는건지 100번 버스에서 이 사람을 어떻게 태워야 하는건지…결국 예시 코드를 좀 봐버렸다…
// fastcampus에서 제공한 예시 코드
public void takeBus(Bus bus) {
bus.take(1000);
this.money -= 1000;
}
아.. Bus class를 argument로 줄 수 있다는 말을 5분전에 들었음에도 아무것도 안하고 있었던 것이다. 이와 같이 2개의 객체가 서로 메세지를 주고받으면서 collaboration이 이뤄지는 것이었다.
예시코드를 따라하기 싫어서 위의 method만 좀 보고 감을 잡았기에 나머지는 내 마음대로 코드를 만들어서 실행했다. 해당 링크로 가면 코드를 볼 수 있다. 나름 기능도 좀 더 추가하면서 다르게 만들었지만 너무 기초라서 따로 코드를 포스팅하지는 않았다.
static
static variable
같은 class에서 생성된 instance들이 공유하는 variable이다.
공통으로 사용할 변수가 필요할 때 사용한다.
static variable in Memory(JVM)
static int serialNum = 1000; // static variable declaration
위와 같이 static 변수를 선언할 수 있다.
- instance가 생성될 때 만들어지는 변수가 아니다. 처음에 프로그램이 메모리에 loading될 때 Data영역에 할당된다. 따라서 프로그램이 끝날 때(unloading) 사라진다.
- class variable, static variable라고 한다. ← 내 블로그 포스팅 Java2에서 용어정리를 하다가 알게 됐다.
- instance생성과 상관없이 사용이 가능하다. 보통 class이름으로 직접 참조한다.
사진출처 : fastcampus
위 그림은 변수가 저장되는 영역을 그림으로 나타낸 것이다. local variable, instance는 이미 배웠었다. static variable은 instance가 생성되기 전에 존재한다. 따라서 Data영역에 저장된다고 한다…
Q1) Data영역? Java는 JVM위에서 돌아가는거니깐 컴퓨터 구조에서 배운 data영역이랑 다르지 않을까??
A1) 해당 블로그를 보고 알게 되었다.
해당 블로그에서는 Runtime data area가 JVM이 프로그램을 수행하기 위해 OS로 부터 할당받는 메모리라고 했다. 따라서 Java memory structure는 Runtime Data Area
이다.
JVM의 전반적인 내용에 대해서는 나중에 한번에 다루도록 하고 이번에는 static 변수, local variable, instance가 생성되는 메모리 영역에 대해서 살펴보자.
JVM Stack
: Thread의 Method가 호출될 때 수행 정보(method 호출 주소, argument, local variable, 연산 스택)가 Frame 이라는 단위로 JVM stack에 저장된다. 그리고 Method 호출이 종료될 때 stack에서 제거된다.Heap
: instance와 배열이 동적으로 생기는 공간.Method Area
: Class Loader가 적재한 클래스(또는 인터페이스)에 대한 메타데이터 정보가 저장. class variable이 저장된다. 사실metaspace
는 JVM memory가 아니고 native memory라고 한다.(근거1, 근거2)
따라서 static variable이 저장되는 곳은 OS가 관리하는 native memory 영역이다.
static method
마찬가지로 native memory
에 loading이 된다.(근거) static method는 class가 loading되면서 native memory에 생성되기 때문에 마찬가지로 instance의 생성과 관계없다. 따라서 instance variable을 함수 안에서 쓸 수 없다. 왜냐하면 static method가 호출된 시점에 해당 instance variable이 존재하지 않을 수 있기 때문이다.