JavaRush /Java Blog /Random-KO /커피 브레이크 #111. Java의 다형성 및 동적 바인딩. Java의 For 루프 + forEach ...

커피 브레이크 #111. Java의 다형성 및 동적 바인딩. Java의 For 루프 + forEach 루프 구문 예

Random-KO 그룹에 게시되었습니다

Java의 다형성 및 동적 바인딩

출처: DZone 다형성은 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. Java 프로그래밍을 처음 접하는 사람이든 숙련된 개발자이든 다형성이 무엇인지, 어떻게 작동하는지 알아야 합니다. 대부분의 개발자는 이 주제에 대해 잘 알고 있다고 주장하지만 정적 및 동적 바인딩과 같은 다른 복잡한 기능에 관해서는 많은 개발자가 자신감을 잃습니다. 커피 브레이크 #111.  Java의 다형성 및 동적 바인딩.  Java의 For 루프 + forEach 루프 구문 예 - 1

Java의 다형성이란 무엇입니까?

다형성(Polymorphism)은 다양한 형태를 갖는다는 뜻이다. 프로그래밍에서 이는 신호나 메시지가 두 가지 이상의 형태로 나타나는 능력을 의미합니다.

실제 사례

사람은 동시에 여러 가지 특성을 나타낼 수 있습니다. 예를 들어, 어머니는 아내이자 딸, 자매, 회사원 등이 될 수 있습니다. 그러므로 사람은 다양한 조건 하에서 다양한 특성을 나타낼 수 있습니다. 이것을 다형성이라고 합니다.

다형성의 중요성

다형성은 모든 객체 지향 프로그래밍 언어(예: Java)의 가장 중요한 기능 중 하나입니다. 다형성의 도움으로 동일한 작업을 다른 방식으로 수행할 수 있습니다.

다형성의 유형

Java에서 다형성은 두 가지 범주로 나눌 수 있습니다.
  1. 컴파일 시간 다형성(정적 연결)
  2. 런타임 다형성(런타임, 동적 바인딩)

컴파일 타임 다형성

컴파일 타임 다형성은 정적 연결이라고도 합니다. 이러한 유형의 다형성은 함수 오버로딩이나 연산자 오버로딩을 통해 달성할 수 있습니다. 그러나 Java에서는 연산자 오버로드를 지원하지 않으므로 이는 함수 오버로드로 제한됩니다. 함수 오버로딩(Function Overloading) 함수 이름이 같지만 포함된 매개변수의 개수가 다르거나 해당 매개변수의 데이터 유형이 하나 이상 다른 경우(또는 둘 다) 이를 함수라고 합니다. 또는 메소드 오버로드 등이 있으며 이러한 함수를 오버로드된 함수라고 합니다. 예제 1 지금까지 함수 오버로딩이 무엇인지 알아보았습니다. 이제 소프트웨어 기능 오버로딩을 시연해 보겠습니다.
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    // Method 2
    // having the same name but with 2 double parameters
    static double Addition(double a, double b)
    {
        // Returns sum of double numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
여기서 위의 프로그램을 실행할 수 있습니다 . 프로그램 설명:
  • 위 프로그램은 동일한 이름을 가진 두 개의 정적 함수인 Addition 으로 구성됩니다 .

  • 여기서 두 함수 모두 동일한 수의 매개변수를 포함하지만 해당 매개변수는 다릅니다.

  • 방법 1은 두 개의 정수 매개변수를 허용하는 반면, 방법 2는 두 개의 이중 매개 변수를 허용합니다 .

  • 메인 함수에서 먼저 Addition(12, 14) 함수를 호출합니다 . 전달된 매개변수는 정수(12 및 14)이므로 여기서는 방법 1이 호출됩니다.

  • 그런 다음 Addition(15.2, 16.1) 함수를 호출했습니다 . 전달된 매개변수는 double 데이터 유형(15.2 및 16.1)이므로 이번에는 메소드 2가 호출됩니다 .

  • 이는 다양한 매개변수 데이터 유형을 기반으로 Java에서 함수 오버로드가 달성되는 방식입니다.

예제 2 아래 프로그램을 고려해보세요:
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {

        // Returns sum of integer numbers
        return a + b;
    }

    // Method 2
    // having the same name but with 3 integer parameters
    static double Addition(double a, double b)
    {

        // Returns sum of integer numbers
        return a + b;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(12, 14));
        System.out.println(Addition(15.2, 16.1));

    }
}
여기서 위의 프로그램을 실행할 수 있습니다 . 프로그램 설명:
  • 위 프로그램은 동일한 이름을 가진 두 개의 정적 함수인 Addition 으로 구성됩니다 .

  • 여기서 두 함수에는 서로 다른 수의 매개변수가 포함되어 있지만 처음 두 개의 해당 매개변수의 데이터 유형은 동일합니다(정수).

  • 방법 1은 두 개의 정수 매개변수를 사용하고 방법 2는 세 개의 정수 데이터 유형 매개변수를 사용합니다.

  • 메인 함수에서 먼저 Addition(2, 3) 함수를 호출합니다 . 전달된 매개변수는 정수(2와 3)이므로 여기에서는 메서드 1을 호출합니다 .

  • 그런 다음 Addition(4, 5, 6) 함수를 호출했습니다 . 전달된 매개변수는 이중 데이터 유형(4, 5, 6)이므로 이번에는 메소드 2를 호출합니다 .

  • 이는 다양한 수의 매개변수를 기반으로 Java에서 함수가 오버로드되는 방식입니다.

실시예 3
class Main {

    // Method 1
    // Method with 2 integer parameters
    static int Addition(int a, int b)
    {
        // Return the sum
        return a + b;
    }
    // Method 2
    // having the same name but with 3 parameters
    // 1st parameter is of type double and other parameters
    // are of type integer
    static double Addition(double a, int b,  int c)
    {
        // Return the sum
        return a + b + c;
    }
    public static void main(String args[]) {

        // Calling method by passing
        // input as in arguments
        System.out.println(Addition(2, 4));
        System.out.println(Addition(4.2, 6, 10));

    }
}
여기서 위의 프로그램을 실행할 수 있습니다 . 프로그램 설명:
  • 위 프로그램은 동일한 이름을 가진 두 개의 정적 함수인 Addition 으로 구성됩니다 .

  • 두 함수 모두 서로 다른 수의 매개변수를 포함하며 첫 번째 해당 요소의 데이터 유형도 다릅니다.

  • 방법 1은 두 개의 정수 매개변수를 사용하는 반면, 방법 2는 세 개의 매개변수를 사용합니다. 첫 번째는 double 유형이고 나머지 두 개는 정수 데이터 유형입니다.

  • 메인 함수에서 먼저 Addition(2, 4) 함수를 호출합니다 . 전달된 매개변수는 정수(2와 4)이므로 여기에서는 메서드 1을 호출합니다 .

  • 그런 다음 Addition(4.2, 6, 10) 함수를 호출했습니다 . 전달된 첫 번째 매개 변수는 정수 유형이고 나머지 매개 변수는 double (4.2, 6, 10) 데이터 유형이므로 이번에는 방법 2가 호출됩니다 .

  • 이것이 Java가 다양한 수의 매개변수와 해당 매개변수의 다양한 데이터 유형을 기반으로 함수 오버로드를 달성하는 방법입니다.

메모. 함수의 반환 유형에만 기초하여 함수를 오버로드할 수 없습니다.

런타임 다형성

이 옵션은 동적 연결이라고도 합니다. 이 과정에서 다른 함수를 위해 생성된 함수를 호출하는 것은 런타임에만 허용됩니다. 메소드 재정의를 사용하여 Java에서 동적 바인딩을 달성할 수 있습니다.

메소드 재정의

Java에서 메서드 재정의는 기본 클래스의 메서드에 파생 클래스의 정의가 있을 때 발생합니다. 기본 클래스 메서드나 함수를 재정의된 메서드라고 합니다.
// Class 1
class Parent {

    // Print method
    void Print()
    {

        // Print statement
        System.out.println("Inside Parent Class");
    }
}

// Class 2
class Child1 extends Parent {

    // Print method
    void Print() { System.out.println("Inside Child1 Class"); }
}

// Class 3
class Child2 extends Parent {

    // Print method
    void Print()
    {
        // Print statement
        System.out.println("Inside Child2 Class");
    }
}

class Main {

    public static void main(String args[]) {

        // Creating an object of class Parent
        Parent parent = new Parent();
        parent.Print();

        // Calling print methods
        parent = new Child1();
        parent.Print();

        parent = new Child2();
        parent.Print();
    }
}
여기서 위의 프로그램을 실행할 수 있습니다 . 프로그램 설명:
  • 위 프로그램은 Parent ( 클래스 1 ), Child1 ( 클래스 2 ), Child2 ( 클래스 3 )의 세 가지 클래스로 구성됩니다. 클래스 2클래스 3은 클래스 1을 상속합니다 .

  • 부모 에는 Print() 라는 메서드가 있습니다 . 이 함수 안에는 " Inside Parent Class "를 인쇄합니다 . Child1Child2 에는 기본적으로 Parent 클래스 의 Print() 함수를 재정의 하고 " Inside Child1 Class " 및 " Inside Child2 Class "를 각각 콘솔에 인쇄하는 Print() 함수 도 있습니다.

  • 메인 함수에서 먼저 parent라는 상위 클래스의 객체를 만듭니다. 그런 다음 이 객체를 사용하여 상위 클래스 의 인쇄 메소드를 호출합니다 . 따라서 " Inside Parent Class "가 콘솔에 인쇄됩니다.

  • 그런 다음 Child1 클래스의 기본 생성자를 호출 하고 Print() 함수를 호출합니다 . 부모 클래스 의 Print() 메서드를 재정의했기 때문에 이제 Child1 클래스 에 정의된 Print() 메서드가 호출됩니다 . 따라서 " Inside Child1 Class "가 콘솔에 인쇄됩니다.

  • 마지막으로 Child2 클래스의 기본 생성자를 호출 하고 Print() 함수를 호출합니다 . 여기에서는 부모 클래스 의 Print() 메서드를 재정의했기 때문에 Child2 클래스 에 정의된 Print() 메서드가 호출됩니다 . 따라서 " Inside Child2 Class "가 콘솔에 인쇄됩니다.

  • 이것이 Java에서 메소드 재정의가 달성되는 방법입니다.

결과

이 기사에서는 Java의 다형성이 무엇인지 배웠습니다. 그런 다음 주제를 더 깊이 탐구하고 Java의 두 가지 유형의 다형성, 즉 컴파일 시간 다형성과 런타임 다형성에 대해 논의했습니다. 우리는 Java에서 정적 및 동적 바인딩이 어떻게 달성될 수 있는지 프로그램을 통해 보여주었습니다.

Java의 For 루프 + forEach 루프 구문 예

출처: FreeCodeCamp 프로그래밍의 루프는 특정 조건이 충족될 때까지 지속적으로 실행되는 일련의 명령입니다. 이번 글에서는 Java의 for 루프 와 forEach 루프 에 대해 알아 보겠습니다 .커피 브레이크 #111.  Java의 다형성 및 동적 바인딩.  Java의 For 루프 + forEach 루프 구문 예 - 2

Java의 For 루프 구문

for 루프 를 생성하는 구문은 다음과 같습니다 .
for (initialization; condition; increment/decrement) {
   // code to be executed
}
코드의 일부 키워드를 살펴보겠습니다.
  • for는 루프를 생성할 것임을 나타냅니다. 그 다음에는 루프를 작동시키는 데 필요한 모든 것을 포함하는 괄호가 옵니다.

  • 초기화는 초기 변수를 루프의 시작점(일반적으로 정수)으로 정의합니다.

  • 조건은 루프를 실행해야 하는 횟수를 지정합니다.

  • 증가 / 감소는 루프가 실행될 때마다 초기 변수의 값을 증가/감소시킵니다. 변수의 값이 증가/감소함에 따라 지정된 조건에 경향이 있습니다.

  • 각 키워드는 세미콜론( ; )으로 구분됩니다.

여기 몇 가지 예가 있어요.
for(int x = 1; x <=5; x++) {
  System.out.println(x);
}

/*
1
2
3
4
5
*/
위의 예에서 시작 변수는 값이 1인 x 입니다. x 값이 5보다 작거나 같은 한 루프는 계속 실행됩니다 . 이것이 조건입니다. x++는 각 실행 후에 x 값을 증가시킵니다 . 조건이 충족되었기 때문에 5 이후에 멈추는 x 값을 계속 인쇄했습니다 . 6으로 늘리는 것은 5보다 크고 같지 않기 때문에 불가능합니다. 다음 예에서는 for 루프를 사용하여 배열의 모든 값을 인쇄해 보겠습니다.
int[] randomNumbers = {2, 5, 4, 7};
for (int i = 0; i < randomNumbers.length; i++) {
  System.out.println(randomNumbers[i]);
}

// 2
// 5
// 4
// 7
이는 마지막 예와 거의 동일합니다. 여기서는 배열의 첫 번째 요소의 순서 번호가 0이기 때문에 배열의 길이를 조건으로 사용하고 변수의 초기 값을 0으로 사용했습니다.

Java의 forEach 루프 구문

forEach 루프는 특히 배열 요소를 반복하는 데 사용됩니다. 구문은 다음과 같습니다.
for (dataType variableName : arrayName) {
  // code to be executed
}
여기서 구문은 for 루프보다 짧다는 것을 알 수 있습니다 . 그리고 forEach 루프도 for 키워드 로 시작합니다 . 변수를 값으로 초기화하는 대신 먼저 데이터 유형을 지정합니다 (배열의 데이터 유형과 일치해야 함). 그 뒤에는 변수 이름배열 이름이 콜론으로 구분되어 옵니다. 다음은 구문을 더 잘 이해하는 데 도움이 되는 예입니다.
int[] randomNumbers = {2, 5, 4, 7};
for (int x : randomNumbers) {
  System.out.println(x + 1);
}

/*
3
6
5
8
*/
이 예에서는 각 요소를 반복하고 초기 값을 1씩 증가시켰습니다. 기본적으로 루프는 배열의 모든 요소를 ​​반복한 후에 중지됩니다. 즉, 변수에 값을 전달하거나 루프 종료 조건을 지정할 필요가 없습니다.

결론

이 기사에서는 루프가 무엇인지, Java에서 forforEach 루프를 생성하는 구문을 배웠습니다 . 또한 언제, 어떻게 사용하는지 이해하는 데 도움이 되는 몇 가지 예도 살펴보았습니다. 즐거운 코딩하세요!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION