초보자를 위한 OOP 개념: 다형성 설명
게시 됨: 2021-12-10Python 및 Java와 같은 고급 언어에서 OOP 또는 객체 지향 프로그래밍은 논리 및 기능보다는 데이터 및 객체를 중심으로 한 소프트웨어 설계 조직을 나타냅니다. 개체는 고유한 속성과 동작이 있는 데이터 필드로 정의됩니다. 즉, OOP는 논리보다 객체에 중점을 둡니다. 이러한 프로그래밍 모델은 적극적인 업데이트 및 유지 관리가 필요한 크고 복잡한 프로그램에 이상적입니다. 또한 확장성, 효율성 및 코드 재사용성의 추가 이점을 제공합니다.
OOP에는 다형성, 캡슐화, 추상화 및 상속의 네 가지 기본 빌딩 블록이 있습니다. 우리 기사의 범위는 OOP의 다형성으로 제한되어 있으므로 Java의 다형성 및 Python의 다형성의 예를 포함하여 다형성에 대해 자세히 설명합니다.
세계 최고의 대학에서 온라인으로 소프트웨어 과정을 배우십시오. 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.
목차
다형성 정의
가장 간단한 다형성 정의는 다형성이 다양한 형태로 존재한다는 의미일 것입니다. 그것은 '수많은'을 의미하는 '폴리'와 '형태'로 번역되는 '모프'의 두 가지 그리스 용어에 뿌리를 두고 있습니다.
개념을 더 잘 이해하기 위해 먼저 간단한 예를 들어보겠습니다. 마우스나 트랙패드를 사용할 때마다 화면에서 움직이는 것과 동일한 커서인 커서 동작을 예로 들어 보겠습니다. 사용자의 동작이나 프로그램 모드에 따라 커서는 화살표, 십자형, 선, 집게손가락과 같은 다양한 형태를 취할 수 있습니다.
다형성은 OOP의 가장 중요한 기능 중 하나입니다. 자바와 파이썬에서 변수, 객체, 함수는 다양한 형태로 존재할 수 있습니다. 다형성에서 하위 클래스 또는 메서드는 상위 클래스의 일부 기능을 유지하면서 속성과 동작을 정의합니다. 이는 기본 클래스가 파생 클래스에 속성과 동작을 제공하는 클래스 계층 구조를 생성할 수 있도록 하는 상속으로 이어집니다. 그 후 파생 클래스의 기능은 필요에 따라 자유롭게 수정하거나 확장할 수 있습니다. 이를 위해 다형성은 호출하는 객체의 유형에 따라 올바른 메서드가 실행되도록 합니다.
관점에서 보면 날짜와 시간을 표시하는 클래스가 있다고 가정합니다. 이제 클래스를 상속하고 "Hello!" 메시지를 표시하는 메서드를 만듭니다. 날짜와 시간과 함께.
자바 다형성의 예
"area()" 메소드가 있는 수퍼클래스 "Shapes"를 고려하십시오. "모양" 아래의 서브클래스는 "사각형", "원", "삼각형" 등이 될 수 있으며, 각 서브클래스에는 면적 계산 방법이 있습니다. 상속 및 다형성의 개념을 적용하여 하위 클래스는 "area()" 메서드를 사용하여 해당 모양의 면적을 계산하는 공식을 찾습니다.
클래스 모양 {
공공 무효 영역() {
System.out.println("면적 공식 ");
}
}
클래스 삼각형 확장 모양 {
공공 무효 영역() {
System.out.println("삼각형은 1/2 * 밑변 * 높이 ");
}
}
클래스 Circle은 Shapes를 확장합니다. {
공공 무효 영역() {
System.out.println("원은 3.14 * 반지름 * 반지름입니다. ");
}
}
클래스 메인 {
공개 정적 무효 메인(문자열[] 인수) {
모양 myShape = new Shapes(); // Shapes 객체 생성
모양 myTriangle = new Triangle(); // 삼각형 객체 생성
모양 myCircle = new Circle(); // Circle 객체 생성
myShape.area();
myTriangle.area();
myShape.area();
myCircle.area();
}
}
위 프로그램 코드의 출력은 다음과 같습니다.
삼각형의 넓이 공식은 1/2 * 밑변 * 높이입니다.
원의 면적 공식은 3.14 * 반지름 * 반지름입니다.
OOP의 다형성 유형
OOP의 다형성에는 정적(컴파일 타임 다형성)과 동적(런타임 다형성)의 두 가지 유형이 있습니다.
1. 정적 다형성
Java에서 메소드 오버로딩은 가장 일반적인 정적 다형성 유형입니다. 동일한 클래스 내에서 매개변수가 다른 동일한 이름의 여러 메소드를 작성할 수 있습니다. 매개변수 세트는 다음 세 가지 기준 중 하나 이상에서 달라야 합니다.
- 메소드는 다른 수의 매개변수를 가져야 합니다.
- 매개변수 유형은 달라야 합니다. 예를 들어, 한 메서드가 Long을 수락하면 다른 메서드는 String을 수락합니다.
- 메서드는 다른 순서로 매개 변수를 수락해야 합니다. 예를 들어, 방법 1이 Long 및 String을 허용하는 경우 방법 2는 String을 승인한 다음 Long을 승인해야 합니다.
메서드 오버로딩에서 메서드를 호출하는 동안 컴파일러는 호출하는 동안 전달된 매개 변수를 기반으로 호출할 메서드를 선택합니다. 이것은 컴파일 시간에 발생하므로 이러한 유형의 다형성을 컴파일 시간 다형성이라고도 합니다.
다음은 컴파일 타임 다형성을 보여주는 Java 코드 예제입니다. 이 예에서 메서드 add()는 두 가지 다른 유형의 매개변수로 오버로드됩니다.
패키지 정적다형성;
공개 클래스 추가
{
무효 합계(int x, int y)
{
정수 c = x+y;
System.out.println("두 수의 덧셈 :" +c); }
무효 합계(int x, int y, int z)
{
정수 c = x+y+z;
System.out.println(" 세 수의 덧셈 :" +c); }
공개 정적 무효 메인(String[] 인수)
{
추가 obj = new Addition();
obj.sum (45,34);
obj.sum(60, 32, 11);
}
}
위 프로그램의 출력은 다음과 같습니다.
두 수의 덧셈:79
세 숫자의 추가:103
2. 동적 다형성
동적 또는 런타임 다형성은 메서드 재정의를 통해 달성됩니다. 여기에서 메서드는 다른 클래스의 다른 형식(메서드 재정의)이며 컴파일 시간 대신 재정의된 메서드에 대한 호출이 런타임에 해결됩니다. 이제 객체를 클래스 참조에 할당하고 메서드를 호출하면 객체의 클래스에 있는 메서드가 실행됩니다. 객체는 런타임에 생성되기 때문에 실행되어야 하는 메서드(객체 내)의 형태는 런타임에만 결정됩니다.
다음은 런타임 다형성을 보여주는 Java 코드 예제 입니다. 이 예에는 "동물"이라는 슈퍼클래스와 "캥거루", "호랑이", "물고기"라는 세 개의 서브클래스가 있습니다. 하위 클래스는 상위 클래스를 확장하고 "move()" 메서드를 재정의합니다. "move()" 메서드는 부모 클래스 "Animal"의 참조 변수에 의해 호출됩니다.
클래스 동물{
무효 이동(){
System.out.println("동물의 움직임");
}
}
클래스 캥거루는 동물을 확장합니다.{
무효 이동(){
System.out.println("캥거루 점프");
}
}
클래스 호랑이 확장 동물{
무효 이동(){
System.out.println("호랑이 걷기");
}
}
클래스 물고기는 동물을 확장합니다.{
무효 이동(){
System.out.println("물고기 수영");
}
}
수업 메인{
공개 정적 무효 메인(문자열 인수[]){
동물 A = new Animal();
동물 k = 새로운 캥거루(); //업캐스팅
동물 t = 새로운 호랑이(); //업캐스팅
동물 f = 새로운 물고기(); //업캐스팅
A. 이동();
k.move();
t.move();
f.이동();
}
}
위 프로그램의 출력은 다음과 같습니다.
동물이 움직인다
캥거루 점프
호랑이 산책
물고기 수영
파이썬의 다형성
Python의 다형성에는 연산자 다형성, 함수 다형성 및 클래스 다형성의 세 가지 유형이 있습니다. Python은 또한 메서드 재정의를 허용하지만 메서드 오버로딩은 허용하지 않습니다.
1. 연산자 다형성
Python에서 '+' 연산자는 이중 용도를 갖습니다. 정수형 데이터의 경우 산술 덧셈 연산에 사용되며, 문자열의 경우 '+' 연산자가 연결을 수행합니다.
다음은 '+' 연산자가 정수 데이터 유형에 대해 덧셈을 수행하는 Python 코드 예제입니다.
숫자1 = 4
숫자2 = 5
인쇄(숫자1+숫자2)
위 프로그램 코드의 출력은 '9'입니다.
다음은 '+' 연산자가 문자열 데이터 유형에 대해 연결을 수행하는 Python 코드 예제입니다.
str1 = "좋음"
str2 = "저녁"
print(str1+” “+str2)
위 프로그램의 출력은 'Good Evening'입니다.
2. 기능 다형성
Python의 'len()' 함수는 목록, 문자열, 튜플, 사전 및 집합과 같은 다양한 데이터 유형과 호환되지만 각 데이터 유형에 대한 특정 정보를 반환합니다. 다음은 예입니다.
print(len("프로그래머"))
print(len(["파이썬", "자바", "C"]))
print(len({"이름": "캐시", "주소": "텍사스"}))
위의 프로그램은 다음과 같은 출력을 가질 것입니다:
9
삼
2
3. 클래스 다형성
다형성의 개념을 확장하여 Python은 여러 클래스가 같은 이름의 메서드를 가질 수 있도록 합니다. 다음은 Python의 클래스 메서드에서 다형성을 보여주는 예입니다. 예제에는 'Cat'과 'Dog'의 두 가지 클래스가 있습니다. 구조가 비슷하고 메서드 이름이 'make_sound()', 'info()'가 같습니다.
클래스 고양이:
def __init__(자신, 이름, 나이):
self.name = 이름
self.age = 나이
def 정보(자신):
print(f"나는 고양이입니다. 제 이름은 {self.name}입니다. 저는 {self.age}살입니다.")
def make_sound(self):
print("야옹")
클래스 개:
def __init__(자신, 이름, 나이):
self.name = 이름
self.age = 나이
def 정보(자신):
print(f"나는 개입니다. 제 이름은 {self.name}입니다. 저는 {self.age}살입니다.")
def make_sound(self):
print("껍질")
cat1 = 고양이("미니", 3)
dog1 = 개("톰", 6)
(cat1, dog1)의 동물:
animal.make_sound()
동물 정보()
animal.make_sound()
출력은 다음과 같습니다.
야옹
나는 고양이다. 내 이름은 미니입니다. 저는 3살입니다.
야옹
짖다
나는 개다. 제 이름은 톰입니다. 저는 6살입니다.
짖다
4. 메서드 재정의
Python은 또한 자식 클래스가 부모 클래스의 속성과 메서드를 상속할 수 있도록 합니다. 특정 메서드와 속성은 자식 클래스에 맞게 재정의할 수 있습니다(메서드 재정의). 그런 다음 다형성은 상위 클래스와 이름이 같은 재정의된 메서드 및 속성에 대한 액세스를 허용합니다.
다음은 메서드 재정의를 설명하는 Python 코드 예제입니다.
수학 수입 파이에서
클래스 모양:
def __init__(자신, 이름):
self.name = 이름
def 영역(자체):
통과하다
사실(자신):
return "나는 닫힌 인물입니다."
def __str__(자신):
반환 self.name
클래스 정사각형(모양):
def __init__(자체, 길이):
super().__init__("사각형")
self.length = 길이
def 영역(자체):
반환 self.length**2
사실(자신):
return "정사각형의 각 각은 90도입니다."
클래스 원(모양):
def __init__(자신, 반경):
super().__init__("원")
self.radius = 반경
def 영역(자체):
pi*self.radius**2 반환
a = 정사각형(4)
b = 원(7)
인쇄(나)
print(b.fact())
인쇄(a.fact())
인쇄(b.area())
위의 프로그램은 다음과 같은 출력을 가질 것입니다:
원
나는 닫힌 인물이다.
정사각형의 각 각은 90도입니다.
153.93804002589985
메서드 재정의에 대해 자세히 알아보세요.
OOP에서 다형성의 장점
OOP의 다형성에는 세 가지 중요한 이점이 있습니다. 그것들은 다음과 같습니다:
- 다형성은 코드의 재사용성을 허용합니다. 따라서 클래스가 작성, 테스트 및 구현되면 계속해서 재사용할 수 있습니다. 또한 원본 코드에 영향을 주지 않고 코드를 변경할 수 있습니다. 이 모든 것이 코더에게 상당한 시간을 절약해 줍니다.
- 다형성에서는 여러 데이터 값을 단일 변수에 저장할 수 있습니다. 게다가 슈퍼클래스에서 서브클래스로 상속된 변수의 값은 슈퍼클래스나 서브클래스에서 변수의 값을 변경하지 않고도 수정할 수 있다.
- 마지막으로 다형성은 더 적은 수의 코드로 작동하므로 프로그래머가 디버깅을 더 쉽게 수행할 수 있습니다.
앞으로의 길
upGrad는 권위 있는 리버풀 존 무어스 대학교(Liverpool John Moores University)와 협력하여 엄격한 온라인 데이터 과학 석사 프로그램을 제공합니다. 데이터 과학 분야에서 경력을 쌓고자 하는 직장인을 위한 것입니다. 과정은 LJMU의 석사 학위와 IIIT Bangalore의 Executive PG 프로그램 인증으로 끝납니다.
프로그램 하이라이트:
- 500시간 이상의 콘텐츠, 60개 이상의 사례 연구 및 프로젝트, 20개 이상의 라이브 세션
- Python, AWS, MySQL 등과 같은 14개 이상의 도구 및 소프트웨어에 대한 포괄적인 범위
- 업계 전문가와 함께하는 코칭 세션
- 동료 학습 및 산업 네트워킹
- 360도 경력 지원
오늘날 최고의 교육 기술 플랫폼 중 하나인 upGrad는 최첨단 기술, 최신 교육학, 산업 파트너십 및 세계적 수준의 교수진의 조합을 통해 학습자에게 계속 영감을 주고 준비를 돕습니다.
세계 최고의 대학에서 온라인으로 데이터 과학 과정을 배우십시오. 이그 제 큐 티브 PG 프로그램, 고급 인증 프로그램 또는 석사 프로그램을 획득하여 경력을 빠르게 추적하십시오.
OOP에서 다형성이 사용되는 이유는 무엇입니까?
OOP에서 다형성은 그것을 호출하는 객체의 클래스를 기반으로 다른 작업을 수행하는 방법입니다. 따라서 여러 클래스의 개체에 메시지를 보내고 모든 개체는 해당 클래스의 속성에 따라 응답합니다.
Java에서 메소드 오버로딩이란 무엇입니까?
Java에서 동일한 이름을 가진 둘 이상의 메소드는 매개변수가 다를 수 있습니다(다른 유형의 매개변수, 다른 수의 매개변수 또는 둘 다). 이러한 메서드를 오버로드된 메서드라고 하고 기능을 메서드 오버로딩이라고 합니다.
오버로딩과 오버라이드의 차이점은 무엇입니까?
같은 클래스의 두 개 이상의 메서드가 매개변수는 다르지만 이름은 같은 경우 이를 오버로딩이라고 합니다. 반면에 재정의는 수퍼클래스와 자식 클래스가 동일한 메서드 서명(이름 및 매개변수)을 갖는 경우입니다.