공부/C#

[C#] 객체 지향 추상화, 상속성, 다형성

굴러다니다니 2025. 5. 22. 15:02

이전 내용:

https://dani2344.tistory.com/142

 

[C#] OOP 객체 지향, 4대 특징 중 캡슐화와 프로퍼티

객체 지향 프로그래밍 OOP객체: 속성과 동작객체 지향 프로그래밍(Object-Oriented Programming): 객체 위주로 프로그래밍 하는 것 절차적 프로그래밍: 기능 구현에 초점, 함수를 역할별로 나누어 개발데

dani2344.tistory.com

*키워드*

캡슐화: class

은닉화: 접근 지정자 (private)

상속: 콜론(:), extends

다형성: override

추상화: abstract, interface

 

객체 지향의 4대 특징

캡슐화 (Encapsulation)

 

추상화 (Abstraction)

객체간의 공통점을 뽑아 추상화 객체로 만듦

추상화가 잘 될 수록 공통점이 모여 작고 단순해짐

각자의 class를 사자, 곰, 늑대로 만든다면 이들이 추가로 생길 때 마다 class를 생성해야 함

그래서 이들을 동물이라는 공통점으로 묶으면?

 

상속성 (Inheritance)

자식이 부모의 속성과 기능을 상속받음

추상화 구현할 때 사용

class 동물을 만들어 짖는 기본 함수를 넣어주고,

고양이, 개 class를 만들어 동물 class를 상속받게 넣어줌

오른쪽처럼 각자의 짖어 함수를 만들면 각자 짖음.

하지만 편리함을 위해 list로 묶어서 짖게 만들면 모두 기본 동물 소리를 냄

-> ?

 

다형성 (Polymrphism)

형질을 변경, 부모의 기능을 재정의

 

virtual: 자식 클래스가 재정의하게 허락

override: 부모 기능을 재정의

=> virtual이 있는 메소드만 자식 클래스에서 override 가능

 

왼쪽처럼 virtual, override를 추가하고 오른쪽처럼 출력한다면

각자의 울음소리로 잘 나온다

 

왼쪽의 내용을 위해 오른쪽 구조로 코드를 만들었다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Practice3 : MonoBehaviour
{
    enum Type
    {
        무기,
        갑옷,
        헬멧,
        소모품,
        신발,
        없음
    }

    class Item
    {
        public Type 종류;
        public string 모델명;
        public int 내구도;
        public int 요구레벨;
        public Item()
        {
            종류 = Type.없음;
        }
        public virtual void desc(int i) {
            print($"슬롯:{i} 비어 있음");
        }
    }
    class Weapon : Item
    {
        int 공격력;
        public Weapon(string name, int num, int level, int attack)
        {
            종류 = Type.무기;
            모델명 = name;
            내구도 = num;
            요구레벨 = level;
            공격력 = attack;
        }
        public override void desc(int i)
        {
            print($"슬롯:{i} 종류:{this.종류} 모델명:{this.모델명} 공격력:{공격력} 내구도:{내구도} 요구레벨:{요구레벨}");
        }
    }
    class Armor : Item
    {
        int 방어력;
        public Armor(Type type, string name, int num, int level, int defence)
        {
            종류 = type;
            모델명 = name;
            내구도 = num;
            요구레벨 = level;
            방어력 = defence;
        }
        public override void desc(int i)
        {
            print($"슬롯:{i} 종류:방어구 모델명:{this.모델명} 공격력:{방어력} 내구도:{내구도} 요구레벨:{요구레벨}");
        }
    }
    class Consumable : Item
    {
        int 수량;
        public Consumable(string name, int num, int level, int count)
        {
            종류 = Type.소모품;
            모델명 = name;
            내구도 = num;
            요구레벨 = level;
            수량 = count;
        }
        public override void desc(int i)
        {
            print($"슬롯:{i} 종류:{this.종류} 모델명:{this.모델명} 공격력:{수량} 내구도:{내구도} 요구레벨:{요구레벨}");
        }
    }
    class Boots : Item
    {
        int 이동속도;
        public Boots(string name, int num, int level, int speed)
        {
            종류 = Type.신발;
            모델명 = name;
            내구도 = num;
            요구레벨 = level;
            이동속도 = speed;
        }
        public override void desc(int i)
        {
            print($"슬롯:{i} 종류:{this.종류} 모델명:{this.모델명} 공격력:{이동속도} 내구도:{내구도} 요구레벨:{요구레벨}");
        }
    }

    private void Start()
    {
        Weapon weapon = new Weapon("참마도", 123, 43, 46);
        Armor armor = new Armor(Type.갑옷, "판금갑옷", 654, 904, 49);
        Armor helmet = new Armor(Type.헬멧, "군단헬멧", 423, 23, 65);
        Item empty = new Item();
        Consumable potion = new Consumable("물약", 43, 123, 3);
        Boots boots = new Boots("중세장화", 54, 4, 23);

        Item[] slots = { weapon, armor, helmet, empty, potion, boots };
        for (int i = 0; i < slots.Length; i++)
        {
            slots[i].desc(i);
        }
    }
}

하지만 여기에서 public set이 가능해져 start문에서 weapon.종류 = Type.소모품으로 바꿔버릴수도 있다;

그래서 변수를 가져오는 get은 public 하지만 set은 private하게 바꾸고 싶다면?

public 선언한 종류의 set을 private으로 만들고

item의 생성자 부분에 매개변수를 받아 이를 종류로 설정하게 만들었다.

 

하지만 그러면 Item을 상속받은 Weapon의 생성자에서 오류가 나는데, 이는 필수적인 itemType의 입력이 없기 때문이다.

부모의 내용에 parameter로 Type.무기를 지정하게 수정하면 외부에서 set은 불가능하며 자식에서 set은 가능하게 수정할 수 있다.

728x90
반응형