프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다.
OOP 기본 개념 및 특징
- 객체 지향 프로그래밍과 그 특징에 대해 설명하십시오.
- 추상화란 무엇입니까?
- 캡슐화란 무엇입니까?
- 추상화와 캡슐화의 차이점은 무엇입니까?
- 객체 지향 프로그래밍 언어의 이점을 나열하십시오.
- 전통적인 프로그래밍 언어와 객체 지향 프로그래밍 언어의 차이점은 무엇입니까?
1. 객체 지향 프로그래밍과 그 특징에 대해 설명하십시오.
객체 지향 프로그래밍(OOP)은 프로그램을 객체라는 독립적 단위의 집합으로 모델링하여 현실 세계의 개념을 소프트웨어적으로 표현하는 기법입니다. 이러한 객체는 상태(field)와 동작(method)을 캡슐화하여 데이터와 로직을 함께 관리할 수 있어, 코드 재사용성 및 확장성 등의 장점이 있습니다. 이를 통해 추상화, 캡슐화, 상속, 다형성들을 구현할 수 있어 중복을 최소화하면서 복잡한 로직을 구조화하여 설계할 수 있습니다.
2. 추상화란 무엇입니까?
추상화는 복잡한 현실 세계의 객체나 시스템에서 핵심적인 상태와 동작만을 선별하여 모델링하는 과정입니다. 즉, 사용자가 꼭 알아야 할 동작만 노출하고, 세부 구현은 숨겨서 복잡성을 줄입니다. 예를 들어, PaymentService가 결제라는 공통 기능만 정의하고, 결제 방식별 구체 로직은 PaymentStrategy 인터페이스를 통해 전략 클래스로 분리하면, 서비스는 결제가 가능하다는 사실만 알고 내부 구현에는 의존하지 않습니다. 이는 설계 단계에서 역할과 책임을 명확히 나누어 새로운 결제 방식이 추가되더라도 서비스 코드 수정 없이 확장이 가능하고, 새로운 요구사항도 유연하게 반영할 수 있습니다.
다만, 초기 개발 시 설계의 복잡성이 증가할 수 있고, 불필요한 추상화로 인해 인터페이스가 과도하게 생성되어 개발 비용이 증가할 수 있습니다. 또한 공통성이 부족한 기능을 억지로 추상화할 경우 유지보수가 더 어려워질 수 있습니다.
// 전략 인터페이스
interface PaymentStrategy {
void pay(int amount);
}
// 전략 클래스 1
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paying " + amount + " by Credit Card");
}
}
// 전략 클래스 2
class PaypalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paying " + amount + " via PayPal");
}
}
// 전략을 사용하는 서비스
class PaymentService {
private final PaymentStrategy strategy;
public PaymentService(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void processPayment(int amount) {
strategy.pay(amount);
}
}
3. 캡슐화란 무엇입니까?
캡슐화는 객체의 데이터(상태)와 동작을 하나의 단위로 묶고, 외부에서 직접 데이터에 접근하지 못하도록 제한하여 객체의 무결성을 보장하는 원리입니다. 이를 통해 외부의 잘못된 접근이나 예기치 않은 상태 변경을 방지할 수 있으며, 유지보수가 용이해집니다. 일반적으로 접근 제어자(private, public, protected)와 getter/setter를 통해 구현됩니다.
class Account {
private int balance;
public int getBalance() { return balance; }
public void deposit(int amount) { balance += amount; }
}
위 코드에서 balance 필드는 외부에 직접 노출되지 않고, 반드시 deposit() 메서드를 통해서만 안전하게 수정할 수 있습니다. 실제 설계에서는 단순히 getter와 setter를 모두 열어 두기보다는, 읽기 전용 데이터는 getter만 제공하고, 상태 변경은 deposit()과 같이 의미 있는 도메인 메서드를 통해서만 허용하는 것이 좋습니다. 이를 통해 데이터 무결성과 객체의 일관성을 보장할 수 있습니다. 또한 요구사항에 따라 생성 이후 변경이 필요 없는 데이터는 불변 객체(Value Object)로 설계하여 상태를 안전하게 고정하는 것도 캡슐화를 실현하는 좋은 방법입니다.
4. 추상화와 캡슐화의 차이점은 무엇입니까?
추상화와 캡슐화는 객체 지향 설계에서 서로 보완적이지만 목적과 역할이 다릅니다. 추상화는 복잡한 시스템에서 공통적인 속성과 기능만 선별하여 무엇을 다룰지 결정하는 설계 기법이고, 캡슐화는 설계된 모델의 내부 구현과 상태를 숨기고 어떻게 안전하게 보호할지 제어하는 구현 기법입니다. 예를 들어, PaymentStrategy는 결제 방식의 공통 동작을 추상화하고, PaymentService는 이 전략을 내부에 캡슐화하여 외부에 안전한 결제 기능만 제공함으로써 두 원리가 함께 작동합니다.
5. 객체 지행 프로그래밍 언어의 이점을 나열하십시오
객체 지향 언어는 공통 기능을 상속으로 재사용하고, 다형성을 통해 다양한 객체를 동일한 방식으로 재사용할 수 있어 코드의 유연성과 확장성이 크게 향상됩니다. 캡슐화를 통해 데이터와 동작을 하나로 묶고 외부 접근을 제한함으로써 모듈화와 낮은 결합도를 보장하여 유지보수가 용이합니다. 이러한 구조적 특징으로 변화가 잦은 대규모 시스템에서도 안정성과 일관성을 유지하며 점진적인 기능 추가도 가능합니다. 결과적으로 객체 지향 언어는 현실 세계의 개념을 자연스럽게 반영하면서도 재사용성과 변경 용이성을 극대화하여 품질 높은 소프트웨어 개발에 적합합니다.
6. 전통적인 프로그래밍 언어와 객체 지향 프로그래밍 언어의 차이점은 무엇입니까?
전통적인 절차적 언어는 기능 중심으로 프로그램이 순차적으로 실행되며, 데이터와 함수가 별도로 관리됩니다. 이는 로직이 복잡해질수록 데이터와 기능 간 결합이 약해 유지보수가 어려워질 수 있습니다. 반면 객체 지향 언어는 데이터와 기능을 하나의 객체로 묶어 문제를 해결하며, 서로 독립적인 객체들이 메시지를 주고받아 시스템을 구성합니다. 이 구조는 문제를 현실 세계와 유사한 방식으로 추상화할 수 있게 하여 코드의 직관성과 재사용성을 동시에 높입니다.
'Java' 카테고리의 다른 글
자바 OOP (3) - 메서드 오버로딩과 오버라이딩 (0) | 2025.06.17 |
---|---|
자바 OOP (2) - 상속과 다형성 기초 (0) | 2025.06.17 |
자바 스레드 (4) - 동기화와 잠금 (0) | 2025.06.10 |
자바 스레드 (3) - 스레드 생명주기와 상태 (1) | 2025.06.10 |
자바 스레드 (2) - 스레드 생성과 실행 방법 (0) | 2025.06.10 |