Skip to content
Open
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
154 changes: 154 additions & 0 deletions week05/박재형/5주차 학습정리.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
# 5주차

## 1️⃣ 객체지향 프로그래밍(OOP) 4가지 특징

OOP는 **소프트웨어를 객체 단위로 설계**하고, 객체 간의 상호작용으로 프로그램을 구성하는 방식이다. OOP의 핵심 특징은 다음과 같다.

### ① 캡슐화(Encapsulation)

- **정의**: 객체의 데이터(속성)와 메서드(기능)를 하나로 묶고, 외부에서 직접 접근하지 못하도록 숨기는 것
- **장점**
- 데이터 보호: 객체 내부 상태를 외부에서 마음대로 변경할 수 없다
- 유지보수 용이: 내부 구현 변경 시 외부 코드에 영향을 최소화할 수 있다
- **자바에서 표현**
- `private`, `protected` 접근 제한자를 사용하여 멤버 변수를 보호한다
- `public` 메서드를 통해 필요한 기능만 외부에 제공한다

---

### ② 상속(Inheritance)

- **정의**: 기존 클래스의 속성과 기능을 물려받아 새로운 클래스를 만드는 것
- **장점**
- 코드 재사용성 증가: 이미 구현된 기능을 다시 작성할 필요가 없다
- 계층 구조 표현: 공통 속성과 동작을 부모 클래스에 정의하고, 세부 기능을 자식 클래스에서 구현할 수 있다
- **자바에서 표현**
- `extends` 키워드를 사용하여 부모 클래스의 기능을 상속한다
- 자식 클래스는 부모 클래스의 메서드를 그대로 사용하거나 필요에 따라 재정의할 수 있다

---

### ③ 다형성(Polymorphism)

- **정의**: 하나의 타입이 여러 형태의 객체를 다룰 수 있는 성질이다

즉, **같은 이름의 기능 호출이 실제 객체에 따라 다른 동작을 수행**할 수 있다

- **장점**
- 코드 유연성 향상: 상위 타입으로 여러 하위 타입 객체를 다룰 수 있다
- 유지보수성 향상: 조건문이나 타입 확인 코드가 줄어 코드가 깔끔하다
- 확장성 향상: 새로운 객체가 추가되어도 기존 코드를 거의 수정하지 않아도 된다
- **자바에서 지원 방법**
- 상속과 오버라이딩: 부모 타입 참조 변수로 자식 객체를 다루고, 런타임에 실제 메서드가 실행된다
- 메서드 오버로딩: 같은 이름의 메서드를 매개변수에 따라 여러 개 정의하여 컴파일 시점에 선택된다
- 제네릭: 타입에 독립적인 코드를 작성하여 여러 객체를 유연하게 처리한다

---

### ④ 추상화(Abstraction)

- **정의**: 객체가 가져야 할 **속성과 기능 중 핵심만 추출**하고 불필요한 부분은 숨기는 것
- **장점**
- 복잡도 감소: 필요한 정보와 기능만 외부에 노출한다
- 설계 명확화: 공통 인터페이스나 추상 클래스로 구조를 정의한다
- **자바에서 표현**
- 추상 클래스(`abstract class`)와 인터페이스(`interface`)를 사용한다
- 추상 메서드로 “반드시 구현해야 하는 기능”을 강제할 수 있다

## 2️⃣ 상속과 오버로딩/오버라이딩

### 상속(Inheritance)

- 부모 클래스가 가진 속성과 기능을 자식 클래스가 물려받아 사용할 수 있다
- 장점
- 코드 재사용성이 높다
- 공통 기능을 부모에 두고, 특화 기능만 자식에 추가할 수 있다
- 자바에서는 `extends` 키워드로 상속을 구현한다
- 주의점
- 단일 상속만 가능하므로, 다중 상속이 필요한 경우 인터페이스로 해결한다
- 상속 구조가 깊어질수록 이해와 유지보수가 어려워진다

### 오버로딩(Overloading)

- **정의**: 같은 이름의 메서드를 매개변수의 개수, 타입, 순서를 달리하여 여러 번 정의하는 것
- **특징**
- 컴파일 시점에 어떤 메서드를 호출할지 결정된다
- 이름이 같아 코드가 직관적이고 깔끔해진다
- **사용 시점**
- 같은 동작이지만 입력값 종류나 개수가 다를 때
- 사용자가 같은 이름으로 다양한 상황에 맞게 메서드를 호출하도록 하고 싶을 때

### 오버라이딩(Overriding)

- **정의**: 부모 클래스의 메서드를 자식 클래스에서 재정의하는 것
- **특징**
- 런타임 시점에 실제 객체 타입에 따라 메서드가 실행된다
- 상속 관계에서만 가능하다
- 이름, 매개변수, 반환 타입이 부모와 동일해야 한다
- private, static, final 메서드는 오버라이딩할 수 없다
- **사용 시점**
- 부모 클래스의 기능을 자식 클래스 환경에 맞게 맞춤 설정할 때
- 다형성을 구현할 때

## 3️⃣ 다형성(Polymorphism)

- **정의**: 하나의 참조 변수가 여러 형태의 객체를 참조하고, 같은 메시지를 보내도 객체별로 다른 결과를 반환할 수 있는 성질
- **장점**
- 코드 재사용성 증가
- 조건문 없이 다양한 객체 처리 가능
- 새로운 객체가 추가되어도 기존 코드 수정 최소화
- 유지보수성과 확장성이 높다
- **자바에서 지원 방법**
- 상속과 오버라이딩: 부모 타입 참조 변수로 자식 객체를 다루고, 런타임 시 실제 메서드 호출
- 오버로딩: 컴파일 시점에 매개변수 타입에 맞게 메서드 선택
- 제네릭: 타입에 독립적인 코드를 작성해 여러 객체 유연 처리

## 4️⃣ 추상 클래스와 인터페이스

### 추상 클래스(Abstract Class)

- 공통 기능 일부는 구현하고, 나머지는 자식이 반드시 구현하도록 강제하는 클래스
- 특징
- 인스턴스 생성 불가
- 일반 메서드와 추상 메서드 혼합 가능
- 필드와 생성자 사용 가능
- 단일 상속만 가능
- 사용 시점
- 여러 클래스가 공통 속성과 기능을 공유하면서, 일부 기능만 자식에게 강제로 구현하게 하고 싶을 때

### 인터페이스(Interface)

- **순수 규약**만 정의하고, 구현은 하위 클래스가 담당
- 특징
- 필드(상태)는 가질 수 없고, 상수만 선언 가능
- 다중 구현 가능
- Java 8 이상에서는 default 메서드로 기본 구현 제공 가능
- 사용 시점
- 여러 클래스가 공통된 기능을 반드시 구현하도록 강제하고 싶을 때
- 다중 역할을 한 클래스에 능력을 부여하고 싶을 때

### 추상 클래스 vs 인터페이스 비교

| 구분 | 추상 클래스 | 인터페이스 |
| --- | --- | --- |
| 목적 | 공통 기능 + 일부 강제 구현 | 기능 규약 강제, 다중 역할 가능 |
| 인스턴스 생성 | 불가 | 불가 |
| 상속/구현 | 단일 상속 | 다중 구현 가능 |
| 메서드 | 일반 + 추상 메서드 | 추상 메서드, default/static/private 가능 |
| 필드 | 상태(멤버 변수) 가능 | 상수만 가능 |
| 생성자 | 가능 | 없음 |

### 선택 기준

- 공통 기능과 상태 공유가 필요하면 **추상 클래스**
- 규약 강제와 다중 역할이 필요하면 **인터페이스**

추상 클래스와 인터페이스를 함께 사용하는 경우도 있는데, 이는 ‘공통적인 기본 동작은 추상 클래스에서 제공하고 추가적 역활 및 기능은 인터페이스에서 제공할 때 주로 나타난다.

예를 들어, 동물(Animal)이라는 추상 클래스가 있고, 동물마다 소리내기(sound) 같은 공통 동작은 추상 클래스에서 정의한다.
그런데 어떤 동물은 수영(Swimmable), 어떤 동물은 날기(Flyable) 기능이 필요할 수 있죠.
이럴 때, 수영이나 날기 같은 역할은 인터페이스로 만들어서 필요한 동물만 구현하게 한다.

이때의 장점으로는 코드가 더 유연하고, 여러 기능을 조합해서 쓸 수 있다는 것이지만, 구조가 복잡해질 수 있다는 단점이 있다.

추상 클래스와 여러 인터페이스를 동시에 구현하다 보면, 어떤 기능이 어디 있는지 헷갈릴 수 있으며 유지보수가 어려워질 가능성도 있다.