Java의 다형성 및 동적 바인딩
출처: DZone 다형성은 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. Java 프로그래밍을 처음 접하는 사람이든 숙련된 개발자이든 다형성이 무엇인지, 어떻게 작동하는지 알아야 합니다. 대부분의 개발자는 이 주제에 대해 잘 알고 있다고 주장하지만 정적 및 동적 바인딩과 같은 다른 복잡한 기능에 관해서는 많은 개발자가 자신감을 잃습니다.Java의 다형성이란 무엇입니까?
다형성(Polymorphism)은 다양한 형태를 갖는다는 뜻이다. 프로그래밍에서 이는 신호나 메시지가 두 가지 이상의 형태로 나타나는 능력을 의미합니다.실제 사례
사람은 동시에 여러 가지 특성을 나타낼 수 있습니다. 예를 들어, 어머니는 아내이자 딸, 자매, 회사원 등이 될 수 있습니다. 그러므로 사람은 다양한 조건 하에서 다양한 특성을 나타낼 수 있습니다. 이것을 다형성이라고 합니다.다형성의 중요성
다형성은 모든 객체 지향 프로그래밍 언어(예: Java)의 가장 중요한 기능 중 하나입니다. 다형성의 도움으로 동일한 작업을 다른 방식으로 수행할 수 있습니다.다형성의 유형
Java에서 다형성은 두 가지 범주로 나눌 수 있습니다.- 컴파일 시간 다형성(정적 연결)
- 런타임 다형성(런타임, 동적 바인딩)
컴파일 타임 다형성
컴파일 타임 다형성은 정적 연결이라고도 합니다. 이러한 유형의 다형성은 함수 오버로딩이나 연산자 오버로딩을 통해 달성할 수 있습니다. 그러나 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에서 함수 오버로드가 달성되는 방식입니다.
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에서 함수가 오버로드되는 방식입니다.
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 "를 인쇄합니다 . Child1 및 Child2 에는 기본적으로 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 루프 에 대해 알아 보겠습니다 .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씩 증가시켰습니다. 기본적으로 루프는 배열의 모든 요소를 반복한 후에 중지됩니다. 즉, 변수에 값을 전달하거나 루프 종료 조건을 지정할 필요가 없습니다.
GO TO FULL VERSION