English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 프로세스 제어

Java 배열

Java object-oriented(I)

Java object-oriented(II)

Java object-oriented(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 셋

Java Set 셋

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 다형성

이 튜토리얼에서는 파다이믹, 다른 유형의 파다이믹, 그리고 Java에서 그들을 구현하는 방법에 대해 예제를 통해 배웁니다.

파다이믹은面向对象编程의 중요한 개념입니다. 이는 단순히 하나 이상의 형태를 의미합니다. 즉, 동일한 실체(메서드, 연산자 또는 객체)가 다른 상황에서의 행동이 다를 수 있습니다. 예를 들어,

Java에서+연산자는 두 개의 특정 기능을 수행합니다. 정수와 실수와 함께 사용될 때, 덧셈 연산을 수행합니다.

int a = 5;
int b = 6;
int sum = a + b;     //  sum = 11

b;+연산자와 문자열을 함께 사용할 때, 문자열 연결을 수행합니다. 예를 들어,

String firstName = "abc \"";
String lastName = "xyz";
name = firstName + lastName;     //  name = abc xyz

파다이믹의 유형

Java에서 파다이믹은 두 가지 유형으로 나눌 수 있습니다:

  • 런타임 파다이믹

  • 컴파일 시 다형성

런타임 파다이믹

Java에서는 메서드 재정의를 통해 런타임 파다이믹을 구현할 수 있습니다.

부모 클래스 및 자식 클래스에서 동일한 메서드가 생성된 경우를 가정해 보겠습니다. 이 경우, 호출된 메서드는 메서드를 호출한 객체에 따라 결정됩니다. 예를 들어,

예제1:메서드 재정의

abstract class Animal {
   public abstract void makeSound();
}
class Dog extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Bark bark..");
   }
}
class Cat extends Animal {
   @Override
   public void makeSound() {
      System.out.println("Meow meow..");
   }
}
class Main {
   public static void main(String[] args) {
     Dog  d1 = new Dog();
      d1.makeSound();
      Cat c1 = new Cat();
      c1.makeSound();
   }
}

출력

Bark bark…
Meow-meow...

메서드 오버라이드가 어떻게 작동하는지 이해하려면Java의 메서드 오버라이드

위 예제에서该方法 makeSound()는 두 다른 클래스에서 다른 구현을 가집니다. 프로그램을 실행할 때

  • 표현식 d1.makeSound()는 Dog 클래스의 메서드를 호출합니다. 이는 d1는 Dog 클래스의 객체입니다

  • 표현식 c1.makeSound()는 Cat 클래스의 메서드를 호출합니다. 이는 c1는 Cat 클래스의 객체입니다

프로그램 실행 중에 호출될 메서드를 결정합니다. 따라서 메서드 오버라이드는 실행 시 다형성입니다

컴파일 시 다형성

Java의 메서드 오버로드와 연산자 오버로드를 통해 컴파일 시 다형성을 구현할 수 있습니다

메서드 오버로드

Java 클래스에서 파라미터가 다를 경우 동일한 이름으로 메서드를 생성할 수 있습니다. 예를 들어

void func() { ... }
void func(int a) { ... }
float func(double a) { ... }
float func(int a, float b) { ... }

이것은 Java에서 메서드 오버로드라고 합니다

메서드 오버로드를 예제로 들어보겠습니다

예제3:메서드 오버로드

class Demo {
 public void displayPattern(){
   for(int i = 0; i < 10; i++) {
     System.out.print("*");
   }
 }
 public void displayPattern(char symbol) {
   for(int i = 0; i < 10; i++) {
     System.out.print(symbol);
   }
 }
}
class Main {
 public static void main(String[] args) {
   Demo d1 = new Demo();
   d1.displayPattern();
   System.out.println("\n");
   d1.displayPattern('#');
 }
}

출력

**********
##########

위 프로그램에서 displayPattern() 메서드가 오버로드되었습니다

  •  만약 어떤 파라미터를 전달하지 않고 이 메서드를 호출하는 경우 생성됩니다 * 문자의 패턴.

  •  이 메서드를 문자로 인자로 전달하여 호출하면, # 문자의 패턴이 생성됩니다.

메서드 오버로드에 대한 더 많은 정보를 알고 싶다면, 다음을 방문하세요메서드 오버로드

Java 메서드 오버로드 VS 메서드 오버라이드

  • 메서드 오버라이드의 경우, 메서드는 다른 클래스에서야 합니다. 하지만 메서드 오버로드의 경우, 메서드는 같은 클래스에서야 합니다.

  •  메서드 오버라이드는 실행 시에 수행되고, 메서드 오버로드는 컴파일 시에 수행됩니다.

연산자 오버로드

Java에서 일부 연산자는 다른 연산자에 대해 다른 행동을 합니다. 예를 들어,

  • + 연산자는 숫자 추가와 문자열 연결을 수행하기 위해 오버로드됩니다.

  • &、|과 !은 논리적 및 비트 연산을 오버로드합니다.

Java에서 연산자 오버로드가 어떻게 동작하는지 보겠습니다.

Java에서+연산자는 두 가지 특정 기능을 수행합니다. 숫자(정수와 실수)와 함께 사용할 때, 더하기 연산을 수행합니다. 예를 들어,

int a = 5;
int b = 6;
int sum = a + b;     //  sum = 11

b;+연산자와 문자열을 함께 사용할 때, 문자열 연결을 수행합니다. 예를 들어,

String firstName = "abc \"";
String lastName = "xyz";
name = firstName + lastName;     //  name = abc xyz

C와 같은 ++이러한 언어에서는 다른 연산자에 대해 다른 처리를 할 수 있는 연산자를 정의할 수 있습니다. 하지만 Java는 사용자 정의 연산자 오버로드를 지원하지 않습니다.

다형성이 필요한 이유는 무엇인가요?

다형성은 일관된 코드를 생성할 수 있게 합니다. 예를 들어,

원 cercle과 사각형을 그리려면, Polygon 클래스를 생성하고, Circle과 square에서 두 서브 클래스를 상속할 수 있습니다. 이 경우, 두 서브 클래스에서 다른 이름을 가진 메서드 대신 같은 이름의 render() 메서드를 생성해야 합니다.

우리의 메서드 오버로드 예제에서는, 일관성을 유지하기 위해 같은 메서드 이름 displayPattern()를 사용하여 두 가지 다른 패턴을 표시합니다.

Java의 print() 메서드도 다형성(메서드 오버로드)의 한 예입니다. 같은 메서드를 다른 타입의 값, 예를 들어 char, int, String 등을 출력하는 데 사용할 수 있습니다. 또한, 같은 메서드를 한 번에 여러 값을 출력할 수 있습니다.

다형성 변수

Java에서는, 객체 변수(인스턴스 변수)는 다형성 변수의 행동을 나타냅니다. 이는 클래스의 객체 변수가 그 클래스의 객체와 그 서브 클래스의 객체를 참조할 수 있기 때문입니다. 예를 들어,

class Animal {
   public void displayInfo() {}}
      System.out.println("I am an animal.");
   }
}
class Dog extends Animal {
   @Override
   public void displayInfo() {}}
      System.out.println("I am a dog.");
   }
}
class Main {
   public static void main(String[] args) {
    
      //Animal 클래스의 객체 변수 a를 선언1
      Animal a1;
    
     //Animal 클래스의 객체 생성
      a1 = new Animal();
      a1.displayInfo();
     //dog 클래스의 객체 생성
      a1 = new Dog();
      a1.displayInfo();
   }
}

출력

I am an animal.
I am a dog.

위의 예제에서 Animal 클래스의 객체 변수 a를 생성했습니다1。여기서는 a1은 다중 형성 변수입니다.

이는 다음과 같은 이유로입니다.

  • 문장에서 a1 = new Animal(),a1Animal 클래스를 참조하는 객체.

  • 문장에서 a1 = new Dog(),a1Dog 클래스를 참조하는 객체.

이것은 Java에서의 상향 변환 예제입니다. 더 많은 정보를 얻으려면 방문해 주세요Java 상향 변환과 하향 변환