21일차 - 2023.1.25

문우림·2023년 1월 25일
0

Java

목록 보기
7/23

1. 클래스 메소드

클래스 메소드의 정의와 호출

class NumberPrinter {
	private int myNum = 0; // 객체를 생성할 때 메모리에 올라감(new할 때)
    
	static void showInt(int n) { // 스캔할 때 메모리에 올라감System.out.println(myNum); 
// private int myNum = 0;가 메모리에 올라가기 전에 static이 먼저 올라가기 때문에, 메모리에 안올라간 인스턴스 변수는 찾을 수가 없다.
		System.out.println(n);
	}
	static void showDouble(double n) {
		System.out.println(n);
	}
	void setMyNumber(int n) {
		myNum = n;
	}
	void showMyNumber() {
		showInt(myNum); // 내부 접근
		System.out.println(myNum);
		// 객체 생성할 때 메모리에 올라가기 때문에 가능
	}
}

public class ClassMethod {

	public static void main(String[] args) { 
    // NumberPrinter를 먼저 스캔한다. 스캔할 때 static이 메모리에 올라간다.

		NumberPrinter.showInt(20); // 외부 접근/클래스 이름으로 접근
		System.out.println();
		NumberPrinter np = new NumberPrinter();
		np.showDouble(3.15); // 외부 접근/객체로 접근 가능
		np.setMyNumber(75);
		np.showMyNumber();

	}

}
  • static 선언을 하면, 함수든 변수든 클래스명으로 접근 가능. 객체로도 접근 가능.
  • static으로 선언하면, 갹체 생성 안하고 클래스 명으로 기능 접근 가능 = 메모리 절약

클래스 메소드로 정의하는 것이 옳은 경우

  • 굳이 인스턴스가 값을 항상 유지하고 있을 필요가 없을 때.
  • 인스턴스 변수와 관련 지을 이유가 없고, 단순 기능 제공이 목적인 메소드.

3. static함수에 인스턴스 변수가 올수 없는 이유

메모리 올라가는 순서가 다르기 때문이다.

  • 인스턴스 변수 = 객체 생성시(new) 메모리에 올라간다.
  • static 변수 = 객체 생성 없이 바로 바로 메모리에 올라간다. 스캔할 때(인스턴스보다 빨리)

그러하므로, 메모리 할당이 안된 인스턴스 변수를 static함수에서 사용할 수 없다.
⚠️static변수를 컨트롤 할 수 있는 것은 static함수!

3-1. static함수에 인스턴스 변수가 올수 없는 예제

class AAA {
	int num = 0;
	static void addNum(int n) {
		num += n; //에러
	} //static함수가 먼저 메모리에 올라가기 때문에
}

4. 인스턴스 함수안에 static의 변수와 함수가 올수 있는 이유

인스턴스보다 static이 메모리에 먼저 올라가기 때문에 둘 다 호출할 수 있다.

static은 스캔하면 바로 메모리에 올라가지만, 인스턴스 변수/함수는 객체 생성시 메모리 공간이 할당된다.

5. 자바(JVM)의 메모리 영역(3가지)

메소드 영역(method area)

  • 클래스에 대한정보와 함께 클래스 변수가 저장되는 영역
  • 해당 클래스의 클래스 파일(.class)를 스캔해서, 해당 클래스에 대한 정보를 메소드 영역에 저장

힙 영역(heap)

  • 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역
  • new키워드를 사용해서 인스턴스가 생성되면, 해당 인스턴스 정보를 힙영역에 저장

스택 영역(stack)

  • 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임에 저장되는 영역
  • 메소드의 호출과 관계되는 지역 변수와 매개 변수를 스택 영역에 저장
  • 스택 영역은 메소드의 호출과 함께 할당되며, 메소드의 호출이 완료되면 소멸

스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임(stack frame)

0개의 댓글