JAVA/자바 기초

[JAVA]객체지향 프로그래밍(3)-변수와 메서드

다당근 2021. 10. 11. 16:30

📖이전글

객체지향 프로그래밍(1)-클래스와 객체,객체지향의의미,장단점

객체지향 프로그래밍(2)-객체와 인스턴스

 

 

목차

     

     

    변수의 종류에는 클래스변수, 인스턴스변수, 지역변수로 세 종류가 있다. 변수의 종류를 결정짓는 요소는 '변수의 선언된 위치'이므로 변수의 종류를 파악하기 위해서는 어느 영역에 선언되었는지를 확인해야한다. 변수 별로 올라가는 메모리 영역도 다르므로 함께 살펴보자.

     

    응용프로그램이 실행되면, JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다. 그 중 3가지 주요 영역은 Method Area, Call Stack, Heap 영역이 있다.

     

    JVN 메모리 영역

     

    1.  메서드 영역(Method Area) - 클래스

    프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(.class)를 읽고 분석해 메서드 영역에 저장한다. 클래스의 클래스변수도 이 영역에 함께 생성된다. 클래스 변수는 JVM이 종료될 때 까지 사라지지 않는다. 

    2. 호출 스택(Call Stack) - 메서드

    메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 실행되면 호출스택에 메모리가 할당되며, 지역변수들과 연산의 중간 결과 등을 저장하는데 사용된다. 그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반환되어 비워진다.

    3. 힙(Heap) - 객체

    인스턴스가 생성되는 공간이다. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉, 인스턴스 변수들이 생성되는 공간이다. 인스턴스 변수들은 가비지컬렉터라고 하는 힙 메모리 회수기에 의해 비워진다.

     

     

     

     

    변수의 종류

     

    1. 클래스 변수(class variable)

    인스턴스 변수 앞에 static 을 붙이기만 하면 클래스 변수를 선언할 수 있다. 클래스 변수는 모든 인스턴스가 공통된 저장공간을 공유하게 된다. 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우, 클래스변수로 선언해야 한다. 클래스변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고도 언제든지 사용할 수 있다. 클래스가 메모리에 로딩될 때 생성되어 프로그램이 종료될 때 까지 유지되고, public 을 앞에 붙이면 같은 프로그램 내에서 어디서나 접근할 수 있는 전역변수의 성격을 갖는다. 클래스 변수는 Method Area 에 생성이 된다. 

     

    2. 지역 변수(local variable)

    메서드 내에 선언되어 메서드 내에서만 사용 가능하다. 메서드가 종료되면 소멸되어 사용할 수 없다. for문 또는 while문의 블럭 내에 선언된 지역변수는 지역변수가 선언된 블럭{ } 내에서만 사용 가능하며 블럭을 벗어나면 소멸되어 사용할 수 없게 된다. 지역변수는 Call Stack 에 생성이 된다.

     

    3. 인스턴스 변수(instance variable)

    클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다. 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다. 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다. 인스턴스 변수는 Heap 에 생성이 된다.

     

    변수의 종류 선언 위치 메모리 생성 위치 생성 시기
    클래스 변수(=static 변수) 클래스 영역 Method Area 클래스가 메모리에 올라갈 때
    인스턴스 변수 Heap 인스턴스가 생성되었을 때
    지역 변수 클래스 영역 이외의 영역 Call Stack 변수 선언문이 수행되었을 때

     

     

    메서드의 종류

    메서드의 종류는 클래스 매서드(static 메서드)와 인스턴스 메서드로 나뉜다. 변수와 같이 static이 붙어있으면 클래스 메서드이고 그렇지 않으면 인스턴스 메서드이다.

    클래스 메서드도 역시 객체를 생성하지 않고도 '클래스이름.메서드이름(배개변수)'로 호출이 가능하다. 하지만 인스턴스메서드는 반드시 객체를 생성해야만 호출할 수 있다.

    • 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
    • 인스턴스와 관계 없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는) 메서드를 클래스 메서드(static메서드)로정의한다.
    • 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 경우 static을 붙인다.
    • 클래스변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
    • 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
    • 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

     


    참고

    자바의 정석-남궁성