diff --git a/mission/chapter02/images/Untitled 1.png b/mission/chapter02/images/Untitled 1.png new file mode 100644 index 0000000..d45465f Binary files /dev/null and b/mission/chapter02/images/Untitled 1.png differ diff --git a/mission/chapter02/images/Untitled 2.png b/mission/chapter02/images/Untitled 2.png new file mode 100644 index 0000000..c3ed1a0 Binary files /dev/null and b/mission/chapter02/images/Untitled 2.png differ diff --git a/mission/chapter02/images/Untitled 3.png b/mission/chapter02/images/Untitled 3.png new file mode 100644 index 0000000..e5aaf33 Binary files /dev/null and b/mission/chapter02/images/Untitled 3.png differ diff --git a/mission/chapter02/images/Untitled 4.png b/mission/chapter02/images/Untitled 4.png new file mode 100644 index 0000000..d8ebd45 Binary files /dev/null and b/mission/chapter02/images/Untitled 4.png differ diff --git a/mission/chapter02/images/Untitled.png b/mission/chapter02/images/Untitled.png new file mode 100644 index 0000000..8af1b62 Binary files /dev/null and b/mission/chapter02/images/Untitled.png differ diff --git a/mission/chapter02/images/image 1.png b/mission/chapter02/images/image 1.png new file mode 100644 index 0000000..2c9f590 Binary files /dev/null and b/mission/chapter02/images/image 1.png differ diff --git a/mission/chapter02/images/image 2.png b/mission/chapter02/images/image 2.png new file mode 100644 index 0000000..d437e64 Binary files /dev/null and b/mission/chapter02/images/image 2.png differ diff --git a/mission/chapter02/images/image 3.png b/mission/chapter02/images/image 3.png new file mode 100644 index 0000000..a37205a Binary files /dev/null and b/mission/chapter02/images/image 3.png differ diff --git a/mission/chapter02/images/image.png b/mission/chapter02/images/image.png new file mode 100644 index 0000000..838e909 Binary files /dev/null and b/mission/chapter02/images/image.png differ diff --git a/mission/chapter02/java_mission2.md b/mission/chapter02/java_mission2.md new file mode 100644 index 0000000..9de86ee --- /dev/null +++ b/mission/chapter02/java_mission2.md @@ -0,0 +1,134 @@ +# Chapter2. 추가 미션_static, JVM, class loader, collection interface + +## Static 과 JVM 메모리 관계 + +만들어진 클래스를 사용하려면, 기본적으로 객체를 생성하는 과정을 거쳐야한다. 그러나 main 클래스는 객체를 생성하는 과정이 없어도 실행이 된다. → static 키워드 + +- JVM 메모리 구조 + + ![image.png](./images/image.png) + + 아래와 같이 나눌 수 있다. + + - Method Area + - Heap + - Stack + - PC Register + - Native Method Stack + + 여기서 `static`으로 선언된 필드, 메서드는 **Method Area**에 저장된다. + + > Method Area: 클래스 수준의 메타데이터를 저장하는 공간, JVM이 클래스 로딩 시 여기에 클래스 관련 정보와 함께 static필드와 메서드를 로드함 + > + + `static` 변수는 애플리케이션 라이프사이클동안 유지되고 클래스 처음 로딩때 할당되며 JVM이 종료될 때까지 메모리에 유지된다. + + +## Static 과 JVM ClassLoader 관계 + +> ClassLoader: 컴파일 된 자바의 클래스 파일(*.class)을 동적으로 로드하고, JVM의 메모리 영역인 Runtime Data Areas에 배치하는 작업을 수행 +> +- 클래스가 처음 호출될 때 ClassLoader는 클래스를 메모리에 로드하고, 이 과정에서 클래스의 static 필드들이 초기화 +- ClassLoader는 계층적으로 동작한다. +- 각 클래스는 처음 로딩때 필요한 모든 **static 멤버**를 **MethodArea**에 올린다. + +- 클래스 로더가 클래스 파일을 로딩하는 순서 + 1. Loading(로드): 클래스 파일을 가져와 JVM의 **메모리에 로드** + 2. Linking(링크): 클래스 파일을 사용하기 위해 **검증**하는 과정 + 3. Initialization(초기화): 클래스 변수들을 **적절한 값으로 초기화** + +⚠️ 유의 : 메모리에 올리는 Loading 기능은 한번에 메모리에 올리지 않고, 어플리케이션에서 **필요한 경우 동적으로 메모리에 적재** + +엄연히 로드와 초기화는 다른 과정이며, JVM은 **실행될 때 모든 클래스를 메모리에 올려놓지 않고, 그때 마다 필요한 클래스를 메모리에 올려 효율적으로 관리**한다. + +### Static 예제 코드 및 실행 결과 + +StaticExample.java : + +```java +public class StaticExample { + // static 필드 : 메모리의 Method Area에 저장 + static int staticVariable = 10; + + static void staticMethod() { + System.out.println("스태틱 메서드 호출"); + } +} +``` + +Main.java: + +```java +public class Main { + public static void main(String[] args) { + System.out.println("스태틱 변수: " + StaticExample.staticVariable); + StaticExample.staticMethod(); + } +} +``` + +![image.png](./images/image%201.png) + +## Collection Interface 동작 방식 + +![image.png](./images/image%202.png) + +- List, Queue, Set에 상속을 하는 **실질적 최상위 컬렉션** +- 업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아 자료 삽입, 삭제, 탐색 기능을 할 수 있음(다형성) + +### 컬렉션 인터페이스 예제 코드 및 실행결과 + +CollectionExample.java : + +```java +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; + +public class CollectionExample { + + // 필드 선언 및 초기화 + Collection col1 = new ArrayList<>(); + Collection col2 = new HashSet<>(); + Collection col3 = new LinkedList<>(); + + // 생성자 + public CollectionExample() { + // 요소 추가 작업은 생성자 내부에서 수행 + col1.add(1); + col2.add(1); + col3.add(1); + } + + // 컬렉션 데이터를 출력하는 메서드 + public void printCollections() { + System.out.println("ArrayList: " + col1); + System.out.println("HashSet: " + col2); + System.out.println("LinkedList: " + col3); + } +} +``` + +Main.java : + +```java +public class Main { + public static void main(String[] args) { + // CollectionExample 객체 생성 + CollectionExample example = new CollectionExample(); + + // CollectionExample의 메서드를 이용해 컬렉션 출력 + example.printCollections(); + } +} + +``` + +![image.png](./images/image%203.png) + + +### 면접질문 +1. JVM 메모리 구조에서 static 변수는 어느 영역에 저장되나요? +2. static 키워드의 역할과 그 특징은 무엇인가요? +3. Collection 인터페이스는 어떤 방식으로 동작하나요? \ No newline at end of file diff --git a/mission/chapter02/mission.md b/mission/chapter02/mission.md new file mode 100644 index 0000000..34e19a6 --- /dev/null +++ b/mission/chapter02/mission.md @@ -0,0 +1,75 @@ +# 머랭 5주차 미션 인증 + +![2차](./images/Untitled.png) + +2차 + +1. 4주차 때 설계한 데이터베이스를 토대로 아래의 화면에 대한 쿼리를 작성 + +![내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함)](./images/Untitled%201.png) + +내가 진행중, 진행 완료한 미션 모아서 보는 쿼리(페이징 포함) + +```sql +SELECT mm.* +FROM member_mission AS mm +JOIN mission AS m ON mm.mission_id = m.id +WHERE mm.member_id = '유저 ID' + AND (mm.status = 'in progress' OR mm.status = 'success') +ORDER BY mm.status DESC +LIMIT 10 OFFSET 0; +``` + +테이블에서 특정 사용자의 데이터를 반환하는 쿼리, Offset based 페이징 적용 + +![리뷰 조회 및 해당 리뷰에 댓글 다는 쿼리](./images/Untitled%202.png) + +리뷰 조회 및 해당 리뷰에 댓글 다는 쿼리 + +```sql +SELECT r.*, m.name AS member_name, s.name AS store_name +FROM review AS r +JOIN member AS m ON r.member_id = m.id +JOIN store AS s ON r.store_id = s.id +WHERE r.store_id = '가게 ID' +ORDER BY r.created_at DESC; + +``` + +특정 가게에 대한 리뷰 또는 특정 유저의 리뷰를 조회 + +```sql +UPDATE review +SET content = CONCAT(content, '\n댓글 내용: 추가적인 댓글입니다.') +WHERE id = '리뷰 ID'; +``` + +![홈 화면 쿼리 +(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)](./images/Untitled%203.png) + +홈 화면 쿼리 +(현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함) + +```sql +SELECT m.id, m.name, m.mission_spec, m.reward, + COUNT(mm.id) AS completed_missions_count +FROM mission AS m +LEFT JOIN store AS s ON m.store_id = s.id +LEFT JOIN region AS r ON s.region_id = r.id +LEFT JOIN member_mission AS mm ON mm.mission_id = m.id AND mm.status = '완료' +WHERE r.id = '지역 ID' +GROUP BY m.id, m.name, m.mission_spec, m.reward +ORDER BY m.created_at DESC; +``` + +- JOIN → 미션, 상점, 지역, 그리고 멤버 미션을 연결하여 정보에 접근 +- 지역 id 기준으로 지역 조회 +- COUNT로 완료된 미션 갯수 카운트하여 홈화면에 출력 + +![마이 페이지 화면 쿼리](./images/Untitled%204.png) + +마이 페이지 화면 쿼리 + +```sql +SELECT name, email, phone_number FROM member WHERE id = '유저 ID' +``` \ No newline at end of file