[Java] JVM 메모리 구조, 오버로딩, 패키지

클라우드·2024년 4월 2일
0

Java

목록 보기
4/20
post-thumbnail

4. JVM의 메모리 구조

  • register : 프로그램의 실행 포인터를 저장하고 관리한다. 신경 쓸 필요가 없다.
  • Runtime Constant Pool : 상수들을 위한 저장 공간. 역시 신경 쓸 필요가 없다.
  • Method Area
    • 클래스 자체에 대한 정보가 들어가 있는 공간.
    • 당연히 클래스 안에 정의된 method에 대한 실행 코드도 여기 존재한다.
    • 해당 클래스가 사용될 때 한번 동적으로 클래스에 대한 정보가 올라간다.
    • 클래스가 처음 사용되는 시점 딱 1번 해당 정보가 메모리에 올라간다.
  • Heap
    • instance의 생성되는 메모리 공간.
    • instance variable의 공간이 생성된다.
    • 또한, method의 실행 포인터를 들고 있다.
  • Call Stack(일반적으로 stack이라고 함)
    • 스택은 메소드가 호출되면 stack 영역에 해당 메소드를 위한 공간이 생성된다.
    • 지역 변수가 이 공간 안에 있다.
    • 당연히 method의 수행이 끝나면 해당 영역은 pop되어서 없어지고 안에 있는 지역변수 역시 공간이 날라간다.

4.1 코드 실행

  • 코드 실행으로 어떻게 메모리에 정보가 들어가는지 알아보자.
  • 코드 작성이 끝나면 컴파일하자.
  • javac.exe MyTest.java ⇒ 그 결과로 MyTest.class 파일이 생성된다.
  • java.exe MyTest ⇒ JVM이 bytecode를 읽어서 실행한다.
  • 예제
package test;

public class InstanceTest {
	static int a = staticCall("1번 출력");
	int b = staticCall("2번 출력");
	
	public static int staticCall(String msg) {
		System.out.println(msg);
		return 100;
	}
	
	public InstanceTest() {
		this.b = staticCall("3번 출력");
	}
	
	public static void main(String[] args) {
		System.out.println("4번 출력");
		int c = staticCall("5번 출력");
		InstanceTest d = new InstanceTest();
	}
}
1번 출력
4번 출력
5번 출력
2번 출력
3번 출력
  • this는 현재 사용하고 있는 reference의 객체, 지금 만들어지는 그 객체를 말함.

5. method overloading

5.1 연산자 오버로딩

    • → 당연히 숫자를 더하는 기호다. (앞과 뒤에 숫자가 나와서 숫자를 더한다.)
  • “문자열” + 10 → 문자열 연결하는 기호로 의미가 변한다.

5.2 오버로딩

💡 메소드의 이름은 같지만 만약 메소드의 인자의 개수나 인자의 type이 다른 경우 서로 다른 method로 구분되어서 사용할 수 있다.

  • 생성자 오버로딩도 하고, 메소드 오버로딩도 된다.
  • 이렇게 여러 개의 생성자를 사용하는 생성자 오버로딩은 각기 다른 방식으로 인스턴스를 초기화할 필요가 있기 때문이다.
  • 따라서 하나의 클래스 안에는 여러 개의 생성자가 존재할 수 있다.

6. package와 import

6.1 package

  • package는 클래스를 용도별로, 종류별로 묶어주는 논리적인 단위이다.
  • 유지보수와 재활용성을 높이기 위해서 서로 관련 있는 클래스를 묶어서 관리한다.
  • 당연히 물리적으로는 package 이름으로 되어 있는 폴더를 만들어서 그 안에 class를 저장한다.
  • 만약 package 구문을 사용하지 않으면 클래스는 default package 라는 것으로 묶인다.
  • package는 계층 구조로 사용할 수 있다. 이 계층 구조를 표현할 때, “.” 를 이용한다.

6.2 import

  • import는 다른 package에 있는 class를 가져다가 사용하기 위해서 사용하는 구문이다.
  • 자바 코드는 거의 예외 없이 package 구문이 나온다.
profile
안녕하세요 :)

0개의 댓글