✏️ JVM의 메모리 구조
- JVM ( 자바가상머신, Java Virtual Machine )
- OS에 종속적이지 않음
( JVM을 통한 .java -> .class (bytecode 변환) -> jvm을 통한 해석 )
- 메모리관리, Garbage collection 수행, 스택기반의 가상머신(스택, LIFO)
- JVM 구성요소( 3가지 주요 영역 Method Area, Call stack, Heap )

스택 메모리 - 객체 참조변수
힙 영역 - 인스턴스
// 생성자를 통해 값을 넣었다면 값도 같이 저장
// 모든 메모리는 각자의 주소를 가지고 있음.
// 이는 jvm 스택구조이기 떄문에
Java Heap / 값 저장
- 객체와 JRE 클래스들에게 메모리를 할당할때 사용
- 우리가 객체를 만들 때 항상 힙 공간에 만들어짐
- 가비지컬렉션은 더이상 힙 메모리에 참조하지 않는
객체 정리
java.lang.OutOfMemoryError
Java Stack / 실행 순서(스레드) 저장
- LIFO (Last-In-First-Out)
- 스레드를 실행하기 위해 사용.
✏️ 기본형 매개변수와 참조형 매개변수
- 기본형 : 변수의 값을 일기만 할 수 있다.

- 참조형 : 변수의 값을 읽고 변경할 수 있다.

예제 6-12) 직접대입하지 않아도, 해당 배열 주소값을 통해 그 배열의 값을 바꿀 수 있다.
예제 6-13) 직접 값을 반환해주지 않아도, 적용할 수 있다.
=> 값이 저장된 주소값을 안다면 그 대상에게 영향을 끼칠 수 있다.
✏️ 참조형 반환타입
예제 6-14) copy안에 d를 넣었기때문에 이 값을 받기위해 d로 받게되면 copy메서드가 종료되면서, 새로운 객체의 참조가 사라지기 때문에 더이상 이 객체를 사용할 방법이 없다.
=> 반환타입이 '참조형'이라는 것은 메서드가 '객체의 주소'를 반환한다는 것을 의미한다.
✏️ 재귀호출(recursive call)
- 메서드 내부에서 자신을 다시 호출하는 것 ( 값에 의한 호출, call by value )
- 반복문보다는 성능이 떨어지지만 재귀호출이 주는 논리적 간결함, 특정상황에서의 사용
- 대표적인 예시 : 팩토리얼, 피보나치, 배열최대값 등등
- Stack Overflow Error 주의 ( 매개변수의 유효성 검사 )
✏️ 클래스 메서드(static메서드)와 인스턴스 메서드
- class method : 메서드 앞에 static이 붙어 있다. 객체생성x 'className.메서드이름' 호출 가능
- instance method : 반드시 객체생성
- class 설계시, member변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
(모든 인스턴스에서 같은 값을 유지해야 하는 변수는 static을 붙여서 클래스변수로 정의)
- class 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.(메모리 올라갈때 자동생성)
- class 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.
(인스턴스 생성 없이 호출가능하므로 클래스 메서드가 호출되었을 때, 인스턴스가
존재하지 않을수도 있다. 그래서 클래스 메서드에서 인스턴스 변수의 사용을 금지한다.)
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static 사용하는게 더 빠르다.
✏️ 클래스 멤버와 인스턴스 멤버간의 참조와 호출
- 같은 클래스에 속한 멤버들 간에는 별도의 인스턴스를 생성하지 않고도 서로 참조 또는 호출 가능
(단, 클래스멤버가 인스턴스 멤버를 참조 또는 호출하고자 하는 경우에는 인스턴스 생성.
그 이유는 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 졵재하지 않을 수도 있기 때문이다.)
- 인스턴스 멤버간의 호출에는 아무런 문제가 없다.