산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

Java 다형성 마스터: 개념, 예제, 모범 사례

Java 다형성

명확한 설명과 실전 코드 예제를 통해 Java 다형성을 탐구하고, 코드 유연성과 재사용성을 어떻게 향상시키는지 이해하세요.

객체 지향 프로그래밍의 필수 기둥인 다형성은 단일 엔티티가 여러 형태를 취할 수 있음을 의미합니다.

즉, 같은 엔티티(메서드, 연산자, 객체)가 컨텍스트에 따라 다른 연산을 수행할 수 있습니다.


예제: Java 다형성

class Polygon { // 도형 렌더링 메서드 public void render() { System.out.println("Rendering Polygon..."); } } class Square extends Polygon { // 정사각형 렌더링 public void render() { System.out.println("Rendering Square..."); } } class Circle extends Polygon { // 원 렌더링 public void render() { System.out.println("Rendering Circle..."); } } class Main { public static void main(String[] args) { // Square 객체 생성 Square s1 = new Square(); s1.render(); // Circle 객체 생성 Circle c1 = new Circle(); c1.render(); } }

출력

Rendering Square... Rendering Circle...

위 예제에서 슈퍼클래스 Polygon과 두 하위 클래스 Square, Circle을 생성했습니다. render() 메서드는 두 하위 클래스에 상속되지만 각자가 도형별 렌더링 로직으로 오버라이딩합니다.

핵심은 render()가 실제 객체 타입에 따라 다르게 동작한다는 점, 이것이 다형성의 본질입니다.


왜 다형성인가?

다형성은 개발자가 깔끔하고 일관된 코드를 작성하게 합니다. renderSquare()나 renderCircle() 같은 별도 메서드 대신 단일 render() 메서드가 각 도형에 적응하여 중복을 줄이고 유지보수성을 높입니다.

별도 메서드도 동작하지만 빠르게 코드 중복과 단편화된 API로 이어집니다. 다형성은 공통 계약 하에 동작을 통합하여 새 도형을 render() 오버라이딩만으로 통합할 수 있게 합니다.

참고: print() 메서드도 다형성을 보여줍니다. char, int, String 등을 여러 오버로드 없이 출력할 수 있습니다.


Java에서 다형성은 다음 기법으로 달성합니다:

  1. 메서드 오버라이딩
  2. 메서드 오버로딩
  3. 연산자 오버로딩

Java 메서드 오버라이딩

하위 클래스가 슈퍼클래스 메서드와 같은 시그니처의 메서드를 정의하면 하위 클래스 메서드가 슈퍼클래스 메서드를 오버라이딩합니다. 이는 같은 메서드 이름이 객체 런타임 타입에 따라 다른 연산을 수행하게 합니다.

예제 1: 메서드 오버라이딩을 이용한 다형성

class Language { public void displayInfo() { System.out.println("Common English Language"); } } class Java extends Language { @Override public void displayInfo() { System.out.println("Java Programming Language"); } } class Main { public static void main(String[] args) { // Java 클래스 객체 생성 Java j1 = new Java(); j1.displayInfo(); // Language 클래스 객체 생성 Language l1 = new Language(); l1.displayInfo(); } }

출력:

Java Programming Language Common English Language

여기서 Language가 기본 클래스, Java가 하위 클래스입니다. displayInfo() 메서드가 두 클래스에 정의되지만 각 구현이 컨텍스트 적절한 정보를 제공합니다.

실행되는 메서드는 런타임에 결정되므로 이 패턴을 런타임 다형성이라 부릅니다.

Java 다형성 마스터: 개념, 예제, 모범 사례

참고: 호출될 메서드는 프로그램 실행 중에 결정됩니다. 따라서 메서드 오버라이딩은 런타임 다형성입니다.


2. Java 메서드 오버로딩

메서드 오버로딩은 클래스가 같은 이름지만 다른 매개변수 리스트를 가진 여러 메서드를 가질 수 있게 합니다. 컴파일러가 제공된 인수에 따라 호출할 메서드를 결정합니다.

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

이 기법으로 같은 논리 연산이 다양한 입력을 받을 수 있게 합니다.

예제 3: 메서드 오버로딩을 이용한 다형성

class Pattern { // 매개변수 없는 메서드 public void display() { for (int i = 0; i < 10; i++) { System.out.print("*"); } } // 단일 매개변수 메서드 public void display(char symbol) { for (int i = 0; i < 10; i++) { System.out.print(symbol); } } } class Main { public static void main(String[] args) { Pattern d1 = new Pattern(); // 인수 없이 메서드 호출 d1.display(); System.out.println("\n"); // 단일 인수로 메서드 호출 d1.display('#'); } }

출력:

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

이 예제에서 Pattern 클래스는 두 개의 오버로드된 display() 메서드를 가집니다. 매개변수 없는 버전은 별표 10개를 출력하고, char를 받는 버전은 제공된 심볼 10개를 출력합니다.

컴파일러가 컴파일 타임에 메서드를 선택하므로 이 다형성 형태를 컴파일 타임 다형성이라 합니다.

참고: 호출될 메서드는 컴파일러에 의해 결정됩니다. 따라서 컴파일 타임 다형성으로도 알려져 있습니다.


3. Java 연산자 오버로딩

Java 연산자는 피연산자 타입에 따라 다른 동작을 보일 수 있습니다. 예: + 연산자는 숫자와 함께 쓰면 숫자 덧셈, 문자열과 함께 쓰면 문자열 연결을 수행합니다.

아래는 +가 피연산자에 어떻게 적응하는지 보여주는 스니펫입니다.

1. 숫자와 함께:

int a = 5; int b = 6; // 숫자와 + int sum = a + b; // 출력 = 11

2. 문자열과 함께:

String first = "Java "; String second = "Programming"; // 문자열과 + String name = first + second; // 출력 = Java Programming

따라서 +는 Java에서 덧셈과 연결 모두 수행하도록 오버로드되어 있습니다.

참고: C++ 같은 언어는 사용자 정의 연산자 오버로딩을 허용하지만 Java는 내장 연산자만 제한적으로 허용합니다.


다형적 변수

변수가 프로그램 실행 중 다른 타입의 객체를 참조할 수 있으면 다형적이라 합니다. Java에서 객체 참조가 이 행동을 가능하게 하여 기본 타입 참조가 하위 클래스 인스턴스를 가리킬 수 있게 합니다.

예제: 다형적 변수

class ProgrammingLanguage { public void display() { System.out.println("I am Programming Language."); } } class Java extends ProgrammingLanguage { @Override public void display() { System.out.println("I am Object-Oriented Programming Language."); } } class Main { public static void main(String[] args) { // 객체 변수 선언 ProgrammingLanguage pl; // ProgrammingLanguage 객체 생성 pl = new ProgrammingLanguage(); pl.display(); // Java 클래스 객체 생성 pl = new Java(); pl.display(); } }

출력:

I am Programming Language. I am Object-Oriented Programming Language.

이 예시에서 참조 pl은 기본 타입 ProgrammingLanguage로 선언되었지만 기본 클래스와 하위 클래스 객체 모두에 할당됩니다. 이는 업캐스팅과 런타임 다형성을 보여줍니다.

java

  1. Java 연산자 마스터하기: 종류, 문법, 실전 예제
  2. Java 인터페이스 마스터: 개념, 구현, 모범 사례
  3. Java Try-with-Resources 마스터: 자동 리소스 관리 완전 해설
  4. Java 애너테이션 완전 해설: 종류, 배치 위치, 실전 예제
  5. Java 애너테이션 타입 종합 가이드: 사전정의, 커스텀, 메타 애너테이션
  6. Java String length() 메서드: 문자열 크기 구하기 (예제 포함)
  7. Java String.indexOf() 마스터: 부분문자열 위치 찾기 & 실전 예제
  8. Java String.charAt() 완전 이해: 문법, 반환타입, 예외, 실전 예제
  9. Java String.endsWith() 마스터: 문자열 접미사 확인 예제
  10. Java 문자열 치환 마스터: replace(), replaceAll(), replaceFirst() 완벽 해설