아디봉의.net

추상클래스와 추상함수 본문

C#/C# 객체지향

추상클래스와 추상함수

아디봉 2012. 9. 26. 16:27

다형성(Polymorphism)

- 하나로 여러가지 일을 하는것

 

다형성 적용되는 곳

- 업캐스팅(Upcasting)

- 오버라이딩(Overriding)

- 가상함수(Virtual Function)

- 상속(Inheritance)

- 추상클래스

- 인터페이스

 

다형성을 지원하기 위한 도구들

- 박싱, 언박싱, 추상클래스, 인터페이스, 델리게이트, 업캐스팅과 다운캐스팅, 가상함수

 

 

1) 추상함수 (Abstract Method)

 추상함수는 구현이 이루어지지 않고 단지 그 프로토타입(Prototype)만을 가지고 있는 함수를 말함

 

추상함수의 특징1

- 추상함수는 abstract  키워드를 붙여서 추상함수라는 것을 명시해야한다.

- 추상함수를 하나라도 포함하고 있으면 클래스명 앞에 abstract 키워드를 붙여서 추상클래스임을 명시해야한다.

 

추상함수의 특징2

- virtual의 키워드가 디폴트로 포함되어있음 추상클래스내에 virtual 키워드를 사용하지 않지만 파생클래스에서 함수를 오버라이딩 할때 override키워드를 붙여주어야한다.

 

using System;

abstract class A{

public abstract void F1();

public abstract void F2();

}

 

class B : A {

pulbic override void F1(){ //error F2구현하지않음

Console.WriteLine("B클래스");

}

}

 

Class AbstractTestMain{

public static void Main(){

B b = new B();

b.F1;

}//main

}//class

 

 

추상함수는 구현이 이루어지지않고 단지 그 함수의 이름만 가지고 있다는 뜻이다.

그래서 몸체가 없다고 말하는 것임

전문적인용어로 "추상함수는 함수의 프로토타입(prototype)만 가지고 있다"라고 이야기한다.

그리고 이러한 추상함수를 포함하는 클래스는 당연히 추상 클래스가 되는것이다.

주로 프로그램의 설계단계에서 많이 사용한다. 프로그램상황에 맞게 계층적인 모델을 설계할때 주로 사용

 

2) 추상클래스(abstract Class)

 

추상클래스가 되는 방법

- 몸체없는 함수를 하나라도 포함하고 있는 클래스

- 몸체없는 함수를 포함하고 있지 않더라도 클래스를 선언할 때 abstract 키워드를 포함하고 있는 경우

 

몸체 없는 함수란 함수의 구현부가 없다는 뜻이다. 즉 함수블록({})을 포함하고 있지 않고 프로토타입(Prototype)만 존재하는 함수를 말함  ex)public abstract void F();

 

추상함수 선언 형태

- pulbic agstract void F();

- 추상함수는 명시하지 않아도 전자동으로 virtual함수이다.

 

 

예1) 상속받은 F()를 자식에서 구현해줘야지만 완전해짐

 abstract class Sample1{

public abstract void F();

}

 

예2 상속만해도 완전해짐

abstract class Sample2{

public void G(){

//...

}

}

 

추상클래스의 특징

- 추상 클래스는 객체(인스턴스)를 생성 할 수 없다.

- 추상 함수는 자동으로 가상함수가 된다.

- 추상 함수는 virtual키워드를 사용하지 않으면 자동으로 virtual이 된다.

 

 

추상클래스 사용이유

상위클래스에서는 함수의 이름만 선언하고 하위 클래스에서 구현하는 형태가 된다.

이럴 경우 상위 클래스의 함수를 abstract 으로 만들어주면된다.

 

using System;

using System.Drawing;

public abstract class Shape{

protected Color color = Color.Black;

public Color GetColor(){return  this.color;}

public void SetColor(Color color){ this.color = color; }

public abstract void Draw();

}

 

public class Circle: Shape{

private int x = 0;

private int y = 0;

private int radius = 0;

 

public Circle(int x, int y, int radius){

this.x = x;

this.y = y;

this.radius = radius;

}

pubic override void Draw(){//상속받은 Draw구현

Console.WriteLine(this.color, this.x, this.y,  this.radius);

 

}

}

 

public class Rect: shape {

private int x = 0 ;

private int y = 0 ;

private int width = 0;

private int height = 0;

public Rect(int x, int y, int width, int heigth){

this.x = x;

this.y = y;

this.width = width;

this.height = height;

}

public override void Draw(){ //상속받은 Draw구현

Console.WriteLine(this.color, "사각형", this.x, this.y, this.width, this.height );

}

}

 

pulbic class ShapeTest{

public static void Main(){

Circle cir = new Circle(100, 100, 50);

Rect  rec = new Rect(100, 100, 200, 200);

cir.Draw();//원그리기

rec.Draw();//사각형그리기

}

}

이와 같이 기본골격이 같고 구현이 하위 클래스에서 결정되는 구조를 가진다면 상위 클래스를 추상 클래스로 선언해서 사용하면 된다.

 

상위클래스에서는 구현을 알수 없는 상태의 추상클래스로 극복하였으며, 동일한 추상 클래스를 상속받았기 때문에 다형성의 장점으로 활용할 수 있다.

 

'C# > C# 객체지향' 카테고리의 다른 글

c# 박싱과 언박싱  (0) 2012.09.27
생성자를 호출하는 THIS() , BASE()  (0) 2012.09.26
c#객체지향 생성자(Constructor)  (0) 2012.09.25
C# 상속  (0) 2012.09.20
C# 오버로딩(overloading)  (0) 2012.09.20