JavaRush /Java Blog /Random-KO /JAVA 객체 지향 프로그래밍 개념
shabnahm
레벨 18

JAVA 객체 지향 프로그래밍 개념

Random-KO 그룹에 게시되었습니다
JAVA는 객체 지향 프로그래밍의 개념을 기반으로 하며 이를 통해 더 높은 수준의 추상화로 이동하여 현실적으로 문제를 해결할 수 있습니다. 객체 지향 접근 방식은 애플리케이션에서 재사용하기가 더 쉬운 실제 객체 측면에서 문제에 대한 솔루션을 개념화합니다. 예를 들어 Chair(의자), Fan(팬), Dog(개), Computer(컴퓨터) 등이 있습니다. JAVA에서 클래스는 특정 유형의 객체에 대한 일반적인 동작을 정의하는 레이아웃, 템플릿 또는 프로토타입입니다. 인스턴스는 클래스의 별도 구현이며 클래스의 모든 인스턴스는 클래스 정의에 설명된 동일한 속성을 갖습니다. 예를 들어, 방 개수를 속성으로 사용하여 House라는 클래스를 정의하고 방 2개짜리 집, 방 3개짜리 집 등과 같은 클래스의 인스턴스를 생성할 수 있습니다. JAVA 객체 지향 프로그래밍 개념 - 1장점: 아래에는 객체 지향 소프트웨어 개발의 몇 가지 장점이 나열되어 있습니다.
  • 주로 모듈식으로 수행되므로 소프트웨어 지원 비용이 절감됩니다.
  • 상속과 같은 기능을 통해 코드 재사용이 향상되어 소프트웨어 개발 속도가 빨라집니다.
  • 코드 신뢰성과 유연성이 향상되었습니다.
  • 실제 시뮬레이션으로 이해가 쉽습니다.
  • 객체 수준에서 더 나은 추상화.
  • 한 개발 단계에서 다른 개발 단계로 전환하는 복잡성을 줄입니다.
OOP에는 네 가지 주요 특징이 있습니다.
  • 캡슐화
  • 계승
  • 다형성
  • 추출

캡슐화

캡슐화는 객체가 숨겨야 할 것과 다른 객체가 액세스할 수 있도록 열어야 하는 것에 대한 계약 역할을 합니다. privateJAVA에서는 메소드를 숨기고 외부에서 변수에 대한 액세스를 제한하기 위해 액세스 수정자를 사용합니다 . JAVA에는 다양한 수준에서 가시성을 제한하는 데 사용되는 다양한 액세스 수정자( public, default, protected, )도 있습니다. private그러나 궁극적인 목표는 변경되어서는 안 되는 것들을 캡슐화하는 것입니다. 가장 잘 작동하는 접근 방식은 클래스에 변경해야 할 이유가 하나만 있어야 한다는 것이며, 캡슐화는 해당 "한 가지 이유"의 설계를 현실로 만듭니다. 캡슐화에 대한 올바른 접근 방식은 다른 클래스를 손상시키지 않도록 자주 변경되는 항목을 숨기는 것입니다. 이점: 캡슐화의 이점은 다음과 같습니다.
  • 객체의 속성을 숨겨 객체의 내부 상태를 보호할 수 있습니다.
  • 이는 개체가 예기치 않은 방식으로 상호 작용하는 것을 방지하므로 코드 모듈성이 향상됩니다.
  • 코드 유용성이 향상됩니다.
  • 이는 특정 법인의 계약 관계를 지원합니다.
  • 캡슐화를 사용하면 소프트웨어를 더 쉽게 유지 관리할 수 있습니다.
  • 코드 변경은 서로 독립적으로 이루어질 수 있습니다.

다형성

프로그래밍에서의 다형성은 다양한 기본 형식(데이터 유형)에 대해 동일한 인터페이스를 제공하는 능력입니다. 이는 서로 다른 기능을 가진 클래스가 동일한 인터페이스를 공유하고 매개변수를 참조로 전달하여 동적으로 호출할 수 있음을 의미합니다. 전형적인 예는 클래스 Shape(모양)와 이 클래스에서 상속되는 모든 클래스 square(사각형), circle(원), dodecahedron(십이면체), irregular polygon(불규칙한 다각형), splat(방울) 등입니다. 이 예에서 각 클래스에는 고유한 메서드가 있으며 Draw()클라이언트 코드는 간단히 다음을 수행할 수 있습니다.
Shape shape = new Shape();
Shape.area()모든 형태의 올바른 동작을 얻으려면 다형성의 장점은 서로 다른 클래스로 작업하는 코드가 모두 동일한 원리로 작동하기 때문에 어떤 클래스를 사용하고 있는지 알 필요가 없다는 것입니다. 동적 다형성을 구현하기 위해 객체 지향 프로그래밍 언어에서 사용하는 프로세스를 동적 바인딩이라고 합니다. 참고: 다형성은 개체에 따라 실행할 보다 구체적인 방법을 선택하는 기능입니다. 다형성은 추상 클래스가 포함되지 않을 때 발생합니다. 장점:
  • 재사용 가능한 코드 만들기. 즉, 클래스를 만들고 구현하고 테스트한 후에는 그 안에 정확히 무엇이 쓰여 있는지 걱정하지 않고 자유롭게 사용할 수 있습니다.
  • 이를 통해 보다 일반적이고 느슨하게 결합된 코드를 사용할 수 있습니다.
  • 컴파일 시간이 단축되어 개발 속도가 빨라집니다.
  • 동적 연결.
  • 동일한 인터페이스를 사용하여 다양한 구현으로 메서드를 만들 수 있습니다.
  • 전체 구현은 동일한 메소드 서명을 사용하여 대체될 수 있습니다.
다형성의 일부로 메서드 재정의. 재정의는 부모 클래스의 메서드와 파생 클래스의 메서드라는 두 가지 메서드와 상호 작용합니다. 이러한 메서드는 동일한 이름과 서명을 갖습니다. 재정의를 사용하면 다양한 유형의 객체에 대해 다양한 방식으로 동일한 작업을 수행할 수 있습니다. 예를 들어:
while(it.hasNext()) {
Shape s = (Shape) it.next();
totalArea += s.area(dim); //будет применен полиморфизм и вызван нужный метод для каждого an object.
}
JAVA 객체 지향 프로그래밍 개념 - 2메서드 오버로딩 또는 임시 다형성 또는 정적 다형성 오버로딩은 이름은 동일하지만 메서드 시그니처가 다른 동일한 클래스의 여러 메서드와 상호 작용합니다. 다시 로드를 사용하면 동일한 작업을 다양한 데이터에 대해 다양한 방식으로 설명할 수 있습니다. 때로는 정적 다형성이라고도 하지만 실제로는 다형성이 아닙니다. 이는 단순히 이름이 같지만 인수 목록이 다른 두 개의 메서드를 갖는 것 이상입니다. 재부팅은 상속 및 다형성과 관련이 없습니다. 그리고 오버로드된 메서드는 재정의된 메서드와 전혀 동일하지 않습니다. JAVA 생성을 통한 매개변수 다형성 클래스를 선언할 때 이름 필드는 다양한 유형과 연관될 수 있고, 메소드 이름은 다양한 매개변수 및 리턴 유형과 연관될 수 있습니다. JAVA는 제네릭을 사용하여 매개변수 다형성을 지원합니다.
List<String> list = new ArrayList<String>();
JAVA에서 정적 메소드를 대체할 수 없는 이유는 무엇입니까? 재정의는 클래스 인스턴스의 존재 여부에 따라 달라집니다. 다형성의 개념은 하위 클래스를 생성할 수 있고 해당 하위 클래스에 의해 구현된 객체는 상위 클래스(하위 클래스에서 재정의됨)의 동일한 메서드와 다르게 동작한다는 것입니다. 정적 메서드는 클래스의 인스턴스와 연결되지 않으므로 재정의 자체 개념을 적용할 수 없습니다. JAVA 작성자는 이 접근 방식에 영향을 미치는 두 가지 고려 사항을 기준으로 삼았습니다. 첫째, 코드 실행 문제가 있습니다. Smalltalk가 느리다는 비판이 많았고(가비지 수집 및 다형성이 이 문제의 일부였습니다), JAVA는 이를 방지하도록 설계되었습니다. 두 번째 고려 사항은 JAVA의 대상 독자가 C++ 개발자라는 결정이었습니다. 이러한 방식으로 정적 메서드를 작동시키는 것은 C++ 프로그래머에게 매우 친숙했으며, 호출할 메서드를 파악하기 위해 클래스 계층 구조를 올라갈 필요가 없기 때문에 작업 속도도 향상되었습니다. 클래스로 바로 이동하여 특정 메서드를 호출합니다.

계승

상속은 기본 클래스의 동작(즉, 메서드)과 상태(즉, 변수)를 파생 클래스에 통합하여 해당 파생 클래스에서 사용할 수 있도록 하는 행위입니다. 상속의 주요 장점은 코드 재사용을 위한 공식적인 메커니즘을 제공하고 중복을 방지한다는 것입니다. 상속된 클래스는 상위 클래스의 동작을 복사하고 새 기능을 추가하여 애플리케이션의 기능을 확장합니다. 이로 인해 코드가 고도로 결합됩니다. 슈퍼클래스를 변경하려면 코드가 깨지지 않도록 서브클래스의 모든 세부 사항을 알아야 합니다. 상속은 기능을 확장하고 슈퍼클래스의 속성 중 일부를 사용하는 기존 클래스(슈퍼클래스)에서 새 클래스(하위클래스)를 생성하는 소프트웨어 재사용의 한 형태입니다. 따라서 부모 클래스가 있고 자식 클래스가 나타나면 자식은 부모가 가지고 있는 모든 것을 상속받습니다. 장점:
  • 코드 재사용이 향상되었습니다.
  • 논리적 관계 "is a"(누군가, 무엇인가)가 확립됩니다. 예: 개 는 n 동물 입니다 . (개는 동물이다.)
  • 코드 모듈화.
  • 반복은 제외됩니다.
결함:
  • 긴밀하게 결합됨: 하위 클래스는 상위 클래스의 구현에 의존하므로 코드가 긴밀하게 결합됩니다.
그 밖에 읽을 내용:

자바 개발자 그룹:

추출

추상화란 구현 세부 사항을 고려하지 않고 인터페이스와 기능을 기반으로 클래스를 설계하는 것을 의미합니다. 추상 클래스는 실제 구현을 포함하지 않고 인터페이스를 나타냅니다. 이는 객체의 구현과 해당 동작을 구별합니다. 추상화는 중요하지 않은 세부 사항을 숨겨 코드를 단순화합니다. 장점:
  • 추상화를 사용하면 어떤 유형으로 그룹화할 수 있는지 분리할 수 있습니다.
  • 자주 수정되는 속성과 메소드를 별도의 유형으로 그룹화할 수 있으므로 기본 유형이 변경되지 않습니다. 이는 OOP 원칙인 "코드는 확장에는 개방되어야 하지만 변경에는 폐쇄되어야 합니다 ."를 강화합니다 .
  • 추상화는 도메인 모델의 표현을 단순화합니다.
추상화와 캡슐화의 차이점 캡슐화는 추상화의 일부로 사용되는 전략입니다. 캡슐화는 객체의 구조를 나타냅니다. 객체는 자신의 속성을 캡슐화하고 외부 접근으로부터 이를 숨깁니다. 클래스 사용자는 해당 메서드를 사용하여 클래스와 상호 작용하지만 클래스 구조에 직접 액세스할 수는 없습니다. 이러한 방식으로 클래스는 해당 디자인과 관련된 구현 세부 정보를 추상화합니다. 추상화는 보다 일반적인 용어입니다. 이는 무엇보다도 하위 클래스를 사용하여 달성할 수도 있습니다. 예를 들어, 표준 라이브러리의 클래스 List(목록)는 목록에서의 위치에 따라 색인이 지정된 일련의 요소에 대한 추상화입니다. 목록의 구체적인 예는 또는 List입니다 . 목록과 상호 작용하는 코드는 사용되는 목록의 세부 정보를 추상화합니다. 캡슐화를 사용하여 기본 상태를 숨기지 않으면 추상화가 불가능한 경우가 많습니다. 클래스가 내부 구조를 노출하는 경우 내부 작업을 변경할 수 없으므로 추상화할 수 없습니다. 추상클래스와 추상메서드는 무엇인가요? 개발 중에 기본 클래스가 파생 클래스에만 인터페이스를 제공하기를 원하는 경우가 있습니다. 즉, 누구도 기본 클래스의 인스턴스를 생성하는 것을 원하지 않습니다. 객체만 캐스팅하는 방식으로 인터페이스를 사용해야 합니다(이는 다형성 동작을 허용하는 암시적 캐스팅입니다). 이는 키워드를 사용하여 이 클래스를 추상화함으로써 달성됩니다 . 이는 추상 클래스의 인스턴스를 생성할 수 없는 등 몇 가지 제한 사항을 부과하며, 추상 클래스를 사용할 때는 추상 메서드를 구현해야 합니다. 이는 다형성을 보장합니다. 추상 클래스에는 추상 메서드와 구체적인 메서드가 모두 포함될 수 있습니다. 클래스의 메소드 중 하나 이상이 추상으로 선언된 경우 전체 클래스도 추상으로 선언되어야 합니다. 그러나 반대 방향의 규칙을 반드시 준수할 필요는 없습니다. 클래스가 추상으로 선언되면 추상 메서드를 포함할 수 없습니다. 시그니처만 정의하고 구현을 제공하지 않는 메서드를 추상이라고 합니다. 실제 구현은 추상 클래스를 확장하는 하위 클래스에 맡겨집니다. 추상 메서드는 개체에서 사용할 수 없으며 다른 클래스에서만 확장할 수 있습니다. 언제 추상 클래스를 사용해야 합니까? 추상 클래스를 사용하면 일부 기본 동작을 정의하고 하위 클래스가 특정 동작을 제공하도록 할 수 있습니다. 예를 들어, (목록)은 인터페이스이며, 목록의 기본 동작을 정의합니다. 이는 있는 그대로 사용하거나 (목록 배열)과 같은 하위 클래스에서 재정의할 수 있습니다. 인터페이스란 무엇입니까?ArrayListLinkedListListabstractListAbstractListArrayList 인터페이스의 개념은 추상 클래스이지만 키워드로 정의된 인터페이스는 interface한 단계 더 나아갑니다. 이는 메서드나 함수의 구현을 전혀 방지합니다. 메서드나 함수를 선언할 수만 있고 구현을 제공할 수는 없습니다. 인터페이스를 구현하는 클래스는 실제 구현을 관리해야 합니다. 인터페이스는 매우 유용하며 OOP에서 널리 사용됩니다. 인터페이스 자체와 구현을 공유하므로 사용 시 많은 이점을 제공합니다.
  1. 다중 상속 .
  2. 느슨한 결합 . 레이어링과 같은 작업의 추상화가 있으며 구체적인 구현은 JDBC, JPA, JTA 등 무엇이든 가능합니다.
  3. 인터페이스 프로그램이 구현되지 않았습니다 .
  4. 동적 바인딩 다형성 : 개체의 프로그래밍 인터페이스는 실제 구현을 공개하지 않고 노출됩니다.
  5. 추상적인 수준 , 기능 분리.
인터페이스와 추상 클래스의 차이점
  • 인터페이스는 이 인터페이스를 구현하는 클래스와의 계약 관계로, 인터페이스에서 지정한 방식으로 구현이 발생함을 나타냅니다. 이것은 선언된 메소드가 있는 빈 쉘입니다.
  • 추상 클래스는 몇 가지 일반적인 동작을 정의하고 하위 클래스에 해당 클래스에 대한 비정형적이거나 특정 동작을 정의하도록 요청합니다.
  • 추상 클래스의 메서드와 멤버는 액세스 한정자로 지정할 수 있으며, 결과적으로 모든 인터페이스 메서드는 공용이어야 합니다.
  • 추상 클래스를 상속할 때 하위 클래스는 추상 메서드를 정의해야 하며, 인터페이스는 해당 메서드를 정의하지 않고도 다른 인터페이스를 상속할 수 있습니다.
  • 하위 클래스는 하나의 추상 클래스만 확장할 수 있지만 인터페이스는 확장하거나 클래스가 다른 여러 인터페이스를 구현할 수 있습니다.
  • 하위 클래스는 동일하거나 덜 제한적인 액세스 한정자를 사용하여 추상 메서드를 정의할 수 있지만 인터페이스를 구현하는 클래스는 동일한 가시성 수준으로 메서드를 정의해야 합니다.
  • 인터페이스에는 생성자가 포함되어 있지 않지만 추상 클래스에는 생성자가 포함되어 있습니다.
  • Java 인터페이스에 선언된 변수는 기본적으로 최종 변수입니다. 추상 클래스에는 최종이 아닌 변수가 포함될 수 있습니다.
  • Java 인터페이스의 모든 멤버는 public. 추상 클래스의 구성원은 등을 감당할 수 있습니다 public.protected

구성

코드 재사용은 상속과 합성을 모두 사용하여 달성할 수 있습니다. 그러나 구성을 사용하면 상속보다 더 높은 수준의 캡슐화를 제공합니다. 백엔드 클래스를 변경해도 프런트엔드 클래스에 속한 코드에 반드시 영향을 미치는 것은 아니기 때문입니다. 구성은 클래스에서 "has-a"(has, include) 관계를 사용하는 설계 기술입니다. Java 상속과 객체 구성을 모두 사용하여 코드를 재사용할 수 있습니다. 구성의 본질은 객체 간의 "has a" 관계를 표현하는 것입니다. 의자를 생각해 보세요. 의자에는 좌석이 있습니다. 의자에는 등받이가 있습니다. 의자에는 일정한 수의 다리가 있습니다. “has a”라는 문구는 의자가 다른 물건을 가지고 있거나 적어도 사용하는 관계를 암시합니다. 이것이 바로 구성의 기본이 되는 'has-a' 관계입니다. 장점:
  • 가시성 제어
  • 구현은 런타임에 대체될 수 있습니다.
  • 인터페이스 클래스가 구현에 의존하지 않기 때문에 느슨한 결합입니다.
구성과 상속의 차이점
아니요. 구성 (있다 / 있다) 상속(is / is)
1 다형성 및 코드 재사용을 지원합니다. 다형성 및 코드 재사용을 지원합니다.
2 런타임 개체가 이미 생성되었습니다. 객체는 컴파일 타임에 동적으로 생성됩니다.
구현은 런타임에 대체될 수 있습니다. 구현은 컴파일 타임에 변경될 수 있습니다.
4 하위 클래스는 상위 클래스와 독립적이므로 느슨한 결합을 선호합니다(특히 인터페이스 제어 하에서). 하위 클래스는 상위 클래스의 구현에 종속되므로 바인딩이 강력한 것으로 간주됩니다.
5 용도: 집에는 욕실이 있습니다. 집이 화장실이라는 말은 잘못된 것입니다. 상속은 단방향입니다. 집은 건물입니다. 하지만 그 건물은 집이 아니다.
참고: 단지 코드 재사용을 보장하기 위해 상속을 사용하지 마십시오. "is a"(is)라는 관계가 없으면 이러한 목적으로 구성이 사용됩니다. 구성과 집계의 차이점은 개체 관계에 있습니다. 집계는 하나의 클래스가 컬렉션에 맞는 관계입니다. 그것은 전체 관계의 일부이며, 전체 없이도 부분이 존재할 수 있습니다. 그러한 관계는 훨씬 약합니다. 순환 종속성이 없습니다. 예: 주문 및 제품. 컴포지션 은 하나의 클래스가 컬렉션에 들어맞는 관계입니다. 그것은 전체 없이는 부분이 존재할 수 없는 전체 관계의 일부이다. 전체가 파괴되면 그 구성 요소도 모두 파괴됩니다. 더 강한 관계입니다. 예: 다각형과 그 꼭지점, 순서와 그 구성 요소.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION