티스토리 뷰

추상화는 사용자에게 구현 세부 사항을 숨기고 필수적인 특성만 노출하여 복잡한 시스템을 단순화하는 데 중점을 둔다. Abstract classes와 Interfaces 특정 구현을 강제하지 않고 동작을 정의함으로써 이를 용이하게 한다.

 

  • Core Principles
    • Interfaces vs. Abstract Classes
      : 인터페이스는 동작을 정의하지 않고 계약을 지정하는 반면 (Java 8 이전), 추상 클래스는 부분적인 동작을 정의하고 공유 특성을 적용할 수 있다.
    • Implementation Hiding
      : 추상화는 구현 세부 사항을 사용자에게 숨겨서 복잡성을 줄이고 코드 유지는 관리성을 향상시킨다.
  • Advanced Usage
    • Abstract Classes with Concrete Methods
      : 추상 클래스는 하위 클래스의 유틸리티 함수 역할을 하는 구체적인 메서드를 가질 수 있다.
    • Interfaces with Default Methods
      : Java 8은 인터페이스에 기본 메서드를 도입해 기존 구현을 손상시키지 않고 메서드를 공유할 수 있게 됐다.
  • Real-World Application (실졔 애플리케이션)
    • Database Access Layer
      : 데이터베이스 액세스를 위한 인터페이스는 세부 사항을 추상화해 백엔드에서 클라이언트 코드에 영향을 주지 않고 한 데이터베이스 시스템에서 다른 데이터베이스 시스템으로 전환할 수 있도록 한다.
    • Payment Processing Systems
      : 다양한 결제 게이트웨이에서 PaymentProcessor 인터페이스를 구현해 전자상거래 애플리케이션에 유연성을 부여할 수 있다.
  • Common Pitfalls (일반적인 함정)
    • Interface Segregation
      : 너무 많은 메소드를 포함하는 과부하 인터페이스는 Interface Segregation Principle (ISP, 인터페이스 분리 원칙)을 위반할 수 있다. 인터페이스를 특정 동작에 집중하도록 해야한다.
    • Improper Use of Abstract Classes
      : 추상 클래스는 불필요한 복잡성을 초래할 수 있으므로 단순한 구체적인 클래스나 유틸리티 메서드로 충분할 수 있는 곳에 사용해서는 안된다.
  • Basic Interface
    : 애플리케이션에 여러 유형의 결제 수단이 필요한 시나리오를 가정해보자. Payment 인터페이스를 정의해 모든 결제 클래스에 표준 구조를 적용할 수 있다.
    public interface Payment {
        // Abstract method
        void processPayment(double amount);
    
        // Default method (Java 8+)
        default void initiatePayment() {
            System.out.println("Initiating payment...");
        }
        
        // Static method (Java 8+)
        static void logPayment() {
            System.out.println("Logging payment transaction.");
        }
    }
    
    public class CreditCardPayment implements Payment {
        @Override
        public void processPayment(double amount) {
            System.out.println("Processing credit card payment of $" + amount);
        }
    }
    
    public class PayPalPayment implements Payment {
        @Override
        public void processPayment(double amount) {
            System.out.println("Processing PayPal payment of $" + amount);
        }
    }
    
    // Usage
    public class PaymentProcessor {
        public static void main(String[] args) {
            Payment creditCardPayment = new CreditCardPayment();
            creditCardPayment.initiatePayment();
            creditCardPayment.processPayment(100.0);
            
            Payment.logPayment();
            
            Payment payPalPayment = new PayPalPayment();
            payPalPayment.processPayment(50.0);
        }
    }
  • Basic Abstract Class
    : 다양한 유형의 직원 (예: 풀타임, 파트타임)을 이름 ID, 급여 계산과 같은 몇 가지 공통 기능과 상태로 표현해야 하는 시나리오를 생각해보자.
    public abstract class Employee {
        private String name;
        private int id;
    
        public Employee(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        // Concrete method
        public String getName() {
            return name;
        }
    
        public int getId() {
            return id;
        }
    
        // Abstract method
        public abstract double calculateSalary();
    }
    
    public class FullTimeEmployee extends Employee {
        private double salary;
    
        public FullTimeEmployee(String name, int id, double salary) {
            super(name, id);
            this.salary = salary;
        }
    
        @Override
        public double calculateSalary() {
            return salary;
        }
    }
    
    public class PartTimeEmployee extends Employee {
        private double hourlyRate;
        private int hoursWorked;
    
        public PartTimeEmployee(String name, int id, double hourlyRate, int hoursWorked) {
            super(name, id);
            this.hourlyRate = hourlyRate;
            this.hoursWorked = hoursWorked;
        }
    
        @Override
        public double calculateSalary() {
            return hourlyRate * hoursWorked;
        }
    }
    
    // Usage
    public class EmployeeProcessor {
        public static void main(String[] args) {
            Employee fullTime = new FullTimeEmployee("Alice", 101, 60000);
            System.out.println(fullTime.getName() + "'s Salary: $" + fullTime.calculateSalary());
    
            Employee partTime = new PartTimeEmployee("Bob", 102, 20, 100);
            System.out.println(partTime.getName() + "'s Salary: $" + partTime.calculateSalary());
        }
    }

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함
반응형