-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #15 from meoraeng/main
[1주차/머랭] 워크북 제출합니다.
- Loading branch information
Showing
9 changed files
with
297 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
.github | ||
.idea |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
- 외래키 | ||
- 외래키는 한 테이블의 필드(컬럼)가 다른 테이블의 기본키(PK)를 참조하는 제약조건이다. | ||
- 어떤 테이블의 외래키 값은 다른 테이블의 기본키 값과 동일해야한다. → **데이터 무결성** | ||
|
||
외래키를 활용하여 데이터베이스에서 관련된 테이블 간의 관계를 정의하고, 데이터 무결성을 유지할 수 있다. | ||
|
||
- 기본키 | ||
- 관계형 데이터베이스에서 각 레코드(행)을 고유하게 식별하기 위해 사용하는 필드(컬럼)이다. | ||
- 기본키는 해당 테이블에서 중복되지 않는 값이어야 한다 | ||
|
||
<기본키의 주요 특징> | ||
|
||
1. 고유성 : 기본키 값은 테이블 내에서 중복되지 않아야 한다 → 각 레코드는 서로 다른 기본값을 가짐 | ||
2. 존재성 : 모든 레코드는 기본키 값을 가져야 한다. → 기본키는 NULL이 될 수 없음 | ||
3. 불변성 : 기본키 값은 변경되면 안된다. → 한번 설정된 기본키 값은 변경 불가 | ||
|
||
주로 기본키는 식별자로 사용되며, 다른 테이블에서 해당 테이블의 레코드를 참조하거나 할 때 주로 쓰인다. | ||
|
||
주로 특정 필드를 기본키로 지정하거나, 복합 기본키를 사용하여 여러 필드의 조합으로 기본키를 정의. | ||
|
||
- ER 다이어그램 | ||
|
||
ERD(Entity Relationship Diagram) | ||
|
||
- 데이터베이스 구조를 한눈에 알아보기 위해 쓰인다. | ||
- DB를 개발하기 전 아이디어 도출, DB 설계 이해를 높이기 위해 모델링을 한다. | ||
- 쿼리문을 작성할 때 다이어그램을 참고하여 작성 가능 | ||
- 데이터 특징 확인 → 요구사항에 맞는 개발 가능 | ||
- 복합 키 | ||
|
||
관계형 데이터베이스에서 두 개 이상의 필드(컬럼)로 구성된 키를 말한다. | ||
|
||
이러한 키는 두개 이상의 필드 값 조합으로 레코드를 고유하게 식별한다. | ||
|
||
- 연관관계 | ||
|
||
Relationship | ||
|
||
- Entity간의 관계를 의미 | ||
- 엔터티 간에 선을 긋고, 관계 명칭을 기록 | ||
- 선택 사항 표시 | ||
- 점선→선택적인 사항 | ||
- 실선→필수적인 사항 | ||
- 관계형태 표시 | ||
- 삼지창 모양 → 하나 이상 | ||
- 단선 → 하나 | ||
|
||
Cardinality | ||
|
||
- 1:1 관계 | ||
|
||
: 양쪽 모두 하나씩 존재 | ||
|
||
- 1:N 관계 | ||
|
||
: 하나의 원소가 두개 이상의 원소와 관계를 맺는 것 | ||
|
||
- N:M 관계 | ||
|
||
: 다대다 관계, 양쪽 모두 하나 이상과 연관될 수 있다. | ||
|
||
- 정규화 | ||
|
||
ERD내에서 중복요소를 찾아 최소화하고 종속관계에 있는 속성을 제거하는 과정을 말한다. | ||
|
||
(중복된 데이터는 많은 문제를 일으킨다) | ||
|
||
중복을 완전히 없애는 것은 어렵고 최소화를 목적으로 하면 무리가 없다. | ||
|
||
정규화는 기본 정규형(1,2,3보이스/코드 정규형), 고급 정규형(4,5정규형)으로 분류 | ||
|
||
- 1 정규화: 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 컬럼을 제거하고 기본테이블의 PK를 추가해 새 테이블을 생성하고 기존 테이블과 1:N 관계를 형성 | ||
- 하나의 테이블에 값이 여러개인 경우 → 필드 하나에 값여러개 X | ||
- 2 정규화: PK가 여러 키로 구성된 복합키로 구성된 경우, 복합키 전체가 아닌 일부에만 종속되는 속성을 분리한다. | ||
- 3 정규화: 이전적 함수 종속 관계와 같이 PK가 아닌 일반컬럼에 의존하는 컬럼들을 분리한다. | ||
- 반 정규화 | ||
|
||
역 정규화: 정규화된 표가 있을 때 개발과정에서 성능이나 편의성을 위해 되돌아가는 과정 | ||
|
||
- JOIN 줄이기 | ||
- 계산작업 줄이기 | ||
- 테이블 분리 | ||
- 외래키 줄이기 |
File renamed without changes.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
# Chapter1. 추가 미션 | ||
|
||
## 자바 접근제어자 | ||
|
||
자바의 접근제어자는 아래와 같이 4가지가 존재한다. | ||
|
||
- `public`: 모든 클래스에서 접근이 가능 | ||
- `protected` : **같은 패키지나 상속받은 클래스**에서 접근 가능 | ||
- `default`: **같은 패키지**에서만 접근 가능하며 명시적으로 `default` 키워드는 X | ||
- `private`: **같은 클래스** 내에서만 접근 가능 | ||
|
||
### 접근제어자 예제 코드 | ||
|
||
packageA/MyClassA: | ||
|
||
```java | ||
package packageA; | ||
|
||
public class MyClassA { | ||
public void publicMethod() { | ||
System.out.println("Public method in myClassA"); | ||
} | ||
protected void protectedMethod() { | ||
System.out.println("Protected method in myClassA"); | ||
} | ||
|
||
void defaultMethod(){ | ||
System.out.println("Default method in myClassA"); | ||
} | ||
|
||
private void privateMethod(){ | ||
System.out.println("Private method in myClassA"); | ||
} | ||
|
||
public void callPrivateMethod() { | ||
privateMethod(); // 같은 클래스에서 private 메서드 호출 가능 | ||
} | ||
} | ||
``` | ||
|
||
packageA에서 하나의 클래스를 만들고 그 안에 4가지 접근 제어자가 적용된 메서드를 정의 | ||
|
||
packageA/ChildClassA: | ||
|
||
```java | ||
package packageA; | ||
|
||
public class ChildClassA extends MyClassA { | ||
public void testMethods() { | ||
publicMethod(); // 접근 가능 (상속받은 클래스, public) | ||
protectedMethod(); // 접근 가능 (상속받은 클래스, protected) | ||
defaultMethod(); // 접근 가능 (같은 패키지, default) | ||
//privateMethod(); // 접근 불가 (private) | ||
} | ||
} | ||
``` | ||
|
||
MyClassA로부터 상속 받아온, 동일 패키지의 클래스 ChildCalssA에서 `public`, `protected`, `default`만 접근 가능 | ||
|
||
packageB/OtherClassB: | ||
|
||
```java | ||
package packageB; | ||
|
||
import packageA.MyClassA; | ||
|
||
public class OtherClassB { | ||
public void testMethods() { | ||
MyClassA obj = new MyClassA(); | ||
obj.publicMethod(); // 접근 가능 (public) | ||
// obj.protectedMethod(); // 접근 불가 (다른 패키지에서 protected) | ||
// obj.defaultMethod(); // 접근 불가 (다른 패키지에서 default) | ||
// obj.privateMethod(); // 접근 불가 (private) | ||
} | ||
} | ||
``` | ||
|
||
다른 패키지인 packageB에 만들어진 OtherClassB는 public에만 접근 가능 | ||
|
||
Main.java: | ||
|
||
```java | ||
import packageA.MyClassA; | ||
import packageA.ChildClassA; | ||
import packageB.OtherClassB; | ||
|
||
public class Main { | ||
public static void main(String[] args) { | ||
// 1. 같은 패키지의 클래스에서 호출하는 경우 | ||
ChildClassA child = new ChildClassA(); | ||
child.testMethods(); // public, protected, default 접근 가능 | ||
|
||
// 2. 다른 패키지의 클래스에서 호출하는 경우 | ||
OtherClassB other = new OtherClassB(); | ||
other.testMethods(); // public '만' 접근 가능 | ||
|
||
// 3. 같은 클래스 내에서 private 메서드를 호출하는 경우 | ||
MyClassA obj = new MyClassA(); | ||
obj.callPrivateMethod(); // 같은 클래스 내에서는 private 도 호출 가능! | ||
} | ||
} | ||
``` | ||
|
||
상속받은 ChildClass가 아닌 MyClassA에서는 private접근 가능 | ||
|
||
위 예제코드 출력: | ||
|
||
![image.png](./image/image.png) | ||
|
||
## 클래스와 인터페이스 | ||
|
||
- 클래스 : 클래스는 객체를 생성할 수 있는 틀의 역할이며, 멤버 변수(필드)와 메서드로 구성된다. | ||
- 인터페이스 : 자바에서 클래스를 통한 다중 상속은 지원되지 않는다. 그러나 다중상속의 이점을 버릴 수는 없기에 인터페이스를 통해 다중 상속을 지원한다. **인터페이스란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상 클래스** | ||
- 차이점: 클래스는 객체를 생성할 수 있고 상태(필드)를 가질 수 있지만, 인터페이스는 오로지 메서드의 선언만 포함 | ||
|
||
### 클래스/인터페이스 예제코드 | ||
|
||
```java | ||
interface Animal { | ||
void sound(); // 추상 메서드 | ||
} | ||
|
||
class Cat implements Animal { | ||
public void sound() { | ||
System.out.println("Cat🐱"); | ||
} | ||
} | ||
// Main.java | ||
class Main { | ||
public static void main(String[] args) { | ||
Animal animal = new Cat(); | ||
animal.sound(); | ||
} | ||
} | ||
``` | ||
|
||
### 클래스/인터페이스 실행 결과: | ||
|
||
![image.png](./image/image1.png) | ||
|
||
## 상속 | ||
|
||
OOP에서는 부모(상위) 클래스와 자식(하위) 클래스가 있으며, 자식 클래스는 부모 클래스를 선택해서 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 된다. | ||
|
||
이런 상속을 통해 이미 마련되어 있던 클래스를 재사용해서 만들 수 있기에 효율적으로 개발이 가능, 하지만 상속을 하더라도 자식 클래스가 부모의 모든 것을 물려받는것은 아니다. | ||
|
||
- 앞서 접근제어자에서 다룬 대로, 부모 클래스의 `private` 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다. | ||
- 부모와 자식클래스가 서로 다른 패키지에 있을 경우, 부모의 `default` 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다. | ||
|
||
자바에서는 `extends` 키워드를 사용하여 상속을 구현 | ||
|
||
### 상속 예제 코드: | ||
|
||
```java | ||
class People { | ||
void eat() { | ||
System.out.println("This people is eating"); | ||
} | ||
} | ||
|
||
class Student extends People { | ||
void studying() { | ||
System.out.println("This student is studying"); | ||
} | ||
} | ||
// Main.java | ||
class Main { | ||
public static void main(String[] args) { | ||
Student student = new Student(); | ||
student.eat(); // 부모 클래스의 메서드 | ||
student.studying(); // 자식 클래스의 메서드 | ||
} | ||
} | ||
``` | ||
|
||
### 상속 실행결과: | ||
|
||
![image.png](./image/image2.png) | ||
|
||
### 면접 질문 | ||
|
||
- 자바에서 `protected`와 `default` 접근 제어자의 차이 | ||
- 인터페이스와 추상 클래스의 차이 | ||
- 상속과 인터페이스 구현의 차이점은 무엇 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# Chpater1. 미션 | ||
|
||
![ERD](./image/image3.png) | ||
|
||
- **member (회원)** | ||
- `member` 테이블은 서비스 사용자에 대한 정보를 저장 | ||
- 사용자 이름, 성별, 생년월일, 주소 등의 정보를 포함하며, 사용자의 소셜 로그인 정보 (네이버, 카카오, 애플 등)도 관리합니다. | ||
- 사용자는 선호하는 음식 카테고리와 총 포인트, 그리고 참여한 미션에 대한 정보를 가짐 | ||
- 사용자는 미션에 참여할 수 있으며, 미션 수행을 통해 포인트를 적립 가능 | ||
- **store (상점)** | ||
- `store` 테이블은 서비스에서 리뷰를 남길 수 있는 상점들에 대한 정보를 저장 | ||
- 상점의 이름, 지역, 카테고리, 이미지, 주소 등의 정보가 포함 | ||
- 각 상점은 특정 지역(`region`)과 카테고리(`category`)에 속함 | ||
- 상점 정보는 사용자가 리뷰를 남길 수 있음 | ||
- **review (리뷰)** | ||
- `review` 테이블은 각 사용자가 상점에 남긴 리뷰를 저장합니다. 리뷰에는 사용자의 점수, 내용, 이미지 등이 포함되며, 리뷰를 남긴 사용자(`member_id`)와 상점(`store_id`)의 관계를 나타냄 | ||
- 이를 통해 사용자는 상점에 대한 리뷰를 작성하고, 다른 사용자는 해당 상점에 대한 평점과 리뷰를 확인 가능 | ||
- **region (지역)** | ||
- `region` 테이블은 상점이 위치한 지역 정보를 저장 | ||
- 지역의 이름과 생성일, 수정일 등의 정보가 기록 | ||
- 이를 통해 사용자는 특정 지역에 있는 상점만을 탐색 | ||
- **category (카테고리)** | ||
- `category` 테이블은 상점의 카테고리 정보를 저장합니다. | ||
- 각 상점은 특정 카테고리에 속하며, 사용자는 카테고리별로 상점을 탐색 | ||
- **mission (미션)** | ||
- `mission` 테이블은 서비스 내에서 사용자가 수행할 수 있는 미션 정보를 담고 있음. | ||
- 각 미션에는 미션 이름, 인증 번호(`auth_number`), 미션을 수행하면 얻을 수 있는 포인트(`point`), 그리고 해당 미션이 활성화된 상태(`state`) 등의 정보가 기록 | ||
- 미션은 특정 지역(`region_id`)과 연결되어 있어, 사용자는 미션을 수행하여 포인트를 적립할 수 있음 |