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주차/공공] 워크북 제출합니다. #34

Merged
merged 3 commits into from
Oct 4, 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
9 changes: 9 additions & 0 deletions keyword/chapter02/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
## 🎯핵심 키워드

---

***이번 주차는 키워드가 딱히 없습니다!***

---


Binary file added mission/chapter02/1주차미션.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 71 additions & 0 deletions mission/chapter02/java_mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
## 🔥 추가과제) 해당 키워드에 대해서 공부한 후 간단정리후 제출 & 면접질문 최소 한개 만들어서 제출 후 스터디 시간에 스터디원들과 질문하기!

Jvm과 클래스로더는 너무 깊게 공부하실 필요는 없고 static과 어떤 관계가 있는지만 공부해보시면 좋을거같아요!
collection또한 어떤 방식으로 동작하는지만 보면 좋을거 같습니다!
---

***1. static & jvm메모리 & classloader***

- JVM 메모리 구조
JVM(Java Virtual Machine)은 자바 프로그램을 실행하기 위한 가상 머신이며, 프로그램이 실행되는 동안 메모리를 크게 세 영역 (Method 영역, Heap 영역, Stack 영역) 으로 나누어 관리한다.

- > Method 영역: 프로그램 실행 시 클래스 정보와 static 변수, 메서드 등이 저장되는 공간이다. 클래스가 로드될 때 한 번만 생성되며, 모든 스레드에서 공유된다. 프로그램이 종료될 때까지 유지되는 특성을 가지고 있다. 이곳에는 클래스 메타데이터(클래스 이름, 메서드, 변수 정보), 그리고 static 변수와 static 메서드가 저장된다.

- > Heap 영역: 객체가 생성되고 메모리에 할당되는 공간이다. new 연산자를 사용해 생성한 모든 객체가 Heap에 저장되며, 모든 스레드가 공유한다. Garbage Collector가 주기적으로 이 영역을 검사해 더 이상 참조되지 않는 객체를 제거해 메모리를 효율적으로 관리한다.

- > Stack 영역: 각 스레드가 독립적으로 가지는 메모리 공간으로, 메서드가 호출될 때마다 메서드의 호출 정보와 지역변수, 매개변수가 저장된다. 메서드가 호출되면 스택 프레임이 생성되고, 메서드가 종료되면 해당 스택 프레임이 제거되는 방식으로 동작한다. Heap 영역과 달리 메모리 할당 및 해제가 매우 빠르다.


- static 변수와 Method 영역
static 변수는 클래스 로딩 시 Method 영역에 할당된다. 이 변수는 프로그램 실행 중 한 번만 메모리에 올라가고, 클래스의 모든 인스턴스에서 공유된다. 따라서 static 변수는 객체를 생성하지 않고도 접근할 수 있는 특징이 있다.

- > 또한 static 메서드 역시 Method 영역에 저장된다. 이 메서드는 인스턴스를 생성하지 않고도 클래스 이름으로 직접 호출할 수 있다. 하지만 인스턴스와 무관하게 동작하므로, static 메서드 안에서는 인스턴스 변수나 인스턴스 메서드에 접근할 수 없다. 그 대신, static 변수나 다른 static 메서드만을 사용할 수 있다.


- ClassLoader와 static의 관계
ClassLoader는 자바 클래스 파일을 JVM 메모리에 로드하는 역할을 한다. 자바 프로그램에서 클래스가 처음 참조될 때 ClassLoader가 해당 클래스 파일(.class)을 찾아 로드하게 된다. 이 과정에서 static 변수와 static 메서드가 함께 Method 영역에 로드된다.

- > 클래스가 로드되면 그때부터 static 변수나 메서드는 메모리에 존재하게 되며, 인스턴스 생성과 관계없이 사용할 수 있다. 예를 들어, 클래스 로더가 처음 클래스 파일을 로드할 때 static 초기화 블록도 함께 실행되며, 이 시점에서 static 변수들이 초기화된다. 따라서 static과 ClassLoader는 밀접한 관계를 가지고 있다.

---



***2. Collection interface***

자바의 Collection 인터페이스는 데이터 그룹을 효율적으로 다루기 위한 표준화된 방법을 제공한다. Collection Framework는 자바에서 데이터를 수집, 저장, 처리하는 여러 자료 구조를 제공하며, 이 인터페이스를 통해 객체를 효과적으로 관리할 수 있다.


- 주요 Collection 인터페이스
- 1. List: 순서를 유지하면서 요소를 저장하고, 중복된 요소를 허용하는 자료 구조이다. 배열과 유사하지만, 크기가 동적으로 변하며 삽입과 삭제가 유연하다. 대표적인 구현체로는 ArrayList와 LinkedList가 있다.

- > ArrayList는 내부적으로 배열을 사용해 데이터를 저장하며, 인덱스를 통해 빠르게 접근할 수 있다. 하지만 중간에 요소를 삽입하거나 삭제하는 작업은 느리다.

- > LinkedList는 각 요소가 이전/다음 요소의 참조를 가지는 노드로 구성된다. 삽입과 삭제가 빈번한 경우 성능이 좋지만, 인덱스를 통한 접근 속도는 상대적으로 느리다.


- 2. Set: 중복을 허용하지 않는 자료 구조이다. 요소들이 순서를 가지지 않으며, 오직 유일한 값을 저장하는 데 중점을 둔다. HashSet과 TreeSet이 대표적인 구현체이다.

- > HashSet은 해시 테이블을 기반으로 하여 빠른 검색과 삽입이 가능하다. 하지만 데이터가 저장되는 순서를 보장하지 않는다.

- > TreeSet은 이진 트리 기반으로 데이터를 정렬하여 저장한다. 따라서 항상 정렬된 상태로 데이터를 유지해야 할 때 유용하다.


- 3. Queue: 선입선출(FIFO, First-In-First-Out) 방식으로 동작하는 자료 구조이다. 주로 작업 대기열이나 버퍼와 같은 곳에서 사용된다. PriorityQueue는 우선순위가 높은 요소를 먼저 처리하는 큐로, 내부적으로 힙 자료 구조를 사용해 우선순위를 관리한다.


- 4. Map: 키(Key)와 값(Value) 쌍으로 데이터를 저장하는 자료 구조이다. HashMap과 TreeMap이 대표적인 구현체이다.

- > HashMap: 키를 해싱하여 데이터를 저장하며, 빠른 검색이 가능하다. 하지만 순서를 보장하지 않는다.

- > TreeMap은 키를 정렬하여 저장하며, 항상 정렬된 상태로 데이터를 관리할 수 있다. 이는 키 값에 따라 데이터를 정렬해야 할 경우 유용하다.





***3. 면접 질문 만들어보기***

- Q. static 메서드와 일반 메서드의 차이점은?

static 메서드는 객체를 생성하지 않고도 클래스 이름으로 호출할 수 있다. 반면, 일반 메서드는 반드시 인스턴스를 생성한 후 호출해야 한다. 또한, static 메서드는 인스턴스 변수에 접근할 수 없고, 오직 static 변수만 사용할 수 있다.
64 changes: 64 additions & 0 deletions mission/chapter02/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
## 🔥 미션

---

- (1) 1주차 때 설계한 데이터베이스를 토대로 아래의 화면에 대한 쿼리를 작성

***저번주차 설계 DB***

- ![week1](./1주차미션.png)

***1. 내가 진행 중, 진행 완료한 미션을 모아서 보는 쿼리***

SELECT H.name, M.mission_num, M.rest_name, M.request
FROM 회원 H
JOIN 선호음식카테고리 C ON H.email = C.email
LEFT JOIN 미션 M ON C.email = M.email
WHERE H.email = '회원이메일'
ORDER BY M.datetime DESC;

---


***2. 리뷰 작성하는 쿼리***

INSERT INTO 리뷰 (mission_num, email, star, content, datetime)
VALUES (1234, '회원이메일', 4.5, '좋은음식이었어요~:)', NOW());

---


***3. 홈 화면 쿼리 ***

- 지역내에서 성공한 미션들
SELECT count(*)
FROM 미션 M
JOIN 점표 J ON M.mission_num = J.mission_num
JOIN 지역 R ON J.지역 id = R.지역 id
WHERE J.request = 1 //성공미션
AND J.email = '회원이메일' //자신미션
AND J.지역_id = "" //선택지역id
ORDER BY M.datetime DESC
LIMIT 10 OFFSET 0; //10개씩 페이징

- 지역내에서 도전가능 미션들
SELECT M.rest_name, M.price, M.datetime
FROM 미션 M
JOIN 점표 J ON M.mission_num = J.mission_num
JOIN 지역 R ON J.지역 id = R.지역 id
WHERE J.request = 0 //성공미션
AND J.email = '회원이메일' //자신미션
AND J.지역_id = "" //선택지역id
ORDER BY M.datetime DESC

---


***4. 마이 페이지 화면 쿼리***

SELECT name, email, address
FROM 회원
WHERE email = '회원이메일' //자신페이지