반응형
추상화(abstraction) vs 구체화(concretization)
1. 추상화(Abstraction)
"복잡한 현실 세계에서 핵심적인 속성과 기능만을 뽑아내는 과정"
예시
- 현실 세계에는 '사람'이라는 개념이 있다.
- 사람마다 이름, 나이, 성별, 키, 말하기, 걷기, 먹기 같은 다양한 속성과 동작(기능)을 가지고 있다.
- 이를 프로그래밍 관점에서 하나의 타입(클래스)으로 만들어 볼 수 있다.
class Person {
String name;
int age;
void speak() { ... }
void walk() { ... }
}
- 위의 `Person` 클래스는 "사람이라는 개념을 일반화(=추상화)"한 것이다. 👉 실제 사람이 아닌, 사람의 공통된 특징(속성/기능)만 뽑아 표현한 것!
추상화 특징 정리
- 복잡한 대상을 단순화하여 다룰 수 있게 함.
- 불필요한 세부사항은 감추고, 중요한 특징만 노출함.
- 추상화는 "설계"에 해당. 직접적인 실체는 아니다.
2. 구체화(Concretization, 실체화/인스턴스화)
"추상적인 설계(클래스)를 실제 사용 가능한 실체(객체)로 만드는 과정"
예시
- 위에서 만든 `Person` 클래스는 설계도일 뿐이다.
- 실제로 메모리에 존재하는 사람 객체를 만들려면 아래와 같이 코드를 작성해 주어야 한다.
Person p1 = new Person();
p1.name = "철수";
p1.age = 20;
Person p2 = new Person();
p2.name = "영희";
p2.age = 22;
- 이제 p1, p2는 실제로 존재하는 구체적인 사람 객체가 되었다.
체크 포인트
- 클래스는 설계도
- 객체는 실체
- 구체화는 추상화된 것을 현실에 적용하는 단계
- 클래스 = 붕어빵 틀 (설계도, 추상화)
- 객체 = 실제 붕어빵 (구체화된 실체)
추상화 vs 구체화
| 개념 | 설명 | 예시 |
| 추상화 | 공통 속성/기능만 뽑아내어 설계하는 것 | `Person` 클래스 |
| 구체화 | 추상화된 설계를 바탕으로 실제 객체를 만드는 것 | `new Person()` 통해서 철수, 영희 객체 생성 |
클래스 / 객체 / 추상 클래스 / 인터페이스
추상화와 구체화 개념을 기반으로, 클래스 / 객체 / 추상 클래스 / 인터페이스까지 연결해서 정리해 볼 수 있다.
🧩 객체지향 4단계 연결: 클래스 → 객체 → 추상 클래스 → 인터페이스
1. 클래스(Class)
현실 세계의 대상을 코드로 표현한 설계도 (추상화 결과)
- 속성(필드) + 기능(메서드)을 포함
- 현실 세계의 개념을 "프로그래밍 세계"로 옮기는 틀
class Animal {
String name;
void eat() {
System.out.println("먹는다");
}
}
2. 객체(Object, Instance)
클래스를 바탕으로 만들어낸 구체적인 실체 (구체화)
- 실제 메모리에 올라가는 데이터
- 클래스는 ‘틀’, 객체는 ‘붕어빵’
Animal cat = new Animal();
cat.name = "고양이";
cat.eat(); // "먹는다"
3. 추상 클래스(Abstract Class)
미완성 클래스 / 공통 로직은 포함하고, 구체적인 동작은 자식이 완성하도록 함
- `abstract` 키워드 사용
- 일부 구현은 제공, 나머지는 자식 클래스가 반드시 오버라이딩해야 함
- 객체 생성 ❌ (단독 사용 불가)
abstract class Animal {
String name;
void breathe() {
System.out.println("숨 쉰다");
}
// 자식이 반드시 정의해야 함
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("멍멍");
}
}
- `Dog`는 `sound()`를 반드시 구현해야 함!
4. 인터페이스(Interface)
기능만 선언하고 구현은 하지 않는 완전한 추상화
- `interface` 키워드 사용
- 모든 메서드는 public abstract
- 상속(implements)만으로 기능을 강제
interface Flyable {
void fly(); // 자동으로 public abstract
}
class Bird implements Flyable {
public void fly() {
System.out.println("날다");
}
}
- 인터페이스는 "이렇게 날 수 있어야 해"라는 약속만 있음 → 구현은 `Bird` 클래스에서
클래스 / 객체 / 추상 클래스 / 인터페이스 정리
| 구분 | 목적 | 특징 | 예시 |
| 클래스 | 설계도 | 일부 구현 포함 | class Animal |
| 객체 | 실체 | 메모리에 존재하는 데이터 | new Animal() |
| 추상 클래스 | 공통 기능 + 틀 제공 | 일부만 구현, 상속 필요 | abstract class Animal |
| 인터페이스 | 역할 정의 | 전부 미구현, 다중 구현 가능 | interface Flyable |
🤔 사용은 언제?
| 상황 | 사용 |
| 여러 객체가 비슷한 동작을 하지만 구체적 동작은 다를 때 | 추상 클래스 |
| 다양한 클래스가 공통된 기능만 갖도록 강제할 때 | 인터페이스 |
| 실질적인 속성과 기능을 정의할 때 | 클래스 |
| 실제 프로그램에서 동작할 실체가 필요할 때 | 객체 |
반응형