[C# 객체지향] 상속_this와 base

eunjin lee·2022년 6월 18일
0

C# 9.0 프로그래밍

목록 보기
5/50

클래스 내부의 코드에서 (인스턴스화된) 객체 자신을 가리킬 수 있도록 this 예약어가 제공된다.
또한, 클래스 내부의 코드에서 자신이 상속한 부모 클래스를 가리킬 수 있도록 base 예약어가 제공된다.



  1. this
  • 클래스의 멤버 변수와 메서드의 매개 변수의 이름이 같아도, 구분할 수 있다.
  • 코드의 중복을 줄인다.
    ✍ 샘플 코드
    class Person
    {
        string name;
        int age;
        string nationality;

        public Person(string name) : this(name, 1)
        {
        }

        public Person(string name, int age) : this(name, age, string.Empty)
        {
        }

        public Person(string name, int age, string nationality)
        {
            this.name = name;
            this.age = age;
            this.nationality = nationality;
        }

    }


🧐 더 알아보기

인스턴스 메서드는 명시적인 매개변수가 없어도 컴파일러가 인스턴스 변수를 넘긴다. 그렇기 때문에 인스턴스 메서드 내부에서 인스턴스 필드에 접근할 수 있는 것이다. 메서드 내부에서 인스턴스 멤버에 접근하지 않는다면, 정적 메서드를 쓰는 것이 (크게 의미 있는 정도는 아니지만) 성능 상 유리할 수 있다.

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.name = "Jenny";
            person.Introduce();
        }

    }

    class Person
    {
        public string name;

        public void Introduce()
        {
            Console.WriteLine("My name is "+this.name);
        }

    }

위의 코드는 아래와 같이 컴파일 된다.

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person();
            person.name = "Jenny";
            person.Introduce(person);
        }

    }

    class Person
    {
        public string name;

        public void Introduce(Person this)
        {
            Console.WriteLine("My name is "+this.name);
        }

    }



2. base

  • 자식 생성자가 호출되면 부모의 생성자도 호출된다. 이때 자식 생성자는 자식 클래스의 멤버 초기화만 담당하고, 부모 생성자는 부모 클래스의 멤버 초기화를 담당해야 한다.

✍ 샘플 코드

    class Program : Object
    {
        static void Main(string[] args)
        {
            Person p1 = new Female();
            Person p2 = new Female("Jay");
            Console.WriteLine(p1.name);
            Console.WriteLine(p2.name);
        }

    }
    class Person
    {
        public string name;

        public Person(string name)
        {
            this.name = name;  
        }
    }

    class Female : Person
    {   
        public Female() : base("NoName")
        {

        }
        public Female(string name) : base(name)
        {
        }
    }

✅ 결과

NoName
Jay

0개의 댓글