추상클래스
abstact class 클래스이름
{
//클래스와 동일하게 구현
//추상메소드를 가질 수 있음
}
- 인터페이스와 클래스 사이
- 추상 클래스는 "구현"을 가질 수 있다
- 하지만 클래스와 달리 "인스턴스"를 가질 수 없다
- 기본접근성(한정자를 명시하지 않을 때)을 private와 public 두가지를 가진다
(-> 추상메소드 설명에 같이 설명)
- 추상메소드를 가질 수 있다
추상메소드
: 추상클래스가 한편으로 인터페이스의 역할도 할 수 있게 해주는 장치이다.
구현을 갖지는 못하지만 파생클래스에서 이 메소드를 반드시 구현하도록 강제한다.
이 때 파생클래스에선 override수식어를 사용하여 구현한다
(이것 또한 인터페이스-약속의 개념)
부가설명:
추상클래스에서 다른 일반 메소드 프로퍼티 등은 일반클래스처럼 구현가능한데 abstact수식어가 붙는
추상메소드만 인터페이스의 메소드처럼 구현부가 없는 것
이 때, 추상메소드의 기본접근성은 일반 클래스처럼 private일까 인터페이스에서 처럼 public일까?
답은 둘 다
추상 클래스나 클래스는 그 안에서 선언되는 모든 필드, 메소드, 프로퍼티, 이벤드 모두 접근한정자를
명시하지 않으면 private이다.
하지만 인터페이스처럼 "약속"의 역할을 하는 추상메소드가 private일 순 없다.
그래서 C#컴파일러는 추상메소드가 반드시
public, protected, internal, protected internal한정자 중 하나로 수식될 것을 강요한다
추상메소드 선언 예
abstract class AbstractBase
{
public abstract void SomeMethod();
}
class Dervied : AbstractBase
{
public override void SomeMethod()
{
// 구현
}
}
예제코드
using System;
using static System.Console;
namespace AbstractClass
{
abstract class AbstractBase
{
protected void PrivateMethod() //추상클래스의 일반메소드(구현가능)
{
WriteLine("AbstractBase.PrivateMethod()");
}
public void PublicMethod()
{
WriteLine("AbstactBase.PublicMethod()");
}
public abstract void AbstractMethod(); //추상메소드는 구현부가 없음
}
class Dervied : AbstractBase
{
public override void AbstractMethod()
// 추상메소드를 강제로 구현해야하는데 이 때 인터페이스와는 달리 override사용
{
WriteLine("Dervied.AbstractMethod()");
PrivateMethod();
}
}
class MainApp
{
static void Main(string[] args)
{
AbstractBase obj = new Dervied();
obj.AbstractMethod();
obj.PublicMethod();
}
}
}
추상 클래스 : 상속을 위한 기반 클래스로 사용되고, 따라서 추상 클래스는 하나의 클래스 계층 구조를 정의할 때 사용한다.
인터페이스 : 클래스와의 관계를 설정하기 위한 계약서 역할, 인터페이스는 여러 클래스 간의 관계를 정의할 때 사용
추상클래스
abstact class 클래스이름
{
//클래스와 동일하게 구현
//추상메소드를 가질 수 있음
}
- 인터페이스와 클래스 사이
- 추상 클래스는 "구현"을 가질 수 있다
- 하지만 클래스와 달리 "인스턴스"를 가질 수 없다
- 기본접근성(한정자를 명시하지 않을 때)을 private와 public 두가지를 가진다
(-> 추상메소드 설명에 같이 설명)
- 추상메소드를 가질 수 있다
추상메소드
: 추상클래스가 한편으로 인터페이스의 역할도 할 수 있게 해주는 장치이다.
구현을 갖지는 못하지만 파생클래스에서 이 메소드를 반드시 구현하도록 강제한다.
이 때 파생클래스에선 override수식어를 사용하여 구현한다
(이것 또한 인터페이스-약속의 개념)
부가설명:
추상클래스에서 다른 일반 메소드 프로퍼티 등은 일반클래스처럼 구현가능한데 abstact수식어가 붙는
추상메소드만 인터페이스의 메소드처럼 구현부가 없는 것
이 때, 추상메소드의 기본접근성은 일반 클래스처럼 private일까 인터페이스에서 처럼 public일까?
답은 둘 다
추상 클래스나 클래스는 그 안에서 선언되는 모든 필드, 메소드, 프로퍼티, 이벤드 모두 접근한정자를
명시하지 않으면 private이다.
하지만 인터페이스처럼 "약속"의 역할을 하는 추상메소드가 private일 순 없다.
그래서 C#컴파일러는 추상메소드가 반드시
public, protected, internal, protected internal한정자 중 하나로 수식될 것을 강요한다
추상메소드 선언 예
abstract class AbstractBase
{
public abstract void SomeMethod();
}
class Dervied : AbstractBase
{
public override void SomeMethod()
{
// 구현
}
}
예제코드
using System;
using static System.Console;
namespace AbstractClass
{
abstract class AbstractBase
{
protected void PrivateMethod() //추상클래스의 일반메소드(구현가능)
{
WriteLine("AbstractBase.PrivateMethod()");
}
public void PublicMethod()
{
WriteLine("AbstactBase.PublicMethod()");
}
public abstract void AbstractMethod(); //추상메소드는 구현부가 없음
}
class Dervied : AbstractBase
{
public override void AbstractMethod()
// 추상메소드를 강제로 구현해야하는데 이 때 인터페이스와는 달리 override사용
{
WriteLine("Dervied.AbstractMethod()");
PrivateMethod();
}
}
class MainApp
{
static void Main(string[] args)
{
AbstractBase obj = new Dervied();
obj.AbstractMethod();
obj.PublicMethod();
}
}
}
추상 클래스 : 상속을 위한 기반 클래스로 사용되고, 따라서 추상 클래스는 하나의 클래스 계층 구조를 정의할 때 사용한다.
인터페이스 : 클래스와의 관계를 설정하기 위한 계약서 역할, 인터페이스는 여러 클래스 간의 관계를 정의할 때 사용