Skip to content

Commit

Permalink
πŸ“ [Docs]: chapter 7-5 (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
luke0408 committed Aug 11, 2023
1 parent 7346d2d commit b9a45fb
Showing 1 changed file with 175 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,177 @@
# 클래슀
> μž‘μ„±μž:
> μž‘μ„±μž: μ΅œμ„ κ·œ
## λͺ©μ°¨
## λͺ©μ°¨
- [클래슀](#클래슀)
- [λͺ©μ°¨](#λͺ©μ°¨)
- [ν΄λž˜μŠ€λŠ” 좔상 데이터 νƒ€μž…μΈκ°€?](#ν΄λž˜μŠ€λŠ”-좔상-데이터-νƒ€μž…μΈκ°€)
- [νƒ€μž… 좔상화](#νƒ€μž…-좔상화)
- [객체 지ν–₯](#객체-지ν–₯)
- [좔상 데이터 νƒ€μž…μ—μ„œ 클래슀둜](#좔상-데이터-νƒ€μž…μ—μ„œ-클래슀둜)
- [클래슀: Employee](#클래슀-employee)
- [변경을 κΈ°μ€€μœΌλ‘œ μ„ νƒν•˜λΌ](#변경을-κΈ°μ€€μœΌλ‘œ-μ„ νƒν•˜λΌ)
- [좔상 데이터 νƒ€μž… μœ„λ°˜ 사항 check list](#좔상-데이터-νƒ€μž…-μœ„λ°˜-사항-check-list)
- [객체 지ν–₯ μœ„λ°˜ 사항 check list](#객체-지ν–₯-μœ„λ°˜-사항-check-list)
- [좔상 데이터 νƒ€μž… vs 객체지ν–₯](#좔상-데이터-νƒ€μž…-vs-객체지ν–₯)
- [ν˜‘λ ₯이 μ€‘μš”ν•˜λ‹€](#ν˜‘λ ₯이-μ€‘μš”ν•˜λ‹€)

## ν΄λž˜μŠ€λŠ” 좔상 데이터 νƒ€μž…μΈκ°€?
> λŒ€λΆ€λΆ„μ˜ ν”„λ‘œκ·Έλž˜λ° μ„œμ μ—μ„œλŠ” 클래슀λ₯Ό 좔상 데이터 νƒ€μž…μœΌλ‘œ μ„€λͺ…ν•œλ‹€. <br>
> κ·ΈλŸ¬λ‚˜ λͺ…ν™•ν•œ μ˜λ―Έμ—μ„œ 좔상 데이터 νƒ€μž…κ³Ό ν΄λž˜μŠ€λŠ” λ™μΌν•˜μ§€ μ•Šλ‹€.
<center>

|객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° (Object-Oriented Programming)|객체기반 ν”„λ‘œκ·Έλž˜λ°(Object-Based Programming)|
|:---|:---|
|- 상속과 λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 기법|- 상속과 λ‹€ν˜•μ„±μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” 좔상 데이터 νƒ€μž… 기반의 ν”„λ‘œκ·Έλž˜λ° 기법|
|- 클래슀: 절차λ₯Ό μ£Όμƒν™”ν•œ 것|- 좔상 데이터 νƒ€μž…: Type을 μΆ”μƒν™”ν•œ 것|

</center>

### νƒ€μž… 좔상화

<center>

![image](https://github.com/luke0408/study_for_object/assets/98688494/239e5426-10ab-4823-95cd-32a7cef1a564)

</center>

- κ°œλ³„ μ˜€νΌλ ˆμ΄μ…˜μ΄ λͺ¨λ“  κ°œλ…μ μΈ νƒ€μž…μ— λŒ€ν•œ κ΅¬ν˜„μ„ 포괄 ν•˜λ„λ‘ ν•¨μœΌλ‘œμ¨ ν•˜λ‚˜μ˜ 물리적인 νƒ€μž… μ•ˆμ— 전체 νƒ€μž„μ„ κ°μΆ˜λ‹€.
- νƒ€μž… μΆ”μƒν™”λŠ” μ˜€νΌλ ˆμ΄μ…˜μ„ κΈ°μ€€μœΌλ‘œ νƒ€μž…μ„ ν†΅ν•©ν•˜λŠ” 데이터 좔상화 기법이닀.

### 객체 지ν–₯

<center>

![image](https://github.com/luke0408/study_for_object/assets/98688494/07e8a3b6-188d-40af-97f2-2a7f7737cc0e)

</center>

- νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ μ˜€νΌλ ˆμ΄μ…˜μ„ λ¬ΆλŠ”λ‹€.
- 두 가지 μ΄μƒμ˜ 클래슀둜 뢄리할 경우 κ³΅ν†΅λ‘œμ§μ„ 어디에 λ‘˜ 것인지가 이슈
- 곡톡 λ‘œμ§μ„ μ œκ³΅ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•œ 방법은 곡톡 λ‘œμ§μ„ 포함할 λΆ€λͺ¨ 클래슀λ₯Ό μ •μ˜ν•˜κ³  상속 μ‹œν‚¨λ‹€.
- ν΄λΌμ΄μ–ΈνŠΈλŠ” λΆ€λͺ¨ 클래슀 μ°Έμ‘°μžμ— λŒ€ν•΄ 메세지λ₯Ό μ „μ†‘ν•˜λ©΄ μ‹€μ œ ν΄λž˜μŠ€κ°€ 무엇인지에 따라 λ‹€λ₯Έ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœλ‹€.
- μ‹€μ œλ‘œ λ‚΄λΆ€μ—μ„œ μˆ˜ν–‰λ˜λŠ” μ ˆμ°¨λŠ” λ‹€λ₯΄μ§€λ§Œ 클래슀λ₯Ό μ΄μš©ν•œ λ‹€ν˜•μ„±μ€ μ ˆμ°¨μ— λŒ€ν•œ 차이점을 κ°μΆ˜λ‹€.
- λ”°λΌμ„œ 객체지ν–₯은 절차 좔상화(procedural abstraction)이닀.

## 좔상 데이터 νƒ€μž…μ—μ„œ 클래슀둜

### 클래슀: Employee

- λ‹€μŒκ³Ό 같은 Employee 클래슀λ₯Ό μ •μ˜ν•œλ‹€κ³  κ°€μ •ν•˜μž.
- Employee ν΄λž˜μŠ€λŠ” 이름과 κΈ‰μ—¬λ₯Ό 가진닀.
- Employee ν΄λž˜μŠ€λŠ” μ •κ·œ 직원과 μ•„λ₯΄λ°”μ΄νŠΈ 지원 νƒ€μž…μ΄ κ³΅ν†΅μ μœΌλ‘œ κ°€μ Έμ•Ό ν•˜λŠ” 속성과 λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•œλ‹€.

```java
public abstract class Employee {
private String name;
private int basePay;

public Employee(String name, int basePay) {
this.name = name;
this.basePay = basePay;
}

abstract int calculatePay(int taxRate);

abstract int monthlyPay();
}
```

- μ •κ·œ 직원

```java
public class SalariedEmployee extends Employee {
SalariedEmployee(String name, int basePay) {
super(name, basePay);
}

@Override
int calculatePay(int taxRate) {
return basePay - (basePay * taxRate);
}

@Override
int monthlyPay() {
return basePay
}
}
```

- μ•„λ₯΄λ°”μ΄νŠΈ 직원

```java
public class HourlyEmployee extends Employee {
private int timeCard;

HourlyEmployee(String name, int basePay, int timeCard) {
super(name, basePay);
this.timeCard = timeCard;
}

@Override
int calculatePay(int taxRate) {
return (basePay * timeCard) - ((basePay * timeCard) * taxRate);
}

@Override
int monthlyPay() {
return 0;
}
}
```

- μΈμŠ€ν„΄μŠ€ 생성

```java
Employee[] employees = {
new SalariedEmployee("John", 1000),
new SalariedEmployee("Mary", 1200),
new SalariedEmployee("Steve", 1400),
new HourlyEmployee("John", 1000, 160),
new HourlyEmployee("Mary", 1200, 180),
new HourlyEmployee("Steve", 1400, 200)
};
```

## 변경을 κΈ°μ€€μœΌλ‘œ μ„ νƒν•˜λΌ
> λ‹¨μˆœνžˆ 클래슀λ₯Ό κ΅¬ν˜„ λ‹¨μœ„λ‘œ μ‚¬μš©ν•œλ‹€λŠ” 것이 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λŠ” 것이 μ•„λ‹ˆλ‹€. <br>
> νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ 절차λ₯Ό 좔상화지 μ•Šμ•˜λ‹€λ©΄ 그것은 객체지ν–₯ λΆ„ν•΄κ°€ μ•„λ‹ˆλ‹€.
### 좔상 데이터 νƒ€μž… μœ„λ°˜ 사항 check list

- 클래슀 내뢀에 μΈμŠ€ν„΄μŠ€μ˜ νƒ€μž…μ„ ν‘œν˜„ν•˜λŠ” λ³€μˆ˜κ°€ μžˆλŠ”κ°€?
- μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ €μž₯된 값을 기반으둜 λ©”μ„œλ“œ λ‚΄μ—μ„œ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ κ΅¬λΆ„ν•˜λŠ” 방식은 객체 지ν–₯을 μœ„λ°˜ν•˜λŠ” κ²ƒμœΌλ‘œ κ°„μ£Ό

### 객체 지ν–₯ μœ„λ°˜ 사항 check list

<center>

![image](https://github.com/luke0408/study_for_object/assets/98688494/ea3605fe-92c8-4150-953e-766569e9f202)

</center>

- νƒ€μž… λ³€μˆ˜λ₯Ό μ΄μš©ν•œ 쑰건문으둜 κ΅¬λΆ„ν•˜λŠ”κ°€?
- ν΄λΌμ΄μ–ΈνŠΈκ°€ 객체의 νƒ€μž…μ„ ν™•μΈν•˜κ³  λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ²Œ ν•΄μ„œλŠ” μ•ˆλ¨
- 객체가 메세지λ₯Ό μ²˜λ¦¬ν•  μ μ ˆν•œ λ©”μ„œλ“œλ₯Ό μ²˜λ¦¬ν•˜κ²Œ 해야함

- OCP(Open-Closed Principle) 개방-폐쇄 원칙을 μœ„λ°˜ν•˜λŠ”κ°€?
- OCPλž€ κΈ°μ‘΄ μ½”λ“œμ— μ•„λ¬΄λŸ° 영ν–₯도 λ―ΈμΉ˜μ§€ μ•Šκ³  μƒˆλ‘œμš΄ 객체 μœ ν˜•κ³Ό ν–‰μœ„λ₯Ό μΆ”κ°€ν•  수 μžˆλŠ” 객체지ν–₯의 νŠΉμ„±μ΄λ‹€.
- κΈ°μ‘΄μ½”λ“œμ—μ„œ νŠΉμ„± λ³€μˆ˜μ— λŒ€ν•œ λΆ„κΈ° 둜직이 μžˆμ—ˆλ‹€λ©΄, μƒˆλ‘œμš΄ μš”κ΅¬μ‚¬ν•­μ΄ μžˆλŠ” 경우 μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.
- ν•˜μ§€λ§Œ 객체지ν–₯을 μ΄μš©ν•˜λ©΄ μ½”λ“œ μˆ˜μ •μ—†μ΄λ„ μƒˆλ‘œμš΄ μœ ν˜•κ³Ό ν–‰μœ„λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€.

### 좔상 데이터 νƒ€μž… vs 객체지ν–₯

||좔상 데이터 νƒ€μž…|객체지ν–₯|
|:---:|:---|:---|
|선택 κΈ°μ€€|μ˜€νΌλ ˆμ΄μ…˜ μΆ”κ°€κ°€ λΉˆλ²ˆν•œ 경우|νƒ€μž… μΆ”κ°€κ°€ λΉˆλ²ˆν•œ 경우|
|νŠΉμ§•|- 좔상데이터 νƒ€μž…μ˜ 경우 일일이 μƒˆλ‘œμš΄ νƒ€μž…μ— λŒ€ν•΄ μ²΄ν¬ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.<br>- 객체지ν–₯의 경우 μ½”λ“œ μˆ˜μ •μ—†μ΄ μƒˆλ‘œμš΄ 클래슀λ₯Ό 상속 계측에 μΆ”κ°€ν•˜λ©΄ λœλ‹€.|- 객체지ν–₯의 경우 μƒˆλ‘œμš΄ μ˜€νΌλ ˆμ΄μ…˜μ„ μΆ”κ°€ν•˜κΈ° μœ„ν•΄μ„œλŠ” 상속 계측에 μ†ν•˜λŠ” λͺ¨λ“  클래슀λ₯Ό ν•œλ²ˆμ— μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.<br>- 좔상 데이터 νƒ€μž…μ˜ κ²½μš°μ—λŠ” 전체 νƒ€μž…μ— λŒ€ν•œ κ΅¬ν˜„ μ½”λ“œκ°€ ν•˜λ‚˜μ˜ κ΅¬ν˜„μ²΄μ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€.<br>- λ”°λΌμ„œ μƒˆλ‘œμš΄ μ˜€νΌλ ˆμ΄μ…˜μ„ μΆ”κ°€ν•˜λŠ” μž‘μ—…μ΄ μƒλŒ€μ μœΌλ‘œ κ°„λ‹¨ν•˜λ‹€|

## ν˜‘λ ₯이 μ€‘μš”ν•˜λ‹€
> 객체지ν–₯μ—μ„œ μ€‘μš”ν•œ 것은 μ—­ν• , μ±…μž„, ν˜‘λ ₯이닀.
- λ‹¨μˆœν•˜κ²Œ μ˜€νΌλ ˆμ΄μ…˜κ³Ό νƒ€μž…μ„ ν‘œμ— 적어놓고 클래슀 계측에 μ˜€νΌλ ˆμ΄μ…˜μ˜ κ΅¬ν˜„ 방법을 λΆ„λ°°ν•œλ‹€κ³  ν•΄μ„œ 객체지ν–₯적인 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ„€κ³„ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

- ν˜‘λ ₯μ΄λΌλŠ” λ¬Έλ§₯을 κ³ λ €ν•˜μ§€ μ•Šκ³  객체λ₯Ό κ³ λ¦½μ‹œν‚¨μ±„ μ˜€νΌλ ˆμ΄μ…˜μ˜ κ΅¬ν˜„ 방식을 νƒ€μž…λ³„λ‘œ λΆ„λ°°ν•˜λŠ” 것은 μ˜¬λ°”λ₯Έ 접근법이 μ•„λ‹ˆλ‹€.

- νƒ€μž… 계측과 λ‹€ν˜•μ„±μ€ ν˜‘γ…‡λ ₯μ΄λΌλŠ” λ¬Έλ§₯μ•ˆμ—μ„œ μ±…μž„μ„ μˆ˜ν–‰ν•˜λŠ” 방법에 κ΄€ν•΄ κ³ λ―Όν•œ 결과물이어야 ν•˜λ©° κ·Έ μžμ²΄κ°€ λͺ©μ μ΄ λ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€.

0 comments on commit b9a45fb

Please sign in to comment.