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 | 스택 오버플로우 발생하는 경우 |
사용자 정의 예외
[ 사용 예시 ]
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... 등) | 클래스, 배열, 인터페이스 |
| 값을 저장 | 주소를 저장 |
| 전달 시 값을 복사 | 전달 시 참조(주소)를 복사 |
* 예제 실험 중 이해 안 가는 부분 있어서 추가로 찾아보고 해결 안되면 튜터님께 질문하러가기...
'내일배움캠프 > TIL' 카테고리의 다른 글
| [내배캠][Unity6기][TIL] C# Generic Collection과 C++ STL 비교 (0) | 2024.09.27 |
|---|---|
| [내배캠][Unity6기][TIL] TextRPG 개인 과제 / C# 체크리스트 (0) | 2024.09.24 |
| [내배캠][Unity6기][TIL] C# 문법 종합 강의 3주차 (0) | 2024.09.21 |
| [내배캠][Unity6기][TIL] C# 문법 종합 강의 2주차 / C# 체크리스트 (0) | 2024.09.20 |
| [내배캠][Unity6기][TIL] C# 문법 종합 강의 1주차 (0) | 2024.09.19 |