Notice
Recent Posts
Recent Comments
Link
쯔이's Dev
객체지향 프로그래밍(Object-Oriented Programming, OOP)의 3대 특징 본문
반응형
1. 캡슐화 (Encapsulation)
- 정의: 데이터(속성)와 그 데이터를 조작하는 메서드(행동)를 하나의 클래스 안에 묶는 것을 말합니다.
- 목적: 데이터의 은닉성을 높이고, 외부에서 객체의 내부 구현을 알지 못해도 사용할 수 있도록 인터페이스를 제공합니다.
- 특징
- 접근 제어자: private, protected, public 등을 사용하여 데이터의 접근 범위를 제한합니다.
- 외부에서는 객체의 속성에 직접 접근하지 않고, getter와 setter 메서드를 통해 간접적으로 접근합니다.
public class Person {
private String name; // 외부에서 직접 접근 불가
private int age;
public String getName() {
return name; // 외부에서 name 값 가져오기
}
public void setName(String name) {
this.name = name; // 외부에서 name 값 설정
}
}
2. 상속 (Inheritance)
- 정의: 기존 클래스(부모 클래스 또는 슈퍼클래스)의 속성과 메서드를 다른 클래스(자식 클래스 또는 서브클래스)가 물려받는 것을 말합니다.
- 목적: 코드의 재사용성을 높이고, 계층적 관계를 통해 확장성을 제공합니다.
- 특징
- 부모 클래스의 공통적인 기능을 자식 클래스에서 재사용합니다.
- 자식 클래스는 부모 클래스의 기능을 그대로 사용하거나, 필요에 따라 오버라이딩(재정의)하여 동작을 변경할 수 있습니다.
public class Animal {
public void eat() {
System.out.println("This animal eats food.");
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("This dog eats dog food.");
}
}
3. 다형성 (Polymorphism)
- 정의:
- 같은 이름의 메서드나 연산자가 상황에 따라 다르게 동작하도록 만드는 것.
- 같은 타입으로 여러 객체를 참조하거나 다양한 방식으로 동작할 수 있는 능력
- 목적 : 유연한 설계를 가능하게 하고, 코드의 가독성과 확장성을 높인다.
특징
.* 오버로딩 (Overloading)
- 같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 다르게 정의하는 것
- 상속과 무관하게 클래스 내부에서 같은 이름의 메서드를 여러 개 정의하는 것. 정적 다형성( 컴파일 시점의 다형성(Compile-time Polymorphism))
특징:
- 같은 클래스 내에서 이루어집니다.
- 메서드 이름은 같지만 매개변수의 시그니처(타입, 개수, 순서)가 다릅니다.
- 상속과는 직접적인 관련이 없습니다.
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
* 오버라이딩 (Overriding)
- 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 사용하는 것.
- 상속 관계에서 부모 클래스의 메서드를 재정의하여, 동적 다형성을 구현하는 방법(런타임 다형성)
특징:
- 상속 관계에서 이루어집니다.
- 부모 클래스의 메서드를 자식 클래스에서 재정의(동일한 이름, 동일한 매개변수 시그니처)합니다.
- 객체의 실제 타입에 따라 동작이 결정됩니다.
- 오버라이딩은 다형성을 구현하는 방법이며, 업캐스팅과 함께 자주 사용 - 업캐스팅이 된 상태에서 호출되는 메서드는 오버라이딩된 메서드
public class Animal {
public void sound() {
System.out.println("Animal makes a sound");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("Cat meows");
}
}
참조 변수의 타입이 Dog나 Cat처럼 특정 클래스를 의미하므로, 이를 해당 클래스로 이해하셔도 됩니다.
상속 vs 다형성
- 상속은 클래스 간의 관계를 정의하여 재사용성을 높이는 개념입니다.
- 다형성은 상속 또는 인터페이스를 기반으로 같은 이름의 메서드가 다양한 방식으로 동작하도록 구현하는 것입니다.
>> 객체지향 프로그래밍(OOP)의 4대 특징으로 이야기할 때는 **추상화(Abstraction)**까지 포함해서 설명한다.
4. 추상화 (Abstraction)
- 정의: 복잡한 시스템에서 꼭 필요한 핵심적인 속성과 동작만을 드러내고, 불필요한 세부 사항은 숨기는 것을 말합니다.
- 목적: 복잡한 시스템을 단순화하고, 객체가 제공해야 할 최소한의 인터페이스만 드러냅니다.
- 특징:
- 추상 클래스(Abstract Class)와 인터페이스(Interface)를 통해 구현.
- 추상화를 사용하면 개발자는 구체적인 구현보다는 객체가 수행해야 하는 행동에 집중할 수 있습니다.
(1) 추상 클래스
추상 클래스는 공통 속성과 동작을 정의하며, 구체적인 하위 클래스가 이를 상속받아 사용합니다.
// 추상 클래스
public abstract class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void sound(); // 추상 메서드
}
// 구체적인 클래스
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void sound() {
System.out.println(getName() + " barks");
}
}
(2) 인터페이스
- 추상화를 구현하기 위한 구체적인 도구 또는 구조
- 자바에서 인터페이스는 **행동(메서드의 시그니처)**만을 정의하며, 실제 구현은 이를 구현하는 클래스에서 제공
- 특징:
- 메서드의 시그니처만 정의하고, 구현은 제공하지 않음(자바 8 이후부터는 default 메서드를 통해 구현 가능).
- 다중 구현 가능.
- 인터페이스는 클래스가 아닌 행동 계약을 정의하는 역할이다.
public interface Vehicle {
void startEngine();
void stopEngine();
}
public class Car implements Vehicle {
@Override
public void startEngine() {
System.out.println("Car engine started");
}
@Override
public void stopEngine() {
System.out.println("Car engine stopped");
}
}
>> 추상 클래스와 인터페이스의 차이
특징 | 추상 클래스 | 인터페이스 |
목적 | 추상화(공통 속성과 동작을 제공하며 기본 구현 가능) | 추상화(구현 클래스가 반드시 따라야 할 "행동 계약" 정의) |
구현 | 추상 메서드와 일반 메서드(구현된 메서드)를 모두 포함 가능 | 메서드는 기본적으로 추상적이고, 자바 8 이상에서만 default 메서드로 기본 구현 가능 |
상속 | 단일 상속만 가능 | 다중 구현 가능 |
사용 사례 | 부모-자식 관계(공통 속성과 동작) | 서로 관련 없는 클래스들 간의 공통된 행동 계약 제공 |
멤버 변수 | 인스턴스 변수, 정적 변수 모두 가능 | public static final로 정의된 상수만 허용 |
접근 제한자 | private, protected, public 등 모든 접근 제한자 사용 가능 | 메서드는 기본적으로 public abstract, 변수는 public static final |
예제 | - abstract class Shape - abstract class Animal |
- interface Drawable - interface Comparable |
상속 키워드 | extends를 사용하여 상속 | implements를 사용하여 구현 |
>> 추상 클래스와 인터페이스는 언제 사용하나요?
추상 클래스 사용 시점
- 부모 클래스에서 기본 구현을 제공해야 할 때.
- 클래스 간에 **공통적인 상태나 동작(필드와 메서드)**가 있을 때.
- 상속 구조가 분명히 존재하고, 계층적인 관계를 형성할 때.
인터페이스 사용 시점
- 클래스 간에 공통적인 행동 계약을 정의해야 할 때.
- 다중 구현이 필요할 때.
- 서로 관련 없는 클래스들에게 공통된 기능을 강제하고 싶을 때.
- 예: Flyable, Drawable, Comparable.
요약
- 추상화는 객체지향 설계의 개념으로, 중요한 요소만 노출하고 불필요한 세부 사항을 숨기는 것.
- 인터페이스는 추상화를 구현하기 위한 도구로, 클래스가 따라야 할 행동 계약을 정의.
둘은 관련이 있지만, 추상화가 더 큰 개념이고 인터페이스는 이를 구현하는 도구라고 보면 됩니다
4대 특징 요약
캡슐화 | 데이터와 메서드를 하나로 묶고, 데이터의 접근을 제한 | 정보 은닉, getter/setter |
상속 | 부모 클래스의 속성과 메서드를 자식 클래스에 물려주는 것 | 코드 재사용성 |
다형성 | 같은 이름의 메서드나 객체가 상황에 따라 다른 방식으로 동작하는 것 | 오버로딩, 오버라이딩 |
추상화 | 꼭 필요한 기능만 노출하고, 세부 구현은 숨기는 것 | 추상 클래스, 인터페이스 |
>> OOP의 3대 특징 vs 4대 특징
- OOP의 3대 특징으로 이야기할 때는 주로 기본적인 동작 원리(캡슐화, 상속, 다형성)에 초점을 둡니다.
- OOP의 4대 특징은 추상화를 포함하여 객체지향 설계의 더 큰 그림을 이해하는 데 도움을 줍니다.
728x90
반응형