다형성
객제치향의 4대 특징 - 추상화, 캡슐화, 상속, 다형성
여러가지 형태를 띤다는 뜻.
메서드 오버라이드
부모클래스에서 정의된 메서드를 자식클래스의 인스턴스에 따라 재정의(override) 하는 것
부모클래스의 메서드에 virtual을 써주고 override 할려는 자식클래스 메서드에 override를 붙여줌.
예제)
class Mammal
{
public virtual void Move()
{
Console.WriteLine("이동한다");
}
}
class Lion : Mammal
{
public override void Move()
{
Console.WriteLine("네 발로 움직인다");
}
}
class Whale : Mammal
{
public override void Move()
{
Console.WriteLine("수영한다");
}
}
class Human : Mammal
{
public override void Move()
{
Console.WriteLine("두 발로 움직인다");
}
}
Mammal aMammal = new Mammal();
aMammal.Move();
aMammal = new Lion();
aMammal.Move();
// Lion 객체를 담았는데도 Mammal 메서드가 실행된다. 그래서 나온게 virtual
// 부모에 옵라할 메서드에 virtual 적고 Lion 메서드에 아무것도 적지않으면 new로 취급. override로 적어야댐
// 부모껄 대신해서 자식메소드를 출력하겠다. override
// virtual = 자식클래스에서 해당 메서드 오버라이드 하는걸 허용하겠다,객체타입에 맞게 호출된다
aMammal = new Whale();
aMammal.Move();
aMammal = new Human();
aMammal.Move();
코드를 줄이는 방법도 있다.
Mammal[] aMammal = new Mammal[4] {
new Mammal(),
new Lion(),
new Whale(),
new Human()
};
foreach(Mammal Temp in aMammal)
{
Temp.Move();
}
base를 이용한 메서드 재사용
base.메서드 로 중복코드를 줄일 수 있다.
예제)
public class Computer
{
virtual public void Boot()
{
Console.WriteLine("메인보드 켜기");
}
}
public class Notebook : Computer
{
public override void Boot()
{
//Console.WriteLine("메인보드 켜기");
base.Boot();
Console.WriteLine("액정 화면 켜기");
}
}
object 기본 메서드 확장
object 의 기본 메서드를 override 해서 유용하게 쓰는 방법이다.
예제) ToString() 오버라이드
class Car
{
int iSpeed; // 속도
string sColor; // 색상
string sName; // 이름
string sVender; // 제조사
public override string ToString() // ToString을 Car인스턴스를 반환하도록 재정의
{
return "속 도 : " + iSpeed +
"\n색 상 : " + sColor +
"\n이 름 : " + sName +
"\n제조사 : " + sVender;
}
public Car(int iSpeed, string sColor, string sName, string sVender)
{
this.iSpeed = iSpeed;
this.sColor = sColor;
this.sName = sName;
this.sVender = sVender;
}
}
Car aCar = new Car(100, "빨캉", "그냥죠", "현다이");
Console.WriteLine(aCar); // Car 클래스가 출력되지 않고 Car 인스턴스가 출력
예제2) Equals() 오버라이드
class Book
{
decimal isbn13;
string title;
string contents;
public Book(decimal isbn13, string title, string contents)
{
this.isbn13 = isbn13;
this.title = title;
this.contents = contents;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Book book = obj as Book;
if (book == null)
{
return false;
}
return this.isbn13 == book.isbn13;
}
}
Book book1 = new Book(9788998139018, "리버스 엔지니어링 바이블", "......");
Book book2 = new Book(9788998139018, "리버스 엔지니어링 바이블", "......");
Book book3 = new Book(9788992939409, "파이썬 3.6 프로그래밍", "......");
Console.WriteLine("book1 == book2 : " + book1.Equals(book2));
Console.WriteLine("book1 == book3 : " + book1.Equals(book3));
Equals를 재정의 해서 Book 클래스의 책들이 가지고 있는 isbn13을 비교하여 true false 값을 반환한다.
재정의 하지 않았다면 서로의 주솟값을 비교하기 떄문에 false가 나왔을 것이다.
메서드 오버로드
동일한 이름의 메서드에 인자의 타입만 다르게 해줌으로써 일관성있게 클래스를 작성할 수 있다.
예제) 각 타입별로 절댓값을 반환
class Mathmatics
{
public int Abs(int value)
{
return (value >= 0) ? value : -value;
}
public double Abs(double value)
{
return (value >= 0) ? value : -value;
}
public decimal Abs(decimal value)
{
return (value >= 0) ? value : -value;
}
//매서드 선택을 프로그램한테 넘김. 자동화
}
Mathmatics math = new Mathmatics();
Console.WriteLine(math.Abs(-5));
Console.WriteLine(math.Abs(-10.052));
Console.WriteLine(math.Abs(20.01m));
math.Abs()에 값을 넘기면 프로그램이 자동으로 메서드를 선택해서 값을 반환한다.
연산자 오버로드
연산자(+, -, *, /)들도 오버로드 시킬수 있다. + 연산자는 각 타입별로 연산자의 역할이 다르다
string에선 문자열을 이어붙이고 int타입 끼리 사용하면 값을 더한다.
예제) 가게 클래스 끼리 더하면 각 가게가 가지고 있는 사과와 오렌지가 더해지도록 하고 ToString을 override해서
값을 반환하도록 해보자
class Market
{
public int iApple;
public int iOrange;
public static Market operator +(Market Obj1, Market Obj2)//static은 객체가 존재하든 안하든 +가 되야하기 떄문에
{
Market Obj3 = new Market();
Obj3.iApple = Obj1.iApple + Obj2.iApple;
Obj3.iOrange = Obj1.iOrange + Obj2.iOrange;
return Obj3;
}
public static Market operator -(Market Obj1, Market Obj2)
{
Market Obj3 = new Market();
Obj3.iApple = Obj1.iApple - Obj2.iApple;
Obj3.iOrange = Obj1.iOrange - Obj2.iOrange;
return Obj3;
}
public override string ToString()
{
return "{iApple = " + iApple + ", iOrange = " + iOrange + "}";
}
}
Market 가게1 = new Market();
Market 가게2 = new Market();
가게1.iApple = 10;
가게1.iOrange = 10;
가게2.iApple = 100;
가게2.iOrange = 100;
Market 가게3 = new Market();
가게3 = 가게1 + 가게2;
Console.WriteLine("가게 1 : " + 가게1); // ToString() 을 쓰면 편리
Console.WriteLine("가게 2 : " + 가게2);
Console.WriteLine("가게 3 : " + 가게3);
가게3 = 가게1 - 가게2;
Console.WriteLine("가게 3 : " + 가게3);
'컴퓨터 > C#' 카테고리의 다른 글
[C#] 클래스 간의 형변환(implicit, explicit), 추상 클래스, 추상 메서드, 델리게이트 (0) | 2020.06.04 |
---|---|
[C#] base (super) (0) | 2020.06.02 |
[C#] this (0) | 2020.06.02 |
[C#] Array 타입 (0) | 2020.06.02 |
[C#] Object 타입 (0) | 2020.06.02 |