개체지향 프로그래밍(OOP)
객체지향은 프로그램을 객체들의 모임으로 보는 패러다임이에요. 객체는 데이터(속성)와 기능(메서드)을 가진 단위입니다.
// 동물 추상 클래스
// 클래스 해석
// 1. 추상 클래스는 미완성 설계도이므로 `Animal myPet = Animal("초코")` x 이런 식으로 인스턴스화는 불가능하다.
// 2. 추상 클래스는 여러 클래스에서 공통으로 사용되는 메소드와 타입이 있다면 상위 클래스 형태로 사용된다.
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
// 3. 추상 메서드는 상속받은 클래스 쪽에서 오버라이드화하여서만 사용가능하다.(반드시 override하여 메서드가 상속된 클래스에 있어야한다! 없으면 컴파일러 에러 생김)
public abstract void makeSound(); // 추상 메서드
public void sleep() {
System.out.println(name + "이(가) 자고 있습니다.");
}
}
// 상속을 통한 구체 클래스
class Dog extends Animal {
// super는 상위 클래스의 오브젝트를 하위 클래스에서 끌어다 쓸 때 쓰는 겁니다.(메서드, 타입 등 다 끌어다 쓸 수 있음)
public Dog(String name) {
super(name);
}
//위에서 말한 오버라이드화한 메서드
@Override
public void makeSound() {
System.out.println(name + ": 멍멍!");
}
public void fetch() {
System.out.println(name + "이(가) 공을 가져옵니다.");
}
}
// 실행 코드
public class Main {
public static void main(String[] args) {
Animal myPet = new Dog("초코");
myPet.makeSound(); // 다형성
myPet.sleep();
}
}
추상화는 복잡한 시스템에서 핵심적인 부분만 추출하여 간결하게 표현하는 것이에요.
// 인터페이스를 통한 추상화
// 앞서 얘기했듯 인터페이스에는 메서드가 있다고 구현만 해둔다.
// 이 인터페이스를 implement할 경우 그 클래스에서는 반드시 인터페이스에 있던 메서드를 모두 사용해야한다.
interface PaymentProcessor {
boolean processPayment(double amount);
void cancelPayment(String transactionId);
}
// 구현체 1
class CreditCardProcessor implements PaymentProcessor {
@Override
public boolean processPayment(double amount) {
System.out.println("신용카드로 " + amount + "원 결제 처리");
// 실제 결제 로직
return true;
}
@Override
public void cancelPayment(String transactionId) {
System.out.println("거래 ID: " + transactionId + " 취소됨");
}
}
// 구현체 2
class PayPalProcessor implements PaymentProcessor {
@Override
public boolean processPayment(double amount) {
System.out.println("PayPal로 " + amount + "원 결제 처리");
// 실제 결제 로직
return true;
}
@Override
public void cancelPayment(String transactionId) {
System.out.println("PayPal 거래 ID: " + transactionId + " 취소됨");
}
}