파생클래스
- 기존의 클래스를 베이스 클래스(base class)라 부름
- 새로 정의된 클래스를 파생 클래스(derived class)라 부름
상속(Inheritance)
- 베이스 클래스의 모든 멤버들이 파생 클래스로 전달되는 기능
- 베이스 클래스를 정의하고 베이스 클래스로부터 파생 클래스 확장
- 클래스의 재사용성 증가
단일상속 : 베이스 클래스 1개
다중상속 : 베이스 클래스 2개이상
클래스의 정의
[class-modifiers] class DerivedClassName : BaseClassName {
//member declarations
}
- 콜론(":") 옆에 베이스 클래스 이름을 명시
- 파생클래스는 베이스클래스의 모든 멤버를 상속받음
using System; class BaseClass { public int a, b; public BaseClass() { a = 1; b = 1; } public BaseClass(int a, int b) { this.a = a; this.b = b; } } class DerivedClass : BaseClass { public int c; public DerivedClass() { c = 1; } public DerivedClass(int a, int b, int c) : base(a, b) { this.c = c; } } class BaseCallApp { public static void Main() { DerivedClass obj1 = new DerivedClass(); DerivedClass obj2 = new DerivedClass(1, 2, 3); Console.WriteLine("a={0}, b={1}, c={2}", obj1.a, obj1.b, obj1.c); Console.WriteLine("a={0}, b={1}, c={2}", obj2.a, obj2.b, obj2.c); } } |
메소드 재정의
ㅇ 가상 메소드(virtual method)
- 지정어 virtual로 선언된 인스턴스 메소드
- 파생 클래스에서 재정의해서 사용할 것임을 알려주는 역할
new 지정어 : 객체 형에 따라 호출
override 지정어 : 객체 참조가 가리키는 객체에 따라 호출
ㅇ 봉인 메소드(sealed method)
- 수정자가 sealed로 선언된 메소드
- 파생 클래스에서 재정의를 허용하지 않음
추상클래스
- 추상메소드(Abstract Class)를 갖는 클래스
- 실질적 구현을 갖지 않고 메소드 선언만 있는 경우를 말함
- 추상 클래스는 객체를 가질 수 없음
- abstract 수정자
virtual 수정자의 의미 포함
추상클래스를 파생 클래스에서 구현할 때, 접근 수정자는 항상 일치해야 함
- 다른 외부 클래스에서 메소드를 일관성 있게 다루기 위한 방법 제공
클래스의 정의
abstract class AbstractClass {
public abstract void Method(); à 추상 메소드
void MethodB() {
// … à 구현이 있는 메소드
}
}
메소드 설계
- 베이스 클래스에 있는 메소드를 지정어 base를 사용하여 호출할 수 있음
구조체 및 네임스페이스
구조체 : 클래스와 동일하게 객체의 구조와 행위를 정의하는 방법
네임스페이스 : 서로 연관된 클래스나 인터페이스, 구조체, 열거형, 델리게이트, 하위 네임스페이스를 하나의 단위로 묶음
클래스 | 구조체 |
- 참조형 - 클래스 객체 : 힙에 저장 - 배정 연산에서 참조가 복사됨 - 상속 가능 - 소멸자를 가질 수 있음 - 클래스 멤버 : 초기값을 가질 수 있음 |
- 값형 - 구조체 객체 : 스택에 저장 - 배정 연산에서 내용이 복사됨 - 상속 불가능 - 소멸자를 가질 수 있음 - 구조체의 멤버 : 초기값을 가질 수 없음 |
구조체의 형태
[struct-modifiers] struct StructName {
//member declarations
}
네임스페이스 선언
namespace NamespaceName {
//네임스페이스에 포함할 항목을 정의
}
네임스페이스 사용
using NamespaceName; //사용하고자 하는 네임스페이스 명시
****정리****
1. 파생 클래스
클래스상속
- 상속 : 하나의 클래스가 가지는 특성을 그대로 물려 받는 객체를 생성하는 것
- 클래스의 재사용성 (reusability) 증가
- 베이스클래스 : 자신의 특성을 물려주는 클래스
- 파생클래스 : 베이스 클래스로부터 특성을 물려받는 클래스
- 가상 메소드 : 파생클래스에서 재정의해서 사용할 것입을 알려주는 역할
- 추상 메소드 : 실질적인 구현을 갖지 않고 메소드 선언만 있는 경우
- 추상클래스 : 추상 메소드를 갖는 클래스
2. 구조체 및 네임스페이스
구조체
- 구조체는 사용자가 정의하여 사용하는 값 형식의 자료형
- 클래스와 같이 데이터 멤버, 데이터 함수가 포함됨
- 구조체 변수에는 구조체 데이터를 직접 저장 가능
- 구조체는 스택(stack) 메모리 영역에 작성, 클래스는 힙(heap) 메모리 영역에 저장
네임스페이스
- 서로 연관된 클래스나 인터페이스, 구조체, 열거형, 델리게이트, 하위 네임스페이스를 하나의 단위로 묶는 것
- 여러 개의 클래스와 인터페이스, 구조체, 열거형, 델리게이트 등을 하나의 그룹으로 다루는 수단을 제공
- 클래스의 이름을 지정할 때 발생 되는 이름 충돌 문제 해결
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BaeCallApp //파생클래스의 구현
{
class BaseClass
{
public int a, b;
public BaseClass()
{
a = 1; b = 1;
}
public BaseClass(int a, int b)
{
this.a = a; this.b = b;
}
}
class DerivedClass : BaseClass //상속클래스 == Base가 Derived의 부모임
{
public int c;
public DerivedClass()
{
c = 1;
}
public DerivedClass(int a, int b, int c)
: base(a,b) //부모클래스에 정의가 되어있으므로 base(a,b) 지정자 사용이 가능
{
this.c = c;
}
}
class BaseCallApp
{
public static void Main()
{
DerivedClass obj1 = new DerivedClass();
DerivedClass obj2 = new DerivedClass(1, 2, 3);
Console.WriteLine("a={0}, b={1}, c={2}", obj1.a, obj1.b, obj1.c);
Console.WriteLine("a={0}, b={1}, c={2}", obj2.a, obj2.b, obj2.c);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AbstractClassApp //추상클래스의 구현 (실질적 구현X, 선언만 함, 구현은 상속을 받아 하위에 구현)
//구현을 나중에 할때 사용하는 방식
{
abstract class AbstractClass
{
public abstract void MethodA(); //MethodA == 추상메소드
public void MethodB()
{
Console.WriteLine("Implementation of MethodB()");
}
}
class ImpClass : AbstractClass //AbstractClass의 상속을 받음
{
override public void MethodA()
{
Console.WriteLine("Implementation of MethodA");
}
}
class AbstractClassApp
{
public static void Main()
{
ImpClass obj = new ImpClass();
obj.MethodA();
obj.MethodB();
}
}
}