1. 객체와 다형성
- 다형성(Polymorphism): 객체가 여러 형태를 가질 수 있는 성질.
- 하위 형식 다형성: 파생 클래스가 기반 클래스의 메소드를 재정의하여 다양한 동작을 실행.
a. 예제: 다형성
class ArmorSuite
{
public virtual void Initialize()
{
Console.WriteLine("ArmorSuite: 초기화");
}
}
class IronMan : ArmorSuite
{
public override void Initialize()
{
base.Initialize(); // 기반 클래스 메소드 호출
Console.WriteLine("IronMan: 초기화");
}
}
2. 메소드 오버라이딩
- 조건:
- 메소드는 virtual 키워드로 선언되어야 함.
- override 키워드로 재정의.
- private 메소드는 오버라이딩 불가.
a. 예제
class BaseClass
{
public virtual void MyMethod()
{
Console.WriteLine("BaseClass: MyMethod");
}
}
class DerivedClass : BaseClass
{
public override void MyMethod()
{
Console.WriteLine("DerivedClass: MyMethod");
}
}
b. 메소드 감추기 (new 키워드)
- 기반 클래스의 메소드를 감추고 파생 클래스 메소드만 표시.
class BaseClass
{
public void MyMethod()
{
Console.WriteLine("BaseClass: MyMethod");
}
}
class DerivedClass : BaseClass
{
public new void MyMethod()
{
Console.WriteLine("DerivedClass: MyMethod");
}
}
c. 메소드 봉인 (sealed 키워드)
- 오버라이딩된 메소드의 추가 재정의를 금지.
class BaseClass
{
public virtual void MyMethod()
{
Console.WriteLine("BaseClass: MyMethod");
}
}
class DerivedClass : BaseClass
{
public sealed override void MyMethod()
{
Console.WriteLine("DerivedClass: MyMethod");
}
}
3. 중첩 클래스
- 클래스 안에 선언된 클래스.
- 외부 클래스의 모든 멤버(심지어 private)에 접근 가능.
예제
class OuterClass
{
private int number = 42;
class NestedClass
{
public void DisplayNumber(OuterClass outer)
{
Console.WriteLine($"Number: {outer.number}");
}
}
}
4. 분할 클래스
- partial 키워드를 사용하여 여러 파일에 걸쳐 하나의 클래스를 정의.
- 코드 관리 및 분할 작업에 유용.
예제
partial class MyClass
{
public void Method1()
{
Console.WriteLine("Method1");
}
}
partial class MyClass
{
public void Method2()
{
Console.WriteLine("Method2");
}
}
5. 확장 메소드
- 기존 클래스의 기능을 확장하는 메소드.
- 정적 클래스와 this 키워드를 활용.
예제
public static class StringExtensions
{
public static string ToUpperFirst(this string input)
{
if (string.IsNullOrEmpty(input)) return input;
return char.ToUpper(input[0]) + input.Substring(1);
}
}
// 사용
string name = "john";
Console.WriteLine(name.ToUpperFirst()); // 출력: John
6. 클래스 vs 구조체
특징클래스구조체
키워드 | class | struct |
형식 | 참조 형식 | 값 형식 |
복사 방식 | 얕은 복사 | 깊은 복사 |
생성 방법 | new 키워드 필요 | 선언만으로 생성 가능 |
생성자 | 매개변수 없는 생성자 가능 | 불가능 |
상속 | 가능 | 불가능 |
예제
struct Point
{
public int X;
public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
Point p1 = new Point(10, 20);
Console.WriteLine($"X: {p1.X}, Y: {p1.Y}");
7. 튜플 (Tuple)
- 여러 필드를 담을 수 있는 구조체.
- 임시적으로 복합 데이터를 다룰 때 사용.
a. 명명되지 않은 튜플
var tuple = (123, 789);
Console.WriteLine(tuple.Item1); // 출력: 123
Console.WriteLine(tuple.Item2); // 출력: 789
b. 명명된 튜플
var person = (Name: "John", Age: 30);
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
정리
- 객체는 클래스의 인스턴스이며, 다형성, 오버라이딩, 중첩 클래스, 확장 메소드 등을 통해 강력한 유연성을 제공합니다.
- 구조체는 값 형식으로 메모리 관리 및 간단한 데이터 저장에 유용.
- 튜플은 임시적인 복합 데이터를 간단히 표현.
'프로그래밍 언어 및 개발 도구 > c#' 카테고리의 다른 글
데이터 형식 변환: 정수, 부동소수점, 문자와 숫자의 변환 이해하기 (0) | 2024.12.14 |
---|---|
메소드 완벽 가이드: 선언부터 오버로딩, 로컬 함수까지 (0) | 2024.12.13 |
클래스: 객체 지향 프로그래밍의 핵심 (0) | 2024.12.13 |
접근 한정자와 메소드 반환 형식의 이해 (0) | 2024.12.13 |
분기문, 반복문, 점프문 완벽 정리 (0) | 2024.12.13 |