[C#] 12. 객체 지향 프로그래밍 - 추상화 Abstract

치치·2024년 11월 29일
0

C#

목록 보기
14/16
post-thumbnail

📌 추상화란?

  • 객체를 정의할 때 필요없는 부분을 생략하고 객체의 속성 중에서 중요한 부분을 중점으로 두어 간단하게 설계를 있도록 만들어주는 것 ➡ 토대 제공

  • 추상 클래스는 객체로 생성할 수 없고 상속하는 역할로만 사용

    추상 클래스를 사용하는 이유 ?

    • 클래스들에서 공통적으로 사용되는 변수나 함수를 추출해서 추상 클래스로 만들어서 사용

ex) 자식 클래스의 Rogue, Warrior, Wizard는 공통된 변수를 갖고 공통된 함수를 사용하기에 부모 클래스 Character 정의

  • 부모 클래스를 abstract로 지정하면 추상 클래스가 된다
  • 추상 함수는 선언만 해두고 정의는 자식 클래스들에서 재정의
abstract class Character
{
    protected int health;
    protected int attack;
    protected float defense;

    public void Stats()
    {
        Console.WriteLine("health : " + health);
        Console.WriteLine("defense : " + defense);
        Console.WriteLine("attack : " + attack);
    }

    // 추상 메소드 선언만 함 (정의는 하지 않음)
    public abstract void Skill();
}

ex) 자식 클래스 Rogue, Warrior, Wizard 중 하나의 클래스만 예를 들어봄

  • Wizard는 Character에 상속되어 있음
  • Wizard 자삭 클래스에서 추상함수 Skill( )을 재정의
internal class Wizard : Character
{
    public Wizard()
    {
        health = 75;
        attack = 10;
        defense = 1;
    }

    public override void Skill()
    {
        Console.WriteLine("Magic Attack");
    }
}
  • 메인 함수
  • 추상 클래스는 객체로 생성할 수 없기 때문에 Character 타입의 다른 클래스 객체를 생성
  • character 참조타입으로 추상함수를 호출하면 생성된 객체의 함수가 호출된다
  • ❗ 하지만, character.Stats( ) 함수의 경우 추상함수가 아니기 때문에, 일반적인 Character 클래스의 함수가 호출된다
Character character = null;

character = new Wizard();

character.Skill();

character.Stats();

결과값 :


📌 이름 공간 Name Space

  • 속성을 구분할 수 있도록 유효 범위를 설정하는 영역

ex) namespace UnrealEngine

  • 네임 스페이스 공간에 Broadcast 클래스 생성 후 Send 함수 선언
using UnrealEngine;

namespace UnrealEngine
{
    public class Broadcast
    {
        public void Send()
        {
            Console.WriteLine("Send Message");
        }
    }
}
  • 메인 함수
  • 하던대로 클래스에 객체 할당 후 함수 호출
Broadcast broadcast = new Broadcast();

broadcast.Send();

결과값 :

  • 🔒 이름 공간은 같은 이름의 함수나 변수를 또 다른 공간에 선언하여 중복되지 않도록 선언 가능

ex) 위에서 선언한 UnrealEngine 네임 스페이스 외에 UnityEngine namespace 선언

  • 동일한 함수인 Send( )가 들어있어도 문제 되지않음
namespace UnityEngine
{
    public class Broadcast
    {
        public void Send()
        {
            Console.WriteLine("Send Message");
        }
    }
}

📌 난수 생성

  • 랜덤으로 난수 생성
  • random.Next(범위, 범위); ( 이상 ~ 미만 )
Random random = new Random();

int value = random.Next(0, 3);

Console.WriteLine(value);

📌 난수 생성을 사용한 간단한 숫자 맞추기 게임

  • 1 ~ 30까지의 랜덤한 숫자를 컴퓨터가 뽑고 플레이어가 숫자를 입력하여 맞추는 방식

  • health는 5개이고 다 사라지거나 정답을 맞출 경우 게임 종료

Random rand = new Random();

int computer = rand.Next(1, 31);

int health = 5;

int answer = 0;

while(health > 0)
{
    Console.Write("Computer가 가지고 있는 값 : ");

    answer = int.Parse(Console.ReadLine());

    if(computer > answer)
    {
        Console.WriteLine("Computer가 가지고 있는 값보다 작습니다.");
        health--;
    }
    else if(computer < answer)
    {
        Console.WriteLine("Computer가 가지고 있는 값보다 큽니다.");
        health--;
    }
    else
    {
        Console.WriteLine("게임에서 승리하였습니다.");
        break;
    }

    Console.WriteLine();
}

if(health <= 0)
{
    Console.WriteLine("게임에서 패배하였습니다.");
}



전처리 기능

전처리기 중 region & endregion을 다뤄보자
➡ 가독성 좋게 동일한 기능이나 주제로 묶는 것. 접어둘 수 있다.

#region
void Animation()
{
	Play();
}

void Animation2()
{
	Play();
}
#endregion



예외 처리

오류가 발생할 수 있는 경우, 임의의 예외 처리를 할 수 있다.

try{로직} catch{오류가 발생하면 대신 실행 할 로직}

int a = 5;
int b = 0;
try
{
	print(a/b); // 0으로 나누게 되면 오류가 뜬다. 
}
catch
{
	Debug.Log("0으로 나눠서 오류가 발생하기 때문에 실행합니다.");
}
finally
{
	Debug.Log("오류 발생 여부에 상관없이 마지막에 출력되는 것");
}
profile
뉴비 개발자

0개의 댓글