[Java] 클래스 변수의 개념과 예제

클래스 변수

- 클래스 내에서 선언된 변수
- 개별적이고 독립적으로 값이 생성/저장되는 인스턴스 변수와 달리, 모든 영역에서
  값을 공유하는 변수
- 인스턴스마다 값을 개별적으로 관리할 필요가 없고, 공용하고 싶을 때 사용한다.

1) 클래스 변수의 예제


public class Test01_1 {

   static class Student {
    static String name;
    static int age;
    static boolean working;
  }
 


위 예제에서 아래 부분이 클래스 변수를 생성하는 명령어이다.

 

static String name;

static int age;
static boolean working;


문법


- 변수 선언 앞에 static을 붙인다.

- 클래스를 사용하는 시점에 생성된다.

 

* 클래스를 사용하는 시점이란? 

 1) new 명령으로 사용하여 인스턴스를 생성할 때

 2) 클래스 변수를 사용하려 할 때

 3) 클래스 메서드를 사용하려 할 때


(위에서 언급한 세가지 경우에 해당 클래스의 파일을 찾아 메모리에 로딩한다. 

즉 ***.class 파일을 메모리의 "Method Area" 영역으로 읽어들인다.

우리는 이것을 "클래스를 로딩한다"라고 표현한다.)




2) 클래스 변수 생성 및 호출 코드



public static void main(String[] args) {
    Student s = new Student(); // 클래스 변수 생성
    s.name = "홍길동"; // 클래스 변수에 "홍길동" 값 저장
    System.out.println(s.name);  // 출력

}







블로그 이미지

필로그래머

,

[Java] 인스턴스 변수의 개념과 예제


인스턴스 변수


- new 명령을 통해 생성하는 변수이다.

- 인스턴스는 값을 개별적으로 구분해서 관리할 필요가 있을 때 사용한다.

- 클래스가 로딩될 때 생성되지 않는다.

- 인스턴스 주소를 통해 접근 가능하다.

- 인스턴스 주소를 잃어버리면 해당 변수는 사용할 수 없게 된다.

- 변수 선언에 static을 붙이지 않는다.


인스턴스 변수는 기본 값으로 0을 갖는다.



1) class Student 코드


static class Student {

    // 인스턴스 변수는 기본 값으로 0을 갖는다.
    // 주소 변수 : null
    // 정수 변수(byte, short, int, long, char) : 0
    // 부동소수점 변수(float, double) : 0.0
    // 논리 변수(boolean) : false
    //  => 사실 null이나 false, 0.0 모두 메모리가 0으로 셋팅된다는 것을 의미한다.
     String name;
     int age;
     boolean working;

  }


* 주의! 

많은 사람들이 오해하는 게 있다. 위 클래스에서 선언된 String name 'name'은 

인스턴스 변수가 아니다. 그 어떤 변수도 아니다. name 이라는 이름을 가진 String

타입의 메모리를 만들라는 '명령어'일 뿐이다. 인스턴스 변수 인스턴스가 생성된

후, '메모리에 실제로 저장되는 변수' 값이다.




2) 인스턴스 호출 및 출력 코드


public static void main(String[] args) {

    // 인스턴스 변수 사용법:
    // 인스턴스의주소.변수명
    Student s1 = new Student(); // new Student() -> 인스턴스 생성!
    Student s2 = new Student();
   
    System.out.println(s1.name); 
// 항상 로컬 변수는 값을 설정한 다음에 사용해야 한다.
    System.out.println(s1.age);
    System.out.println(s1.working);
    System.out.println("-------------------------");
   
    s1.name = "홍길동";
    s1.age = 20;
    s1.working = true;
    System.out.println(s1.name);
    System.out.println(s1.age);

    System.out.println(s1.working);


* s2 값은 s1 값과 전혀 관계가 없다.



블로그 이미지

필로그래머

,

[Java] 클래스 로딩과 메모리 영역 (stack, heap, method area)


클래스 로딩


1. 클래스를 사용하는 시점에 해당 클래스의 바이트코드가 들어 있는 파일을 찾는다.

2. 찾은 파일은 메모리에 로딩된다.

   클래스의 바이트 코드는 "Method Area" 영역에 로딩된다. 


JVM이 관리하는 주요 메모리 영역


 1) Stack (스택)

메서드가 호출될 때마다 그 메서드의 로컬 변수를 준비하는 메모리 영역

메서드 호출이 끝나면 그 메서드를 위해 준비했던 모든 변수가 스택에서 제거된다.


 2) Heap (힙)

new 명령을 통해 생성된 인스턴스 변수가 놓이는 메모리 영역

가비지 컬렉터에 의해 관린된다.

가비지 컬렉터가 메모리를 해제하기 전까진 계속 유지된다.


 3) Method Area (메서드 영역)

클래스의 코드가 로딩되는 메모리 영역

메서드 코드가 이 영역에 존재한다. 


* JVM이 종료되면 JVM이 사용한 모든 메모리는 OS에 자동으로 반납된다.

  - OS의 메모리 관리 정책에 따라 프로세스가 종료되면 그 프로세스가 사용한 모든 

    메모리를 강제로 해제시킨다.

블로그 이미지

필로그래머

,

[Java] 생성자(constructor)


생성자(constructor)




class Student3 {
  String name;
  int[] scores = new int[3];
  int total;
  float aver;
 
 public Student3(String name, int kor, int eng, int math) { // 생성자
    this.name = name;
    this.scores[0] = kor;
    this.scores[1] = eng;
    this.scores[2] = math;
  }
  public void compute() {
    this.total = this.scores[0] + this.scores[1] + this.scores[2];
    this.aver = this.total / 3f;
  }
 
  public void print() {
    System.out.printf("%s, %d, %d, %d, %d, %f \n",
        this.name, this.scores[0], this.scores[1], this.scores[2],            this.total, this.aver);
  } 

}


위 예제를 보면 class Student3 안에 public Student3(..){..}라는 메서드가 있는 것을 

알 수 있다. 이 메서드는 new Student3(..) 명령어를 써주었을 때 인스턴스가 생성됨과

동시에 호출이 된다. 이런 메서드를 "생성자"라고 한다. 이 메서드 안에 있는 this는 

생성된 인스턴스의 주소 값을 가리키며 name과 scores[] 값을 초기화시키고 있는데,

 

1) 생성자(메서드)의 이름은 반드시 클래스 이름과 같아야 하고

2) 보통 인스턴스 변수의 값을 초기화시키는 코드를 써주는 게 일반적이다.

3) 리턴 타입을 선언하지 않는다.


* main()에서 class Student3 안에 compute() 메서드를 호출시키는 코드


Student3 s = new Student("홍길동", 100, 100, 100); 

// 생성자(메서드) 호출, 값 초기화


s.compute(); 

// 인스턴스의 주소 값이 저장된 s에서 compute()라는 메서드를 찾아 실행한다.


블로그 이미지

필로그래머

,