내일배움캠프/TIL

[내배캠][Unity6기][TIL] C# 문법 종합 강의 4주차(1~2)

binary는 호남선 2024. 9. 23. 20:03

Preview

- C#에서의 상속
- 인터페이스와 추상클래스
- 예외 (Exception)
-- 시스템 예외
-- 사용자 정의 예외
- 값형(Value Type) 과 참조형(Reference Type)


C#에서의 상속

- 클래스 다중 상속 지원 X

-- 클래스 다중 상속으로 발생하는 모호성 문제 예방하고 설계의 단순성 유지

 

- 인터페이스 다중 상속 지원 O

-- 설계의 유연성을 높이고 코드 재사용성 향상

인터페이스와 추상클래스

[ 인터페이스와 추상클래스 비교 ]

인터페이스(Interface) 추상클래스(Abstract Class)
클래스가 아님 클래스임 (단, 인스턴스화 불가)
다중 상속 O 다중 상속 X
상속 받는 클래스에서 구현 필수
(구현부와 제시부가 분리된 형태)
상속 받는 클래스에서 선택적으로 구현
(구현부와 제시부 결합 or 분리,
추상메서드의 경우 구현부 가질 수 없음)
기본 접근 지정자 public 기본 접근 지정자 private

[ 인터페이스 예시 ]

public interface IMovable
{
    // 이동 메서드 선언, 형태만 제시할 뿐 구현 불가
    void Move(int x, int y);
}
public interface IFlyable
{
    // 비행 메서드 선언, 형태만 제시할 뿐 구현 불가
    void Fly(int x, int y, int z);
}
public class Player : IMovable, IFlyable
{
    public void Move(int x, int y)
    {
        // 플레이어의 이동 구현
    }
    public void Fly(int x, int y, int z)
    {
        // 플레이어의 비행 구현
    }
}

public class Enemy : IMovable
{
    public void Move(int x, int y)
    {
        // 적의 이동 구현
    }
}
static void Main(string[] args)
{
    // 인터페이스 사용해 객체 생성
    IMovable movableObject1 = new Player();
    IMovable movableObject2 = new Enemy();

    movableObject1.Move(5, 0); // 플레이어 이동
    movableObject2.Move(1, 9); // 적 이동

    // 일반 객체 생성
    Player player = new Player();
    Enemy enemy = new Enemy();

    // 플레이어는 IMovalbe과 IFlyable 상속했으므로 이동과 비행 모두 가능
    player.Move(5, 0);
    player.Fly(1, 9, 3);

    // 에너미는 IMovalbe만 상속했으므로 이동만 가능
    enemy.Move(1, 9);
    // ERR : IFlyable 상속하지 않았으므로 비행은 불가
    enemy.Fly(1, 9, 5);
}

[ 추상클래스 예시 ]

public abstract class Animal    // abstract 키워드 사용한 추상클래스
{
    public abstract void MakeSound();   // 추상메서드는 형태만 제시, 구현 x
    public void Walk()  // 추상클래스에서 구현부 작성도 가능
    {
        Console.WriteLine("Walking...");
    }
}
public class Cat : Animal
{
    // 추상메서드는 상속 받은 자식클래스에서 반드시 구현 필요
    public override void MakeSound()
    {
        Console.WriteLine("Meow");
    }
}
static void Main(string[] args)
{
    Cat cat = new Cat();
    cat.MakeSound();    // Meow
    cat.Walk();         // Walking...
    // Walk()는 자식클래스(Cat)에서 재정의하지 않고
    // 상속받은 추상클래스의 Walk()를 그대로 사용
}

예외 (Exception)

- 프로그램 실행 중 발생하는 예상치 못한 상황

- 프로그램 실행을 방해하고 오류 발생시킬 수 있음

- try-catch 활용하여 미리 예외 처리하여 오류 예방

- 자주 발생하는 예외 미리 정의해 둔 시스템 예외와 보다 구체적이고 특수한 상황을 고려하는 사용자 정의 예외가 있음

시스템 예외

[ 사용 예시 ]

try
{
    // 예외 발생 우려되는 코드 try에 묶기
    int result = 10 / 0;
    Console.WriteLine("결과: " + result);
}
catch (DivideByZeroException ex)
{
    // 0으로 나누었으므로 여기에서 예외 catch
    Console.WriteLine("0으로 나눌 수 없습니다.");
}
catch (Exception ex)
{
    Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}
finally
{
    // 예외 발생 여부와 상관 없이 실행
    Console.WriteLine("finally 블록이 실행되었습니다.");
}

[ 자주 발생하는 시스템 예외 ]

예외 발생하는 상황
System.ArithmeticException 산술 연산에서 예외 발생하는 경우
System.ArrayTypeMismatchException 배열 타입과 저장된 요소의 타입이 호환되지 않는 경우
System.DivideByZeroException 정수를 0으로 나누려고 시도하는 경우
System.IndexOutOfRangeException 배열 인덱스를 벗어나 접근을 시도하는 경우
System.InvalidCastException 호환되지 않는 타입을 명시적으로 캐스팅하는 경우
System.NullReferenceException null을 참조하는 경우
System.OutOfMemoryException 메모리 할당에 실패하는 경우
System.OverflowException 연산 오버플로우 발생하는 경우
System.StackOverflowException 스택 오버플로우 발생하는 경우

참고 : https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/language-specification/exceptions#213-the-systemexception-class

사용자 정의 예외

[ 사용 예시 ]

public class NegativeNumberException : Exception
{
    // 이니셜라이저를 사용해 인자로 들어오는 string을 바로 받아 생성
    public NegativeNumberException(string message) : base(message)
    {
    }
}

try
{
    int age = -10;
    if (age < 0)
    {
        throw new NegativeNumberException("음수는 처리할 수 없습니다.");
    }
}
catch (NegativeNumberException ex)
{
    // 여기에서 예외 catch되고 메시지 출력
    Console.WriteLine(ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("예외가 발생했습니다: " + ex.Message);
}

값형(Value Type) 과 참조형(Reference Type)

값형(Value Type) 참조형(Reference Type)
기본 데이터 타입(int, float, bool... 등) 클래스, 배열, 인터페이스
값을 저장 주소를 저장
전달 시 값을 복사 전달 시 참조(주소)를 복사

* 예제 실험 중 이해 안 가는 부분 있어서 추가로 찾아보고 해결 안되면 튜터님께 질문하러가기...