[객체 지향 프로그래밍] 변수와 메서드

sy·2023년 7월 1일
0

변수의 종류

  1. 클래스 변수
  2. 인스턴스 변수
  3. 지역 변수

멤버 변수를 제외한 나머지 변수들을 모두 지역 변수이고 멤버 변수 중 static이 붙으면 클래스 변수, 붙지 않으면 인스턴스 변수

변수의 종류 선언 위치 생성 시기 특징
class variable 클래스 영역 클래스가 메모리에 올라갈 때 static을 붙임, 공통된 저장공간(변수) 공유
instance variable 클래스 영역 인스턴스가 생성되었을 때 독립적인 저장공간을 가짐
local variable 클래스 영역 이외의 영역
(메서드, 생성자, 초기화 블럭 내부)
변수 선언문이 수행되었을 때 메서드 내에 선언되어 메서드 내에서만 사용

인스턴스 변수는 인스턴스가 생성될 때 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장 공간을 공유하므로 항상 공통된 값을 가진다.

메서드 (method)

특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것

메서드를 사용하는 이유

1. 높은 재사용성(resuability)
한 번 만들어 놓은 메서드는 몇 번이고 호출할 수 있다. 예) Math.sqrt(), System.out.println()
2. 중복된 코드의 제거
반복되는 코드들을 묶어서 하나의 메서드에 작성할 수 있다.
3. 프로그램 구조화
작업단위를 나눠서 여러 개의 메서드에 담아 프로그램의 구조를 단순화 시킨다.

메서드의 선언과 구현

int add(int a, int b) { // 선언부
	// 구현부
	int result = a + b;
    return result;
}

int: 반환 타입 add: 메서드 이름 (int a, int b): 매개변수 선언

JVM의 메모리 구조

이전에 JVM에 대해 작성한 글
JVM 메모리 구조 자세히 보기

  1. 메서드 영역 (method area)
    프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장한다. 그 클래스의 클래스 변수도 이 영역에 함께 생성된다.
  2. 힙 (heap)
    인스턴스가 생성되는 공간. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 인스턴스 변수들이 생성되는 공간
  3. 호출 스택 (call stack 또는 execution stack)
    호출 스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면, 호출 스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을 수행하는 동안 지역변수들과 연산의 중간결과 등을 저장하는데 사용된다. 메서드가 작업을 마치면 할당되었던 메모리 공간은 반환 되어 비워진다.


특징
-메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당 받는다.
-메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다.
-호출스택의 가장 위에 있는 메서드가 현재 실행 중인 메서드이다.
-아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

클래스 메서드(static 메서드)와 인스턴스 메서드

  1. 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
    생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값을 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 한다.
  2. 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
    static이 붙은 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문이다.
  3. 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
    인스턴스 변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데 클래스 메서드는 인스턴스 생성 없이 호출 가능하므로 클래스 메서드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있다. 그래서 클래스 메서드는 인스턴스 변수의 사용을 금지한다. 반면에 인스턴스 변수나 인스턴스 메서드는 static이 붙은 멤버들을 사용하는 것이 언제나 가능하다. 인스턴스 변수가 존재한다는 것은 static 변수가 이미 메모리에 존재한다는 것을 의미하기 때문이다.

0개의 댓글