이번 게시물에서는 Java의 객체 지향 프로그래밍(OOP)의 네 가지 기본 원칙을 살펴보겠습니다. 이러한 핵심 원칙은 코드를 모듈식, 재사용 및 유지 관리가 가능하도록 구조화하는 데 도움이 됩니다. 이 게시물은 소개 역할을 하며, 향후 항목에서는 미묘한 토론과 예시를 통해 각 개념을 더 깊이 파고듭니다.
기억하기 쉽게 두문자어 “A PIE”를 사용하세요. A추상화, P올형성, I상속 , E캡슐화.
Java는 종종 객체 지향 언어로 설명되지만 100% 객체 지향은 아닙니다. 이유는 무엇입니까? Java의 대부분 요소는 클래스, 객체, 메소드와 같은 객체를 중심으로 돌아가지만 기본 유형(int, boolean, double 등)도 사용합니다. 🎜>물체가 아닙니다.
Java에서 기본 유형을 유지하는 것은 의도적인 디자인 선택이었습니다. 이유는 다음과 같습니다.
메모리 효율성: 기본 유형은 해당 객체 유형(예: 정수 또는 부울)에 비해 더 적은 메모리를 사용합니다.
성능 향상: 객체 생성 및 참조 관리의 오버헤드를 방지하므로 기본 요소에 대한 작업이 더 빠릅니다.
편리성: 기본 유형은 특히 산술 및 논리 연산을 처리할 때 간단한 경우에 코드를 더 깔끔하게 만듭니다.
Java는 성능과 메모리 효율성을 위한 기본 요소를 제공하는 동시에 이러한 값을 객체로 처리해야 할 때를 위한 래퍼 클래스(예: 정수)를 제공하여 균형을 유지합니다.
내부 논리를 숨기고 필수 기능만 사용자에게 노출하는 것을 의미합니다. 이를 통해 사용자는 기본적인 복잡성에 대해 걱정하지 않고 높은 수준에서 개체와 상호 작용할 수 있습니다. 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. } }
복잡함은 어디에 숨겨져 있나요?
추상수업이 어떤 도움이 되나요?
사용자에게는 무엇이 표시되나요?
다형성을 사용하면 객체가 다양한 상황에서 다르게 동작할 수 있습니다. 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의 재정의된 메서드가 실행됩니다.
상속을 통해 클래스(하위)가 다른 클래스(상위)의 속성과 동작을 재사용할 수 있습니다. 이는 코드 재사용성을 촉진하고 클래스 간에 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() 메서드를 다시 작성할 필요가 없었습니다.
캡슐화는 데이터(필드)와 이를 조작하는 메서드를 단일 단위(클래스)로 묶는 것을 의미합니다. 또한 필드를 비공개로 설정하고 노출하여 데이터 숨김을 보장합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!