JAVA(static variable) - 4

Object와 OOP(Object-Oriented Programming)

Fastcampus 강의, programmers 강의와 부족한 부분들을 검색하면서 공부할 예정이다.


Collaboration

협력?? Java에서 왜 저런 단어가 쓰일까? 라는 생각으로 강의를 들었다. 결론은 객체는 객체 본인만으로 표현하게 되면 한계가 존재하기 때문에 다른 객체와 함께 유기적으로 연동되어야 한다는 것.


java4_1

 사진출처 : 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 변수를 선언할 수 있다.


java4_2

사진출처 : fastcampus

위 그림은 변수가 저장되는 영역을 그림으로 나타낸 것이다. local variable, instance는 이미 배웠었다. static variable은 instance가 생성되기 전에 존재한다. 따라서 Data영역에 저장된다고 한다…

Q1) Data영역? Java는 JVM위에서 돌아가는거니깐 컴퓨터 구조에서 배운 data영역이랑 다르지 않을까??

A1) 해당 블로그를 보고 알게 되었다.

java4_3

사진 출처  

해당 블로그에서는 Runtime data area가 JVM이 프로그램을 수행하기 위해 OS로 부터 할당받는 메모리라고 했다. 따라서 Java memory structure는 Runtime Data Area이다.


java4_4

사진 출처

JVM의 전반적인 내용에 대해서는 나중에 한번에 다루도록 하고 이번에는 static 변수, local variable, instance가 생성되는 메모리 영역에 대해서 살펴보자.

따라서 static variable이 저장되는 곳은 OS가 관리하는 native memory 영역이다.


static method

마찬가지로 native memory에 loading이 된다.(근거) static method는 class가 loading되면서 native memory에 생성되기 때문에 마찬가지로 instance의 생성과 관계없다. 따라서 instance variable을 함수 안에서 쓸 수 없다. 왜냐하면 static method가 호출된 시점에 해당 instance variable이 존재하지 않을 수 있기 때문이다.