>  기사  >  Java  >  Java에서 OOP 크래킹: 한 조각이 필요할 PIE

Java에서 OOP 크래킹: 한 조각이 필요할 PIE

Susan Sarandon
Susan Sarandon원래의
2024-10-28 11:38:02977검색

Cracking OOP in Java: A PIE You’ll Want a Slice Of

이번 게시물에서는 Java의 객체 지향 프로그래밍(OOP)의 네 가지 기본 원칙을 살펴보겠습니다. 이러한 핵심 원칙은 코드를 모듈식, 재사용 및 유지 관리가 가능하도록 구조화하는 데 도움이 됩니다. 이 게시물은 소개 역할을 하며, 향후 항목에서는 미묘한 토론과 예시를 통해 각 개념을 더 깊이 파고듭니다.

기억하기 쉽게 두문자어 “A PIE”를 사용하세요. A추상화, P올형성, I상속 , E캡슐화.


객체 지향적이라는 것은 무엇을 의미합니까?

Java는 종종 객체 지향 언어로 설명되지만 100% 객체 지향은 아닙니다. 이유는 무엇입니까? Java의 대부분 요소는 클래스, 객체, 메소드와 같은 객체를 중심으로 돌아가지만 기본 유형(int, boolean, double 등)도 사용합니다. 🎜>물체가 아닙니다.

Java에서 기본 유형을 유지하는 것은 의도적인 디자인 선택이었습니다. 이유는 다음과 같습니다.

  • 메모리 효율성: 기본 유형은 해당 객체 유형(예: 정수 또는 부울)에 비해 더 적은 메모리를 사용합니다.

  • 성능 향상: 객체 생성 및 참조 관리의 오버헤드를 방지하므로 기본 요소에 대한 작업이 더 빠릅니다.

  • 편리성: 기본 유형은 특히 산술 및 논리 연산을 처리할 때 간단한 경우에 코드를 더 깔끔하게 만듭니다.

요컨대,

Java는 성능과 메모리 효율성을 위한 기본 요소를 제공하는 동시에 이러한 값을 객체로 처리해야 할 때를 위한 래퍼 클래스(예: 정수)를 제공하여 균형을 유지합니다.


1.

추상화: 불필요한 세부사항 숨기기

추상화는

내부 논리를 숨기고 필수 기능만 사용자에게 노출하는 것을 의미합니다. 이를 통해 사용자는 기본적인 복잡성에 대해 걱정하지 않고 높은 수준에서 개체와 상호 작용할 수 있습니다. ATM을 사용한다고 생각해보세요. ATM이 거래를 처리하기 위해 은행과 어떻게 상호 작용하는지 알지 못한 채 인출할 금액만 입력하면 됩니다.

Java에서

추상 클래스인터페이스필수 메서드를 정의하고 내부 세부 정보를 하위 클래스 또는 상위 클래스 내에 남겨두어 추상화를 달성하는 데 도움이 됩니다. 하지만 사용자에게는 숨겨져 있습니다.

예:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}
설명:

  • 복잡함은 어디에 숨겨져 있나요?

    • authentic() 메소드는 하위 클래스와 사용자 모두에게 비공개이고 숨겨지는 내부 논리(예: 사용자 확인, 암호화)를 나타냅니다.
    • makePayment() 메소드는 사용자가 사용할 수 있는 유일한 공개 메소드로, 결제 시스템과 상호작용할 수 있는 간단한 방법을 제공합니다.
  • 추상수업이 어떤 도움이 되나요?

    • 하위 클래스(예: CreditCardPayment)가 핵심 논리(processPayment())를 구현하도록 강제하지만 하위 클래스는 인증 논리에 대해 알 필요가 없습니다. —상위 클래스에서 처리됩니다.
  • 사용자에게는 무엇이 표시되나요?

    • 사용자의 관점에서 보면 makePayment()하고만 상호작용하며 인증이나 신용카드 결제가 내부적으로 작동하는 방식에는 관심이 없습니다.

2. 다형성: 같은 동작, 다른 형태

다형성을 사용하면 객체가 다양한 상황에서 다르게 동작할 수 있습니다. Java는 두 가지 유형의 다형성을 지원합니다.

1. 컴파일 시간 다형성(메소드 오버로딩): 이름은 동일하지만 매개변수가 다른 여러 메소드를 정의하여 달성됩니다.

예:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}

2. 런타임 다형성(메소드 재정의): 하위 클래스가 상위 클래스에 선언된 메서드의 특정 구현을 제공할 때 달성됩니다.

예:

class Calculator {
    // Compile-time polymorphism (Overloading)
    int add(int a, int b) {
        return a + b;
    }
    int add(int a, int b, int c) {
        return a + b + c;
    }

    public static void main(String[] args) {
        Calculator calc = new Calculator();
        System.out.println(calc.add(2, 3));  // Output: 5
        System.out.println(calc.add(2, 3, 4));  // Output: 9
    }
}

설명:

컴파일 시간 다형성은 add() 메서드를 오버로드하여 보여주고, 런타임 다형성은 sound() 메서드를 오버로드하여 보여줍니다.

sound() 메소드는 객체 유형에 따라 다르게 동작합니다. Animal은 Animal 유형이지만 런타임에서는 Dog의 재정의된 메서드가 실행됩니다.


3. 상속: 부모-자식 관계를 통한 코드 재사용성

상속을 통해 클래스(하위)가 다른 클래스(상위)의 속성과 동작을 재사용할 수 있습니다. 이는 코드 재사용성을 촉진하고 클래스 간에 IS-A 관계를 설정합니다. Java는 모호함을 피하기 위해 클래스를 통한 다중 상속을 지원하지 않지만 인터페이스를 통해서는 허용합니다.

예:

class Animal {
    void sound() {
        System.out.println("Animals make sounds.");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("Dog barks.");
    }
}

public class TestPolymorphism {
    public static void main(String[] args) {
        Animal animal = new Dog();  // Runtime polymorphism
        animal.sound();  // Output: Dog barks
    }
}

설명:

이 예에서는:

  • 개는 동물로부터 상속받았습니다. 즉, 개는 먹을 동시에 짖을 수 있습니다.

  • 이는 코드 재사용을 보여줍니다. Dog 클래스에 대해 eat() 메서드를 다시 작성할 필요가 없었습니다.


4. 캡슐화: 접근 제어로 데이터 보호

캡슐화는 데이터(필드)와 이를 조작하는 메서드를 단일 단위(클래스)로 묶는 것을 의미합니다. 또한 필드를 비공개로 설정하고 노출하여 데이터 숨김을 보장합니다. getter 및 setter를 통해

예:

abstract class Payment {
    // A method with concrete logic, hidden from the user.
    private void authenticate() {
        System.out.println("Authenticating payment...");
    }

    // Abstract method that child classes must implement.
    abstract void processPayment(double amount);

    // Public method exposing only the necessary details.
    public void makePayment(double amount) {
        authenticate();  // Hidden complexity
        processPayment(amount);  // Exposed to child classes
        System.out.println("Payment completed.");
    }
}

// Concrete class implementing the abstract method.
class CreditCardPayment extends Payment {
    @Override
    void processPayment(double amount) {
        System.out.println("Processing credit card payment of ₹" + amount);
    }
}

public class TestAbstraction {
    public static void main(String[] args) {
        Payment payment = new CreditCardPayment(); // Polymorphism in action.
        payment.makePayment(1000.00);  // Only high-level interaction.
    }
}

설명:

  • 이름 필드는 비공개이므로 클래스 외부에서 직접 접근할 수 없습니다.

  • 공개 getter 및 setter를 통해 액세스가 제공되며 데이터 숨김이 적용됩니다.


결론

Java의 OOP 원칙추상화, 다형성, 상속 및 캡슐화—는 유지 관리가 가능하고 효율적인 모듈식 코드 작성을 위한 기반을 형성합니다. 이러한 개념을 이해하면 복잡한 시스템을 설계하고 이해하는 데 더 잘 준비될 수 있습니다.

향후 게시물에서는 보다 미묘한 예, 모범 사례, 인터뷰 중심 팁을 통해 이러한 각 원칙에 대해 자세히 알아보겠습니다. 계속 지켜봐 주시기 바랍니다!


관련 게시물

  • Java 기초

  • 어레이 인터뷰 필수

  • Java 메모리 필수

  • Java 키워드 필수

  • 컬렉션 프레임워크 필수

즐거운 코딩하세요!

위 내용은 Java에서 OOP 크래킹: 한 조각이 필요할 PIE의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.