///////
Search

17_클래스 변수와 클래스 메소드_장서현

static 변수

static 변수의 용어 정리

static 변수 = 정적 변수 = 클래스 변수 = 공용 변수
static 변수의 특징
static 변수는 클래스 변수이다.
객체를 생성하지 않고도 static 자원에 접근이 가능하다.
Java에서 static 키워드를 사용한다는 것
= 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미

클래스 변수의 접근 방법

1.
클래스 내부 접근
static 변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능
2.
클래스 외부 접근
private으로 선언되지 않으면 클래스 외부에서도 접근 가능
접근 수준 지시자가 허용하는 범위에서 접근 가능
클래스 또는 인스턴스의 이름을 통해 접근
클래스 변수의 접근 예제

예제를 통해 배우는 static 변수

static 변수 예제
카드 예제
원의 넓이 구하기 예제

static 메서드

static 메서드와 메모리

static 메서드에 인스턴스 변수가 올 수 없는 이유?
class InstCnt { static int instNum = 0; //클래스 변수(static 변수) int num = 0; //인스턴스 변수 static public void print() { //static 메서드 instNum++; num++; //컴파일 오류 발생 } }
Java
복사
static 메서드는 객체 생성 없이 사용할 수 있기 때문에, static 메서드 내부에서 멤버 변수 또는 메서드를 사용할 수 없다.
static 메서드 호출 시점에 객체가 생성되지 않았을 수 있기 때문에 객체의 변수 및 메서드 접근을 허용하지 않는 것이다. 또한, 객체가 생성되어있다 하더라도 static 메서드에서 어떤 객체의 멤버 변수에 접근해야하는지 알 수 없기 때문이기도 하다.
따라서, static 메서드에서 멤버 변수나 메서드 접근 시, 위와 같은 컴파일 에러가 발생한다.
JVM 메모리 구조
1.
메서드 영역 (Method area)
프로그램 실행 중 어떤 클래스가 사용되면, JVM은 해당 클래스의 클래스 파일(.class)을 읽어 클래스에 대한 정보를 저장한다. Class Variable도 함께 저장하는데 그것은 Static Variable과 같다. ⇒ 어디서든 공유해 쓸 수 있는 변수를 의미
프로그램 실행 중 사용 되는 class 파일을 JVM이 읽어 클래스에 대한 정보를 저장
해당 클래스의 클래스 변수도 함께 저장
2.
호출 스택 (Call stack)
메서드의 작업에 필요한 메모리 공간을 할당한다. 메서드가 호출되면 스택에 호출된 메서드를 위한 메모리가 할당되고, 이 메모리는 메서드의 연산의 중간 결과, 지역 변수, 매개 변수 등을 저장하는데 사용한다. 그리고 메서드의 작업을 마치면 메모리 공간을 반환한다.
메서드 작업에 필요한 메모리 할당
매개 변수, 지역 변수, 연산의 중간 결과 등을 저장
메서드가 작업을 마치면 메모리 반환
3.
힙 영역 (Heap)
클래스의 인스턴스와 배열이 저장되는 공간이다. 프로그램 중 생성된 인스턴스는 모두 이곳에 저장되고 인스턴스 변수도 생성된다.
인스턴스가 생성되어 저장되는 메모리 영역
인스턴스 변수 포함

대표적인 static 변수와 메서드

System.out.println의 out과 println의 정체는?
java.lang.System.out.println(...);
System은 java.lang 패키지에 묶여 있는 클래스의 이름
그러나 컴파일러가 다음 문장을 삽입해 주므로 java.lang을 생략할 수 있다.
import java.lang.*;
System.out.println(...);
out은 클래스 System의 이름을 통해 접근하므로, 이는 System 클래스의 클래스 변수 이름임을 유추할 수 있다.
System.out.println(...);
println은 out이 참조하는 인스턴스의 메서드이다.
main 메서드가 public이고 static인 이유는?
public static void main(String[] args) {...}
static인 이유: 인스턴스 생성과 관계없이 제일 먼저 호출되는 메서드이기 때문이다.
public static void main(String[] args) {...}
public인 이유: main 메서드의 호출 명령은 외부로부터 시작되는 명령이다.
단순히 일종의 약속으로 이해해도 괜찮다.