diff --git "a/week05/\353\260\225\354\236\254\355\230\225/5\354\243\274\354\260\250 \355\225\231\354\212\265\354\240\225\353\246\254.md" "b/week05/\353\260\225\354\236\254\355\230\225/5\354\243\274\354\260\250 \355\225\231\354\212\265\354\240\225\353\246\254.md" new file mode 100644 index 0000000..8c9a59b --- /dev/null +++ "b/week05/\353\260\225\354\236\254\355\230\225/5\354\243\274\354\260\250 \355\225\231\354\212\265\354\240\225\353\246\254.md" @@ -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) 기능이 필요할 수 있죠. +이럴 때, 수영이나 날기 같은 역할은 인터페이스로 만들어서 필요한 동물만 구현하게 한다. + +이때의 장점으로는 코드가 더 유연하고, 여러 기능을 조합해서 쓸 수 있다는 것이지만, 구조가 복잡해질 수 있다는 단점이 있다. + +추상 클래스와 여러 인터페이스를 동시에 구현하다 보면, 어떤 기능이 어디 있는지 헷갈릴 수 있으며 유지보수가 어려워질 가능성도 있다. \ No newline at end of file