다형성 Java (정적 및 동적)
⚡ 스마트 요약
다형성 Java 하나의 인터페이스로 여러 형태를 표현할 수 있으므로, 동일한 메서드 이름이 관련 클래스마다 다르게 동작합니다. 이는 유연성, 코드 재사용성, 그리고 기존 은행, 의료 및 기업 시스템의 깔끔한 확장을 촉진하는 객체 지향 설계의 핵심 요소입니다.

다형성이란 무엇입니까? Java?
다형성 Java 상속을 통해 하나 이상의 클래스 또는 객체가 서로 관련될 때 다형성이 발생합니다. 이는 객체가 여러 형태를 취할 수 있는 능력을 의미합니다. 상속을 통해 사용자는 속성과 메서드를 물려받을 수 있으며, 다형성은 이러한 메서드를 사용하여 다양한 작업을 수행할 수 있습니다. 목표는 의사소통이지만 접근 방식은 다를 수 있습니다.
예를 들어 스마트폰은 소통에 사용됩니다. 소통 방식은 통화, 문자 메시지, 사진 메시지, 이메일 등이 될 수 있습니다. 목표는 소통이라는 점에서 같지만, 접근 방식은 다릅니다. 이러한 행동 양식이 바로 핵심입니다. 다형성이제 우리는 다형성에 대해 배우겠습니다. Java 예제 코드, 다이어그램 및 단계별 설명이 포함되어 있습니다.
여기에서 확인하세요 비디오에 접근할 수 없는 경우
다형성을 사용하는 이유는 무엇일까요? Java?
다형성 Java 이 패턴은 코드를 유연하고 재사용 가능하며 유지 관리하기 쉽게 만들어주기 때문에 사용됩니다. 부모 타입의 단일 참조 변수가 여러 자식 객체를 가리킬 수 있으므로, 동일한 호출이 어떤 하위 클래스에 제공되든 그에 맞게 조정됩니다. 이 패턴은 테스트된 코드는 그대로 유지하면서 특화된 하위 클래스를 통해 새로운 동작을 추가할 수 있도록 해주며, 바로 이러한 이유로 Spring이나 Jakarta EE와 같은 프레임워크들이 이 패턴에 의존합니다.
Java 예제가 포함된 OOP의 다형성
부모 클래스 하나를 예로 들어 보겠습니다. 계정 입금 및 출금 기능을 제공합니다. Account 클래스는 두 개의 자식 클래스를 가집니다. 입금 및 출금 작업은 저축 계좌와 당좌 계좌 모두 동일하므로 Account 클래스에서 상속받은 메서드를 사용할 수 있습니다.
Java 다형성 예
소프트웨어 요구사항 변경
요구사항 명세서에 변경 사항이 생겼는데, 이는 소프트웨어 업계에서 흔히 있는 일입니다. 초과인출 기능을 갖춘 우대 계좌 기능을 추가해야 합니다. 초과인출이란 고객이 계좌 잔액보다 많은 금액을 인출할 수 있는 기능입니다. 우대 계좌의 인출 방식은 새로 구현해야 하지만, 저축 및 당좌 계좌에서 이미 검증된 코드는 그대로 유지합니다. 이러한 분리 방식이 바로 장점입니다. 웁스.
단계 1) 저축 계좌의 출금 메서드가 호출되면 상위 Account 클래스에 정의된 메서드가 실행됩니다.
단계 2) 특권 계좌(초과인출 기능)의 인출 메서드가 호출되면, 특권 클래스에 정의된 인출 메서드가 실행됩니다. 이 디스패치는 다음과 같습니다. 객체지향 프로그래밍에서의 다형성.
메소드 재정의 Java
메서드 오버라이딩은 서브클래스 내에서 슈퍼클래스의 메서드를 재정의하는 과정입니다. 서브클래스는 동일한 코드를 유지합니다.tract이지만, 프로그램 실행 시 선택되는 새로운 구현을 제공합니다.
메서드 재정의 규칙
- 메서드 시그니처, 즉 메서드 이름, 매개변수 목록 및 반환 형식은 정확히 일치해야 합니다.
- 오버라이드된 메서드는 접근성을 넓힐 수는 있지만 좁힐 수는 없습니다. 기본 클래스에서 해당 메서드가 private인 경우 자식 클래스는 public으로 변경할 수 있지만 그 반대는 불가능합니다.
예시
class Doctor{ public void treatPatient(){ // treatPatient method } class Surgeon extends Doctor{ public void treatPatient(){ // treatPatient method } } class Run{ public static void main (String args[]){ Doctor doctorObj = new Doctor(); // treatPatient method in class Doctor will be executed doctorObj.treatPatient(); Surgeon surgeonObj = new Surgeon(); // treatPatient method in class Surgeon will be executed surgeonObj.treatPatient(); } }
메서드 오버로딩과 메서드 오버라이딩의 차이점
메서드 오버로딩은 동일한 클래스 내에서 동일한 메서드 이름을 사용하지만 시그니처가 다른 경우를 말합니다. 메서드 오버라이딩은 부모-자식 클래스 관계에서 발생하며, 하위 클래스가 상위 클래스에 선언된 메서드를 재정의하는 경우를 말합니다.
| 메서드 오버로딩은 같은 클래스 내에서 둘 이상의 메서드가 동일한 이름을 갖지만 시그니처는 서로 다른 경우를 말합니다. | 메서드 오버라이딩이란 상위 클래스의 메서드 중 하나를 하위 클래스에서 재정의하는 것을 말합니다. 이 경우 메서드의 시그니처는 동일하게 유지됩니다. |
예 :
void sum (int a , int b); void sum (int a , int b, int c); void sum (float a, double b); |
예 :
class X{ public int sum(){ // some code } } class Y extends X{ public int sum(){ //overridden method //signature is same } } |
동적 다형성이란 무엇입니까?
객체 지향 프로그래밍(OOP)에서 동적 다형성은 슈퍼클래스와 서브클래스에서 동일한 이름과 시그니처를 가진 여러 메서드를 정의할 수 있도록 하는 메커니즘입니다. 오버라이드된 메서드에 대한 호출은 JVM 내부의 동적 바인딩을 통해 런타임에 결정됩니다.
동적 다형성 예시
상위 클래스의 참조 변수는 하위 클래스의 객체를 참조할 수 있습니다.
Doctor obj = new Surgeon();
다음 진술을 고려해 보십시오.
obj.treatPatient();
여기서 참조 변수는 다음과 같습니다. obj `__`는 부모 클래스의 객체이지만, `__`가 가리키는 객체는 자식 클래스의 객체입니다. 이는 다형성 다이어그램에 나타나 있습니다.
호출 obj.treatPatient() 서브클래스인 Surgeon의 treatPatient() 메서드를 실행합니다. 기본 클래스 참조를 사용하여 메서드를 호출할 때, 호출되는 메서드는 JVM이 참조가 가리키는 실제 객체를 기반으로 결정합니다. 비록 비록 obj `Doctor`는 `Surgeon` 객체를 참조하지만, `Surgeon` 객체를 가리키므로 `Surgeon` 객체의 메서드를 호출합니다. 이러한 결정은 런타임 중에 이루어지기 때문에 이러한 이름이 붙었습니다. 동적 다형성 또는 런타임 다형성.
정적 다형성과 동적 다형성의 차이점
정적 다형성 Java 컴파일 시점에 메서드 호출에 필요한 정보를 수집하는 다형성의 한 유형이 컴파일 다형성인 반면, 동적 다형성은 런타임에 메서드 호출에 필요한 정보를 수집하는 다형성의 한 유형입니다.
| 이는 메서드 오버로딩과 관련이 있습니다. | 이는 메서드 오버라이딩과 관련이 있습니다. |
| 오류가 있더라도 컴파일 시점에 해결됩니다. 컴파일 중에는 코드가 실행되지 않으므로 이름은 고정됩니다.
예 : void sum (int a , int b); void sum (float a, double b); int sum (int a, int b); //compiler gives error. |
참조 변수가 오버라이드된 메서드를 호출할 때, 호출될 메서드는 참조 변수가 가리키는 객체에 따라 결정됩니다. 이는 코드가 실행 중일 때만 알 수 있기 때문에 메서드 이름이 동적입니다.
예 : //reference of parent pointing to child object Doctor obj = new Surgeon(); // method of child called obj.treatPatient(); |
슈퍼 키워드 Java
외과의사 클래스의 treatPatient 메서드가 의사 클래스에 정의된 기능을 실행한 후 자체적인 특정 동작을 수행하고 싶다면 어떻게 해야 할까요? 이 경우 키워드를 사용하면 됩니다. super 자식 클래스에서 부모 클래스의 메서드에 액세스하는 데 사용할 수 있습니다. Surgeon 클래스의 treatPatient 메서드는 다음과 같이 작성할 수 있습니다.
treatPatient(){
super.treatPatient();
//add code specific to Surgeon
}
`super` 키워드를 사용하면 서브클래스에서 슈퍼클래스의 모든 데이터 멤버나 메서드에 접근할 수 있습니다. 다음으로 `super` 키워드에 대해 자세히 알아보겠습니다. 계승그리고 다형성 Java 예제 프로그램으로.
예시: 상속, 다형성 및 super 키워드를 학습하기
단계 1) 다음 코드를 편집기에 복사하세요.
public class Test{ public static void main(String args[]){ X x= new X(); Y y = new Y(); y.m2(); //x.m1(); //y.m1(); //x = y;// parent pointing to object of child //x.m1() ; //y.a=10; } } class X{ private int a; int b; public void m1(){ System.out.println("This is method m1 of class X"); } } class Y extends X{ int c; // new instance variable of class Y public void m1(){ // overridden method System.out.println("This is method m1 of class Y"); } public void m2(){ super.m1(); System.out.println("This is method m2 of class Y"); } }
단계 2) 코드를 저장, 컴파일 및 실행하고 출력 결과를 확인하세요.
단계 3) 6번째 줄부터 9번째 줄까지의 주석을 해제하세요. 코드를 저장하고 컴파일한 후 실행하세요. 출력 결과를 확인하세요.
단계 4) 10번째 줄의 주석을 해제하세요. 코드를 저장하고 컴파일하세요.
단계 5) 오류 = ? 이는 하위 클래스가 상위 클래스의 private 멤버에 접근할 수 없기 때문입니다.





