Skip to content

Commit

Permalink
Merge pull request #22 from ahtop00/main
Browse files Browse the repository at this point in the history
  • Loading branch information
ahtop00 authored Sep 27, 2024
2 parents 28dfc2f + 9dba42e commit 5844585
Show file tree
Hide file tree
Showing 7 changed files with 385 additions and 0 deletions.
Binary file added keyword/chapter01/image2.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 keyword/chapter01/image3.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 keyword/chapter01/img.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
145 changes: 145 additions & 0 deletions keyword/chapter01/keyword.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
# 1주차 키워드 정리🎯

## 1. 외래키 (*Foreign Key*)
### 1) 외래키란?
- 외래키는 하나의 테이블에서 다른 테이블의 기본키를 참조하는키.
- 외래키는 데이터베이스에서 데이터 무결성(Integrity)을 유지하는데 중요한 역할을 한다.

### 2) 외래키의 이점
- **데이터 무결성 유지** : 외래키를 사용하면 데이터베이스에서 참조 무결성(Referential Integrity)을 유지할 수 있다. (만약, 자식 테이블의 레코드를 삭제하거나 업데이트할 때 부모 테이블의 기본키를 참조하지 않으면 데이터베이스에서 오류를 발생시킨다.)
- **데이터 일관성 유지** : 외래키를 사용하면 부모 테이블에서 레코드를 업데이트하거나 삭제할 때 자식 테이블에서도 일관성을 유지할 수 있다.
- **관계 정의** : 외래 키를 사용하면 데이터베이스에서 테이블 간의 관계를 정의할 수 있다. 이를 통해 두 개 이상의 테이블에서 데이터를 쉽게 검색하고 JOIN할 수 있다.

---

## 2. 기본키 (*Primary Key*)
### 1) 기본키란?
- 후보키들중 메인으로 선정되는 키로 후보키의 성질을 가진다.
- 유일성 + 최소성을 가짐. 해당 레코드를 식별시에 기준이 되는 반드시 필요한 키다.

### 2) 기본키의 조건
- 값의 변동이 잦은 후보키는 기본키로 부적절하다.
- NULL값을 가질 수 있는 속성이 포함된 후보키는 부적절하다.
- 후보키중 단순한 키를 기본키로 선택한다.
- 하나의 테이블에는 반드시 하나의 기본키만 존재한다.

---

## 3. ER 다이어그램 (*Entity Relation Diagram*)
### 1) ERD란?
ERD는 데이터베이스 구조를 한 눈에 알아보기 위해 그려놓는 다이어그램 (개체와 관계를 중점적으로 표시하는 다이어그램)
![erd_image](./img.png)

### 2) ERD 표기법
- 개체(Entity): 개체란 단독으로 존재하는 객체를 의미, 동일한 객체는 존재하지 않는다. ERD에서 개체를 사각형으로 표기한다.
- 속성(Attribute): 속성은 개체가 가지고 있는 속성을 의미한다. ERD에서 원으로 표기한다. 이 중 기본키는 속성에 밑줄을 그어 표기한다.
- 관계(Relationship): 관계는 개체 간의 관계를 의미한다. ERD에서 개체를 서로 이으며 어떤 관계를 가지는가에 대해 마름모로 표기한다.
![erd_image2](image2.png)

---

## 4. 복합키 (*Composite key*)
### 1) 복합키란?
- 두개 이상의 컬럼을 묶어서 하나의 기본키로 지정하는것.
- 기본키는 하나의 테이블에 하나만 존재할 수 있고 하나 이상의 컬럼으로 구성되어 있다. → 기본키가 만약 복합키라면, 복합키 또한 당연히 유일성과 최소성을 만족해야한다.

---

## 5. 연관관계
![corrlation_image](image3.png)
### 1) 1:1 관계
- 하나의 엔티티가 다른 테이블의 엔티티 한 개와 연결된 경우이다.
- ❓ 왜 하나의 데이터베이스로 묶지 않을까?
- 너무 많은 칼럼들이 있을 때 나누어 보관하기 위해 이용!
- 보안상을 위해 민감한 정보를 보호할 때 이용!
- ex) 국가 - 수도, 사람 - 주민등록번호

### 2) 1:N 관계 (*일대다 관계*)
- 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 경우이다.
- ex) 국가 - 도시, 부모 - 자식, 관리자- 직원

### 3) N:M 관계 (*다대다 관계*)
- 양쪽 엔티티 모두 1:N 관계가 존재할 때 나올 수 있는 경우, 즉 서로가 서로를 1:N 관계로 보고 있다.
- 두 테이블의 대표키를 컬럼으로 갖는 연결 테이블을 생성해서 관리한다.
- ex) 수업 - 학생, 현실에서 일어나는 흔한 관계는 보통 다대다이다.

---

## 6. 정규화
### 1) 정규화란?
- 정규화란 이상현상이 있는 릴레이션을 분해하여 이상현상을 없애는 과정이다. 이상현상이 존재하는 릴레이션을 분해하여 여러 개의 릴레이션을 생성하게 된다. 이를 구분하여 정규형이 높아질수록 이상현상은 줄어들게 된다.
- 즉, 쉽게말하면 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다. 이러한 테이블을 분해하는 정규화 단계가 정의 되어 있다.

### 2) 정규화의 장점
- 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
- 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.

### 3) 정규화의 단점
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다.
- 질의에 대한 응답 시간이 느려질**수도**있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.
- 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.
- 만약 조인이 많이 발생하여 성능 저하가 나타나면 **반정규화(De-normalization)** 를 적용할 수도 있다.

### 4) 정규화 절차
1. 제1정규화
- 속성의 **원자성**을 확보한다.
- 원자성?: 트랜잭션 실행은 모두 완료되거나, 실패 시 실행 이전으로 돌아가야한다.
- 트랜직션?: DB 상태를 변화시키는 일련의 작업 단위이다.
- 속성의 중복값을 제거한다.
- 기본키(*Primary Key*)를 설정한다.

2. 제2정규화
- 기본키가 2개 이상의 속성으로 이루어진 경우, **부분 함수 종속성**을 제거(분해)한다.
- 부분 함수 종속성?: 기본키가 2개 이상인 칼럼으로 이루어진 경우에만 발생한다. 기본키가 1개이면 이 과정을 넘어간다.
- 복합 인스턴스에 대해 각 인스턴스의 종속적 중복을 삭제한다.

3. 제3정규화
- 기본키를 제외한 칼럼간에 종속성을 제거한다 -> 이행 함수 종속성을 제거한다!
- 이행 함수 종속?: 각각 X,Y,Z란 3개의 속성이 있을 때, X->Y,Y->Z이란 종속 관계가 있을 경우, X->Z가 성립될 때를 의미한다.
- 일반 속성의 종속성을 제거한다.

4. BCNF(더 제한적인 제3정규화)
- 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다.
- BCNF는 복수의 후보키가 있고, 후보키들이 **복합 속성**이어야 하며, 서로 **중첩**되어야 한다.

5. 제4정규화
- 여러 칼럼들이 하나의 칼럼을 종속시키는 경우, 분해하여 다중값 종속성을 제거한다.
- 다치 종속성을 제거한다.
- 다치 종속성?: 관계 데이터베이스에서 관계 속성 간에 성립하는 종속성의 일종이다.
6. 제5정규화
- 조인에 의해서 종속성이 발생되는 경우 분해한다.

---

## 5) 반정규화(*De-normalization*)
### 1) 반정규화란?
- 데이터베이스의 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법이다.
- 반정규화는**조회(select) 속도를 향상**시키지만, 데이터**모델의 유연성은 낮아**진다.
-
### 2) 그럼 반정규화를 왜 수행하는가?
- 정규화에 충실하여 종속성, 활용성은 향상 되었지만 수행속도가 느려진 경우
- 다량의 범위를 자주 처리해야하는 경우
- 특정 범위의 데이터만 자주 처리하는 경우
- 요약/집계 정보가 자주 요구되는 경우

### 3) 반정규화 절차
1. 대상 조사 및 검토 : 데이터 처리 범위, 통계성 프로세스, 테이블 조인 등을 확인합니다.
대량의 범위를 자주 처리하거나 특정 범위의 데이터만 자주 처리하는 경우를 파악합니다.
자주 요구되는 요약이나 집계 정보를 확인합니다.
2. 다른 방법 검토: 반정규화를 수행하기 전에 다른 방법을 먼저 고려합니다.
예를 들어, 뷰, 클러스터링, 인덱스 조정 등을 검토합니다.
- 클러스트링? → 클러스터링 인덱스는 인덱스 정보를 저장할 때, 물리적으로 정렬해서 저장하는 방법이다. → 조회 시 인접 블록을 연속적으로 읽기 때문에 성능이 향상된다.
3. 반정규화 수행: 테이블, 속성, 관계 등을 반정규화합니다.

### 4) 개선된 반정규화 절차
1. **계산된 컬럼 추가**
- 배치 프로그램으로 총판매액, 평균잔고, 계좌평가를 미리 계산하고 그 결과를 특정 칼럼에 추가한다.

2. **테이블 수직 분할**

- 하나의 테이블의 두 개 이상의 테이블로 분할한다. 즉, 칼럼을 분할하여 새로운 테이블을 만드는 것이다.

3. **테이블 수평분할**

- 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법이다.
238 changes: 238 additions & 0 deletions mission/chapter01/java_mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,238 @@
# Chapter 1. JAVA 추가 미션
### ‼️ 추가과제) 해당 키워드에 대해서 공부한 후 간단정리후 제출 & 면접질문 최소 한개 만들어서 제출 후 스터디 시간에 스터디원들과 질문하기!

## 1. Java의 접근제어자
### 1) 자바 접근제어자의 존재 이유 : 객체 지향의 4대 특성 中 캡슐화
자바에서 접근 제어자(Access Modifiers)는 클래스, 변수, 메소드 및 생성자에 대한 접근 수준을 설정하는 데 사용됩니다. 이를 통해 객체 지향 프로그래밍의 캡슐화 원칙을 구현하며, 클래스 내부의 데이터를 보호하고 외부에서의 무분별한 접근을 제한합니다.

왜냐하면 캡슐화는 객체의 상태를 외부에서 직접 접근하는 것을 막고, 객체가 제공하는 메소드를 통해서만 상태를 변경할 수 있도록 함으로써 프로그램의 안정성을 높이기 때문입니다. 접근 제어자는 이러한 캡슐화를 실현하는 핵심 요소입니다.
### 2) 클래스 멤버의 접근 제어자 종류
1. **Private**
- *private* 접근 제어자는 가장 제한적인 접근 수준을 제공한다.
- *private*으로 선언된 멤버는 해당 클래스 내에서만 접근 가능하고, **외부 클래스** or **상속받은 클래스**에서는 사용이 불가하다.
- *private*로 선언된 멤버는 getter-setter를 이용하여 접근하는 방식이 일반적이다.
- 이를 통해 해당 private 변수의 접근을 제어하고, 데이터의 무단 변경을 억제할 수 있다.
```java
public class Person {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}
```

---

2. **Default**
- *default* 접근 제어자는 같은 패키지 같은 패키지 내의 클래스들만 접근할 수 있도록 한다. 다른 패키지의 클래스에서는 접근할 수 없다.
- 같은 패키지 내의 클래스들 사이에서만 데이터 공유를 허용하고, 패키지 외부로는 데이터를 숨기기 위해 존재하기 때문이다. (패키지 단위의 캡슐화를 제공)
- 패키지 내부에서의 데이터 공유에 유용하게 작용한다.
- 패키지 내부의 클래스가 서로 밀접할 확률이 높고, 이를 공유해야 할 확률이 높기 때문이다. **허나 무분별한 default 접근 제어자의 사용은 지양해야 한다.**
```java
//Korea.java
package world;

public class Korea {
String fullname = "Repulic of Korea";
//앞에 접근제어자가 없기 때문에 default 접근제어자로 인식한다.
}
```

```java
//PrintWorld.java
package world; //Korea.java와 같은 패키지

public class PrintWorld {
String str = "Hello, ";

public static void main(String[] args) {
Korea korea = new Korea();
System.out.println(str + korea.fullname + "!");
//Korea 클래스의 fullname 변수를 사용할 수 있다.
//Hello, Republic of Korea!
}
}
```
- 이처럼 같은 패키지로 묶여있으면 default 접근 제어자로 설정된 변수에 접근 가능하다.

---

3. **Protect**
- *protect* 접근 제어자는 같은 패키지 내의 클래스 또는 다른 패키지의 상속받은 클래스에서 접근할 수 있도록 한다.
- 이는 상속 관계에 있는 클래스들 사이의 데이터 공유를 가능하게 한다.
- *default* 접근 제어자와 공통된 부분은 상속관계가 아닌 객체멤버를 호출할 때, 같은 패키지 일때만 가능하다.
- 그러나 차이점은 자식 클래스에서 부모 멤버를 호출할 때 발생한다. 자식 클래스일때 부모 멤버를 호출하면 protect의 경우 문제없이 작동한다.
```java
///Parents.java
///부모 클래스의 선언
package Package1;

public class Parents {
void defaultMethod {
System.out.println("default!");
}

protected void protectedMethod() {
System.out.println("protected!");
}
}
```
```java
///Child.java
package Package2;
import Package1.Parents;

public class Child() extends Parents {
defaultMethod(); //에러 발생! 패키지가 다르기 때문이다.
protectedMethod(); //문제 없이 정상 작동한다.
}

```

---

4. **Public**
- 접근 제어자가 public으로 설정되었다면 public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능하다.
```java
//Korea.java
package world;

public class Korea {
public String fullname = "Repulic of Korea";
//앞에 접근제어자가 없기 때문에 default 접근제어자로 인식한다.
}
```

```java
//PrintWorld.java
package house; //Korea.java와 다른 패키지임에도 불가하고 public은 문제가 없다.
import world.Korea;

public class PrintWorld {
String str = "Hello, ";

public static void main(String[] args) {
Korea korea = new Korea();
System.out.println(str + korea.fullname + "!");
//public이기 때문에 import를 한다면 접근이 어디서든 가능하다.
//Korea 클래스의 fullname 변수를 사용할 수 있다.
//Hello, Republic of Korea!
}
}
```

---


## 2. 클래스와 인터페이스
### 1) 클래스 (*Class*)
- 클래스는 여러 가지 멤버 변수와 메서드를 포함하며, 이들을 적절히 구성하여 객체의 동작을 정의한다.
- 멤버 변수 : 클래스 내에서 사용되는 변수, 클래스의 속성을 나타낸다. 인스턴스 변수라고도 불린다.
- 메세드 : 클래스 내에서 사용되는 함수, 클래스의 동작을 나타낸다. 인스턴스 메서드라고도 불린다.
- 생성자 : 클래스로부터 객체를 생성할 때 호출되는 특별한 메서드. 객체의 초기화를 수행한다.

```java
public class Dog {
//인스턴스 변수
String name;
int age;

//생성자
public Dog(String name, int age) {
this.name = name;
this.age = age;
}

//메서드
public void bow() {
System.out.println("멍멍");
}
}
```
### 2) 인터페이스 (*Interface*)
- 자바에서는 다중 상속을 지원하지 않지만, 인터페이스를 통해 이점을 제공한다.
- 인터페이스는 클래스 간의 중간 매개 역할을 하며, 추상 메소드와 상수만 포함할 수 있다.
- 반면, 추상 클래스는 추상 메소드 외에도 생성자, 필드, 일반 메소드를 가질 수 있다.
- 추상 클래스?: 하나 이상의 추상 메소드를 포함할 수 있으며, 일반 메소드, 필드, 생성자도 가질 수 있는 클래스이다.
- 이로 인해 자바는 다중 상속의 이점을 살리면서도 메소드 출처의 모호성을 피할 수 있다.

```java
interface Animal {public abstract void cry();}
///인터페이스의 구현, 인터페이스 안에 있는 메소드를 반드시 구현해야 한다.

class Dog implements Animal {
public void cry() {
System.out.println("멍멍!");
}
}

class Chick implements Animal {
public void cry() {
System.out.println("삐약삐약!");
}
}

public class Example {
public static void main(String[] args) {
Chick chick = new Chick();
Dog dog = new Dog();

chick.cry();
dog.cry();
//삐약삐약!
//멍멍!
}
}
```

---

## 3. 상속

### 1) 상속 (*inheritance*)?
- 상속이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다.
- 역시 객체 지향 4대 특성 중에 하나를 차지하고 있다.
- 상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
- 이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도 한다.
- 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 한다.

### 2) 상속의 장점
- 기존에 작성된 클래스를 재활용할 수 있다.
- 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면, 자식 클래스에서는 해당 멤버를 작성하지 않아도 된다.
- 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련한다.

### 3) 자식 클래스 (*child class*)
- 자식 클래스(child class)란 부모 클래스의 모든 특성을 물려받아 새롭게 작성된 클래스를 의미한다.
- class 자식클래스이름 extend 부모클래스이름 { ... }

```java
class Parent {
private int a = 10;
public int b = 20;
}

class Child extends Parent {
public int c = 30;
void display() {
System.out.println(a); //실행 오류: private이기 때문이다.
System.out.println(b); //정상 출력
System.out.println(c); //정상 출력
}
}

```
---

## 4. 면접 질문
### 상속과 인터페이스의 차이가 무엇일까요?
1) 상속 : 부모-자식 관계를 나타내며, 부모 클래스의 코드를 재사용하고 확장하는 방법
2) 인터페이스 : 클래스가 따라야 할 규약을 정의하여 다형성을 구현하는 방법

**상속과 인터페이스의 차이**
- 상속의 경우 하위 클래스에서 부모 클래스의 메서드를 전부 오버라이드할 필요는 없지만 인터페이스의 경우 반드시 구현해야 한다.
- 상속의 경우 단일 상속만이 가능하지만, 인터페이스는 다중 상속이 가능하다
2 changes: 2 additions & 0 deletions mission/chapter01/mission.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# 1주차 미션: ERD 그리기
![ERD](week1_erd.png)
Binary file added mission/chapter01/week1_erd.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 5844585

Please sign in to comment.