본문 바로가기
공부

[TIL][처음 배우는 c# 프로그래밍] 241218 1.클래스

by 때려쳐아니때려치지마 2024. 12. 19.
반응형

https://search.shopping.naver.com/book/catalog/32487168979?cat_id=50010920&frm=PBOKPRO&query=%EC%B2%98%EC%9D%8C+%EB%B0%B0%EC%9A%B0%EB%8A%94+C%23+%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D&NaPm=ct%3Dm4tk9flk%7Cci%3D493fc62a6e4d02a3bc74d29b634cf28d570ac037%7Ctr%3Dboknx%7Csn%3D95694%7Chk%3Df91376dc6b0a2384ffcb80e1803a17e51adf8088

 

처음 배우는 C# 프로그래밍 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com

책도 선물받았고 C# 기초도 다시 공부하고자함~


3. 클래스

3.1 클래스와 추상화

3.1.1 객체 지향과 클래스

 

객체 : 현실의 사물을 개념적으로 표현하는것 -> 현실의 사물을 표현하기 위해 변수(속성)와 함수(동작)로 구성되어있다.

클래스 : 객체의 속성과 행위를 정의하는 설계도

 

  • 추상화 : 객체를 구성하기위해 개념적으로 정의하는것
    • 속성 -> 필드로 정의 (변수)
    • 행위 -> 메서드로 정의 (함수)
    • 생성자 -> 인스턴스화시 호출되는 메서드
public class Example : MonoBehaviour
{
    private void Start()
    {
        Human Amy = new Human();
        // 인스턴스로 객체가 생성되고 내부 데이터는 비어있음

        Human John = new Human("John", 20, 180);
        // 인스턴스로 객체가 생성되면서 데이터를 할당해줌
        Debug.Log(John.age);
    }
} 


class Human
{
    public string name;
    public float height;
    public int age;

    public Human()
    {

    }

    public Human(string name, float height, int age)
    {
        this.name = name;
        this.height = height;
        this.age = age;
    }
}

현실의 사람이라는 개념을 Human이라는 클래스로 정의하여 추상화하였고

name, height, age라는 속성을 변수로 정의하였다.

Human() 함수를 사용하여 속성을 할당해주는 메소드를 정의하였고

 

Human John = new Human("John", 20, 180);라는 구문에서 new 뒤에 Human을 호출하여 생성자를 호출하였다.

오버로딩된 함수를 통하여 생성자를 호출하며 데이터를 입력하거나 비어둘수있다.

 

  • 캡슐화 : 필드와 메서드를 묶어 공개와 은닉을 구분하는것
    • 접근제한자 : 공개 범위 설정,
      private(외부공개x) < protected(파생까지 o) < internal(같은 어셈블리 o) < public (모든 외부 접근 o)
    • property : 특정 필드의 값에 접근(get)하거나 설정(set)하는 메서드(getter, setter)
public class Example : MonoBehaviour
{
    private void Start()
    {
        Human Amy = new Human();
        // 인스턴스로 객체가 생성되고 내부 데이터는 비어있음

        Human John = new Human("John", 20, 180);
        // 인스턴스로 객체가 생성되면서 데이터를 할당해줌
        Debug.Log(John.age);
    }
} 


class Human
{
    public string name;
    public float height;
    public int age;

    /// -----------getter setter-----------
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    
    public float Height
    {
        get { return height; }
        set { height = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    /// ---------------------------------

    public Human()
    {

    }

    public Human(string name, float height, int age)
    {
        this.name = name;
        this.height = height;
        this.age = age;
    }
}

public으로 외부 공개가 허용된 property( getter setter)를 통해 내부 속성을 정의하거나 가져올수있다.

 

  • 상속 : 클래스를 물려받는것
    • 상위 클래스의 코드를 하위 클래스가 물려받음
    • this : 현재 객체를 가리키는 키워드 (인스턴스된 객체에서 this를 쓰면 원본이 아닌 생성된 객체를 참조함)
    • base : 부모클래스를 가리킨다.
class Adult : Human
{
    public Adult(string _name, float _height, int _age) : base(_name, _height, _age) { }

    public void SetAge(int _age)
    {
        base.age = _age;
    }
}


class Human
{
    public string name;
    public float height;
    public int age;

    /// -----------getter setter-----------
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    
    public float Height
    {
        get { return height; }
        set { height = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }
    /// ---------------------------------

    public Human()
    {

    }

    public Human(string name, float height, int age)
    {
        this.name = name;
        this.height = height;
        this.age = age;
    }
}

Human 클래스의 Human 함수에서 this.을 사용하여 인스턴스화된 객체에 데이터를 할당한다.

Adult의 SetAge 함수는 base.age는 원본의 age에 접근하여 데이터를 할당하고있다.

  • 다형성  : 여러 형태를 갖음 = 같은 형태의 코드가 다른 역할을 할 수 있다.
    • 메서드 오버라이드 : 자식 클래스에서 재정의함
    • 메서드 오버로드 : 같은 클래스에서 매개변수가 다른 함수를 두 개 이상 정의하는것
class Adult : Human
{
    public Adult(string _name, float _height, int _age) : base(_name, _height, _age) { }

    public void SetAge(int _age)
    {
        base.age = _age;
    }

    /// -----------child class override-----------
    public override void GrowUp(int add)
    {
        if(today == birthday)
        {
            base.GrowUp(add);
        }
    }
    /// ---------------------------------
}


class Human
{
    public string name;
    public float height;
    public int age;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    
    public float Height
    {
        get { return height; }
        set { height = value; }
    }

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public Human()
    {

    }

    public Human(string name, float height, int age)
    {
        this.name = name;
        this.height = height;
        this.age = age;
    }

    /// -----------base class virtual-----------
    public virtual void GrowUp(int add)
    {
        age += add;
    }
    /// ---------------------------------
}

Human 클래스에서 Human()과 Human(string name, float height, int age)는 서로 오버로딩 관계이고

부모 클래스인 Human클래스의 GrowUp 가상메소드는 자식 클래스인 Adult 클래스에서 오버라이딩되어 생일에만 나이를 먹게 수정되었다.

반응형

댓글