Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[2주차/머랭] 워크북 제출합니다. #27

Merged
merged 3 commits into from
Oct 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added mission/chapter02/images/Untitled 1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/Untitled 2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/Untitled 3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/Untitled 4.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/Untitled.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/image 1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/image 2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/image 3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added mission/chapter02/images/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
134 changes: 134 additions & 0 deletions mission/chapter02/java_mission2.md
Original file line number Diff line number Diff line change
@@ -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<Number> col1 = new ArrayList<>();
Collection<Number> col2 = new HashSet<>();
Collection<Number> 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 인터페이스는 어떤 방식으로 동작하나요?
75 changes: 75 additions & 0 deletions mission/chapter02/mission.md
Original file line number Diff line number Diff line change
@@ -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'
```