
두 메모리 모두 JVM Runtime Data Area라는 JVM 메모리 내 영역에 속합니다.
스택은 저희가 일반적으로 알고 있는 LIFO 자료 구조의 형태를 띕니다.
스택에는 일반적으로 저희 메서드 내에서 사용되는 지역 변수, 파라미터 등과 같은 변수공간을 의미합니다. 해당 메모리들은 메서드가 종료되면 스택에서 제거됩니다.
힙은 객체 생성 시 생성되는 공간을 말합니다. 해당 공간에는 변수의 필드값이 저장됩니다. 자바 설계 원칙 상 힙메모리의 관리는 GC에 의해서 관리됩니다.
클래스는 실제 존재하는 객체의 특징과 행위를 프로그래밍 코드로 작성하여 추상화 한 것을 말합니다. 인스턴스는 이러한 클래스에 메모리를 할당한 상태를 말합니다.
하나의 클래스에는 여러개의 독립적인 인스턴스 생성이 가능하면, 이는 각자의 메모리가 다르기 때문입니다.
앞서 말했듯이 Garbage Collector는 자바에서 개발자가 명시적으로 객체에 대한 메모리를 관리하지 않도록 자동으로 삭제 및 관리해주는 역할을 합니다.
GC의 삭제 대상이 되는 기준은 다음과 같습니다.
Java 내에는 여러가지 가비지 컬렉터 종류가 있습니다. 이 중 일반적인 GC의 메모리 해제 과정은 다음과 같습니다.
자바에서 사용되는 GC의 디폴트 값이 GC1
첫째, Marking 과정입니다.
프로세스는 마킹을 호출합니다. 이는 GC가 메모리가 사용되는지 아닌지를 찾아 냅니다. 참조되는 객체는 파란색, 아닌 객체는 주황색으로 보여집니다. 모든 객체는 마킹 단계에서 결정을 위해 스캔되어집니다. 모든 객체를 스캔하므로 매우 많은 시간을 소모합니다.
둘째, Normal Deletion 또는 Sweeping 과정입니다.
참조되지 않는 객체를 제거하고, 메모리를 반환하게 됩니다. 메모리 Allocator는 반환되어 비어진 블럭의 참조 위치를 저장해 두었다고 새로운 객체가 선언되면 할당되도록 합니다.
셋째, Compacting 과정입니다.
성능 향상을 위해 참조되지 않는 객체를 제거하고 또한 남은 참조되어진 객체들끼리 묶습니다. 즉, 압축 과정에서 메모리 내 남아있는 객체들은 연속적으로 묶어서 메모리의 단편화를 줄입니다. 이 과정에서 객체들이 메모리 내의 새로운 위치로 이동될 수 있으며, 이로 인해 객체의 메모리 주소값이 변경됩니다. 이로 인해 참조에 대한 업데이트도 함께 발생합니다.
Map은 Java의 Collection Framework에 대표적인 인터페이스 중 하나입니다.
기본적인 구조는 키와 밸류로 구성되어 데이터를 저장해줍니다. 해당 구조는 키에 해당하는 밸류 값을 찾을 때 조회가 빠릅니다. 그리고, 키는 중복을 허용하지 않으므로, 기존의 키에 값을 다시 저장할 경우 기존의 값이 덮어씌워집니다.
Map의 구현체로 HashMap, TreeMap, LinkedHashMap이 있습니다.
HashTable을 사용하여 만들어진 구현체입니다.
키와 밸류를 저장하며, 키를 이용하여 빠르게 데이터를 찾기 위한 자료구조를 가지고 있습니다.
특정 키값은 해시 함수를 통해 bucket에 index로 변환됩니다.
bucket은 index(해시값)를 통해서만 접근이 가능합니다.
bucket 내 index와 연결된 엔트리 안에 키와 밸류값을 저장합니다.
TreeMap은 Node들의 연결로 이루어져 있으며, LinkedList와 유사한 형태입니다.
이진 검색 트리를 기반으로 구현됩니다.
모든 키는 정렬된 상태로 유지됩니다.
키-값 쌍은 정렬된 순서로 저장되어 탐색과 범위 쿼리가 빠르게 수행될 수 있습니다.
해시 맵과 링크드 리스트를 결합한 형태로 구현됩니다.
키-값 쌍은 입력된 순서대로 유지됩니다.
빠른 검색 기능과 삽입 순서에 대한 보장이 가능합니다.
이러한 구현 방식들은 각각 장단점을 가지고 있으며, 사용되는 상황에 따라 적절한 방식을 선택할 수 있습니다.
이러한 내부 구현 방식은 Map 인터페이스의 다양한 메서드를 효율적으로 구현하고, 키-값 쌍을 빠르게 저장하고 검색할 수 있도록 도와줍니다.
DI는 의존 주입을 말하며, 일반적으로 A라는 객체의 비지니스 로직을 수행하기 위해 B라는 객체의 메서드를 호출해야 하는 상황을 A라는 객체가 B에 의존하고 있다고 볼 수 있습니다.
이러한 상황에서 A 객체에서 클래스 B의 인스턴스를 생성하여 메서드를 호출하는 상황을 의존 주입이라고 합니다.
이러한 DI 과정을 개발자가 직접 하지 않고, 생성된 빈객체를 스프링 컨테이너에 등록만 해주면, 자동으로 등록된 빈 중 의존 주입이 필요한 개소에 조립해주는 역할을 해줍니다.
따라서, 기존의 개발자가 빈을 제어해야하는 상황에서 스프링에서 컨테이너를 활용하여 관리해주므로 이러한 상황을 IOC 제어의 역전이라고 합니다.
MVC 모델을 model, view, conroller를 의미하며, 디자인 패턴중 하나입니다.
컨트롤러를 조작하면 모델을 통해서 데이터를 가져오고 그 정보를 시각적인 표현을 담당하는 view를 제어해서 클라이언트에게 전달하는 과정을 의미합니다.
모델에서는 애플리케이션의 데이터와 비즈니스 로직을 관리합니다.
뷰에서는 모델로부터 데이터를 받아와서 사용자가 볼 수 있는 형식으로 렌더링을 하여 데이터를 시각적으로 표현합니다.
컨트롤러는 사용자의 입력을 처리하는 기능을 하며, 모델과 뷰 사이의 흐름을 제어하는 것으로 사용자의 요청을 받아 모델을 호출하고, 모델에서 처리된 데이터를 뷰에 전달하는 역할을 합니다.