내배캠 2주차 C# 문법(4)

오도독·2024년 4월 25일

내배캠

목록 보기
8/26
post-thumbnail

일주일 간 하루에 3시간씩만 자면서 머리를 쥐어뜯고 정신을 혼미하게 만들었던 개인 프로젝트를 오늘 제출했어요. 간만에 조금 쉴 생각에 기분이 좋네요.

상속과 다형성

○ 상속

● 상속의 개념

상속은 기존의 클래스를 확장하거나 재사용하여 새로운 클래스를 생성하는 것 이에요.
자식 클래스는 부모 클래의 멤버 (필드, 메서드, 프로퍼티 등) 를 상속받아 사용할 수 있어요.

●상속의 장점

  1. 코드의 재사용성 : 상속을 통해 기존 클래스의 코드를 재사용 할 수 있어 반복적인 코드 작성을 줄일 수 있어요.
  2. 계층 구조의 표현 : 클래스 간의 계층 구조를 표현하여 코드의 구조를 명확하게 표현할 수 있어요.
  3. 유지보수성의 향상 : 상속을 통해 기존 클래스의 수정이 필요한 경우, 해당 클래스만 수정하면 돼요.

●상속의 종류

상속은 하나의 자식클래스가 하나의 부모 클래스만 상속받는 단일상속, 하나의 자식 클래스가 여러개의 부모 클래스를 동시에 상속받는 다중 상속, 클래스가 인터페이스를 상속받는 인터페이스 상속이 있는데 C# 에서는 다중 상속을 지원하지 않아요.

●상속의 특징

  1. 부모클래스의 멤버에 접근 :
    자식 클래스는 상속받은 부모 클래스의 멤버에 접근할 수 있으며, 이를 통해 부모 클래스의 기능을 재사용 할 수 있어요.
  2. 메서드 재정의 :
    자식 클래스는 부모 클래스의 메서드를 재정의 하여 자신에게 맞세 수정할 수 있어요. 이를 통해 다형성(Polymorphism)을 구현할 수 있습니다.
  3. 상속의 깊이 :
    클래스는 다수의 계층적인 상속 구조를 가질수 있어요. 자식 클래스가 또 다른 클래스의 부모 클래스가 될 수 있으며, 이를 통해 상속의 계층 구조를 형성할 수 있는데 상속의 깊이가 깊어질수록 클래스 간의 관계가 복잡해질 수 있으니 적절한 상속의 깊이를 유지하는 것이 중요해요.

사용예시

public class A
{
    public void Method1()
    {
        // 메서드 내용
    }
}

public class B : A
{ }

public class Example
{
    public static void Main()
    {
        B b = new ();
        b.Method1();
    }
}

부모 클래스 A를 상속받은 자식 클래스 B의 객체를 생성해 A클래스의 메서드를 사용하는 모습입니다.


○ 다형성

다형성은 같은 타입이지만 다양한 동작을 수행할 수 있는 능력을 말합니다.

  • 가상 메서드

    가상메서드는 기본적으로 부모 클래스에서 vitual 키워드를 사용하여 선언되고 자식클래스에서 재정의할 수 있는 메서드입니다.
    이를 통해 자식클래스에서 부모 클래스의 메서드를 변경하거나 확장할 수 있어요.

public class Unit
{
    public virtual void Move()
    {
        Console.WriteLine("두발로 걷기");
    }

    public void Attack()
    {
        Console.WriteLine("Unit 공격");
    }
}

public class Marine : Unit
{

}

public class Zergling : Unit
{
    public override void Move()
    {
        Console.WriteLine("네발로 걷기");
    }
}


// 사용 예시
// #1 참조형태와 실형태가 같을때
Marine marine = new Marine();
marine.Move();
marine.Attack();

Zergling zergling = new Zergling();
zergling.Move();
zergling.Attack();

// #2 참조형태와 실형태가 다를때
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());

foreach (Unit unit in list)
{
    unit.Move();
}
실행 결과
===========
두발로 걷기
Unit 공격
네발로 걷기
Unit 공격

두발로 걷기
네발로 걷기
===========

Unit 클래스에서 virtual 키워드로 선언한 Move() 함수를 zergling 클래스에서 오버라이드로 재정의 하는 모습입니다.



상점페이지에서 아이템을 판매하면 아이템 리스트에서 판매된 아이템의 정보를 수정해주는 로직을 구현하려고 해요.

판매할 아이템을 선택받고 선택받은 아이템의 이름 값과 같은 값을 가진 리스트 인덱스를 가져와 그 인덱스의 값을 수정해주려는 데 일반적인 검색 방법인 FindIndex() 함수로는 작동이 되지 않더라고요.

데이터 형식이 객체로 구성된 리스트에서 특정 값이 존재하는지 체크해야하는 경우에는 람다식을 사용한다고 합니다.

람다 함수는 메서드의 이름없이 메서드를 만드는 익명함수를 지칭하는 용어라고 하는데 람다에 대해서는 나중에 다시 TIL로 작성할 예정이에요.

int index = DataManager.Instance.list.FindIndex(item => item.itemname.Equals($"{temp.itemname}"));

이런 식으로 코드를 작성했습니다.


람다에 대해서 아직 공부를 하지 않아 제대로 이해를 하지는 못했지만 조만간 공부해서 이해할 수 있도록 하겠습니다.

0개의 댓글