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주차/데이브] 워크북 제출합니다. #31

Merged
merged 2 commits into from
Oct 5, 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
82 changes: 82 additions & 0 deletions mission/chapter02/java_mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# 추가과제

### 1. Static, JVM Memory, ClassLoader

### JVM Memory

**JVM memory** 구조는 **메서드 영역, 스택 영역, 힙 영역**으로 구성된다.

- **메서드 영역**
- 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 프로그램의 모든 영역에서 공유한다.
- 클래스 정보 : 클래스의 실행코드(바이트 코드), 필드, 메서드, 생성자 코드 등 모든 실행코드가 존재
- static 영역 : static 변수들을 보관한다.
- 런타임 상수 풀 : 공통 리터럴 상수를 보관한다. 프로그램을 효율적으로 관리하기 위한 상수들과 리터럴 문자가 있으면 공통으로 묶어서 관리한다.
- **스택 영역**
- 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때마다 하나씩 스택 영역에 쌓이게 된다.
- 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
- 스택 영역은 각 스레드 별로 하나의 실행 스택이 생성된다. 따라서 스레드 수 만큼 스택 영역이 생성된다.
- **힙 영역**
- 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역에 존재하게 된다. 배열도 이 영역에 생성된다.

### static

**static 변수**

- **클래스 공용 변수**
- 클래스에서 공용으로 사용되는 변수

**참고:** 인스턴스 변수(heap 영역), 지역변수(stack 영역)


**static method**

- 인스턴스 생성 없이 바로 메소드를 호출해서 사용 가능하다.
- 정적 메소드 내부에서는 인스턴스 변수에 접근 불가능하다.
- 정적 메서드는 참조 값의 개념이 없다. 특정 인스턴스의 기능을 사용하려면 참조 값을 알아야 하는데, 정적 메서드는 참조값 없이 호출한다. 따라서 정적 메서드 내부에서 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다.
- 유틸리티성 메소드에서 많이 활용된다.

### ClassLoader

클래스 로더는 클래스 파일을 메모리에 로드하는 역할을 하며, 이 과정에서 static 요소도 함께 Method 영역에 할당된다.

static 맴버는 클래스 로더가 해당 클래스를 로드한 후 초기화 되기 때문에, 클래스 로딩 시점와 static 초기화 시점은 밀접한 관계가 있다.

### 2. Collection interface

컬렉션 프레임워크는 객체를 저장하고 처리하기 위해 사용된다.

Collection Interface가 최상단에 존재하기 때문에 이를 구현한 다양한 컬렉션들은 기본적으로 공통적인 메소드를 제공한다. 또한 다형성을 사용하여, 다양한 컬렉션 타입들을 같은 타입으로 다룰 수 있다.

add, remove, size, isEmpty, contains, iterator, clear와 같은 메소드가 collection 인터페이스에 제공된다.

주의할 점은 Map은 Collection 인터페이스가 아니다. 그러나, keyset()과 같은 메소드를 호출하여 Collection의 기능을 사용가능하다.

### **컬렉션이 제공하는 인터페이스**

- Collection
- 루트 인터페이스로 메소드를 제공한다. 대부분의 컬렉션 클래스가 이 인터페이스를 상속받는다.
- List
- 순서가 있어, 인덱스를 통해 접근 가능. 중복 허용
- Set
- 중복 요소를 허용하지 않는다. 인덱스를 통해 접근 불가하다.
- Queue
- 주로 요소가 처리되기 전에 보관하는 컬렉션이다.
- Map
- 키와 쌍으로 요소를 저장하고, Collection 인터페이스를 상속받지 않는다.

### 구현체

- List
- ArrayList → 내부적으로 배열을 사용한다.
- LinkedList → 연결 리스트를 사용한다.
- Set
- HashSet → 해시 테이블
- LinkedHashSet → 해시 테이블과 연결 리스트
- TreeSet → 레드-블랙트리
- Queue
- LinkedList → 연결 리스트
- ArrayDeque → 배열 기반의 원형 큐
- Map
- HashMap → 해시 테이블
- LinkedHashMap → 해시 테이블 + 연결 리스트
- TreeMap → 레드-블랙트리
90 changes: 90 additions & 0 deletions mission/chapter02/misson.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
## 1

```sql
SELECT
r.name AS restaurant_name,
m.content AS mission_content,
mm.status AS mission_status,
m.point
FROM
member_mission mm
JOIN
mission m ON mm.id2 = m.id
JOIN
restaurant r ON m.id2 = r.id
WHERE
mm.member_id = (사용자의 id)
ORDER BY
mm.updated_at DESC
LIMIT ? OFFSET ?;
```

## 2
```sql
INSERT INTO review (
restaurant_id,
member_id, // erd에 누락되었지만, 있어야 할 것 같음
score,
content,
created_at,
updated_at
) VALUES (
(가게의 ID),
(사용자의 ID),
(리뷰 점수),
(리뷰 내용),
NOW(),
NOW()
);

```
## 3
```sql
// 선택한 지역 내에서 성공한 미션 개수

SELECT
COUNT(*)
FROM
member_mission mm
JOIN
mission m ON mm.id2 = m.id
JOIN
restaurant r ON m.id2 = r.id
WHERE
r.address = (지역의 이름)
AND mm.member_id = (회원의 id)
AND mm.status = '완료';


// (현재 선택 된 지역에서 도전이 가능한 미션 목록, 페이징 포함)

SELECT
r.name AS restaurant_name,
r.type AS restaurant_type,
m.content AS mission_content
FROM
restaurant r
JOIN
mission m ON r.id = m.id2
LEFT JOIN
member_mission mm ON m.id = mm.id2 AND mm.status != '완료'
WHERE
r.address = (지역의 이름)
ORDER BY
m.created_at DESC
LIMIT ? OFFSET ?;

```

## 4
```sql
SELECT
m.name,
m.email,
m.phone_number,
m.point
FROM
member m
WHERE
m.id = (memberId);
```