강께르의 개발일지

[문제 풀기] 클래스에 관하여 본문

프로그래밍/C#

[문제 풀기] 클래스에 관하여

강께르 2021. 9. 16. 09:57

- const, readonly 차이점 설명

readonly : 런타임 중에 결정된다. 필드 초기화와 생성자 초기화로 사용되며 초기 할당만 허용한다. 사용자 정의 데이터형에 대해서 사용 가능

const : 컴파일 타임 중에 결정된다. 기본 데이터형에 대해서 사용 가능

 

-  깊은 복사 얕은 복사 설명

깊은 복사 : 복사받을 인스턴스를 하나 생성한 후에 복사해줄 인스턴스의 멤버 값들을 싹 다 복사하는 것

얕은 복사 : 인스턴스 참조값만 복사

 

- this, base 키워드 쓰이는 곳

this : 멤버와 매개변수의 이름이 똑같아서 구분해야할 필요가 있을 때, 해당 인스턴스로 메소드나 멤버변수를 갖고와야 할 필요가 있을 때, 해당 인스턴스를 매개변수로 전달하고 싶을 때

base : 부모 클래스의 메소드를 호출할 때, 생성자를 명시적으로 선택해야할 때

 

- 생성자 및 소멸자 호출 순서 정리

생성자 : 최상위 클래스부터 최하위 클래스로

소멸자 : 최하위 클래스부터 최상위 클래스로

 

- 객체 지향의 다형성 설명

부모 클래스 변수로 자식 인스턴스를 참조할 수 있는 것을 의미. 그리하여서 하나의 부모 클래스 데이터형은 그 클래스를 상속하는 수많은 자식 클래스의 인스턴스를 참조 가능한 것

-> 오버로딩도 다형성이라 이야기할 수 있겠지만 객체 지향의 다형성에서는 위 경우를 이야기하는 게 좋을 것

 

- 참조형 변수의 형변환 관한 내용

업캐스팅 : 자식 인스턴스는 부모 클래스로 형변환이 가능하다. 왜냐면 이미 부모 클래스 멤버를 갖고 있기 때문에

다운캐스팅 : 부모 인스턴스는 자식 클래스롤 형변환을 할 수는 있으나 부작용이 있다. 부모 인스턴스는 자식 클래스의 멤버를 가질 수 있어도 그에 대한 값이 애초에 없기 때문. 문제가 발생

 

- 오버라이딩과 오버로딩의 차이점

오버로딩 : 한 클래스 내에서 메소드의 이름이 같지만 다른 매개변수를 가져 메소드들끼리 다르게 구현한 것

오버라이딩 : 부모 클래스에 있는 메소드를 자식 클래스에서 식별자는 같지만 새롭게 바디를 재정의한 것

 

퀴즈

  1. int 배열 처럼 동작하는 클래스를 만들어라.
  2. indexer 에서 경계검사를 해라.
  3. 리사이즈 기능 추가
using System;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            MyArr arr = new MyArr(5);

            arr[-1] = 5;
            arr[1] = 2;
            arr[2] = 3;
            arr[3] = 6;
            arr[4] = 7;
            arr[5] = 1;

            for(int i = 0; i < 8; i++)
            {
                Console.WriteLine(arr[i]);
            }
            Console.WriteLine();

            arr.Resize(2);

            for (int i = 0; i < 8; i++)
            {
                Console.WriteLine(arr[i]);
            }

        }
    }

    class MyArr
    {
        private int[] array;
        private int size;
        public int this[int arrNum]
        {
            get 
            {
                if (arrNum >= 0 && arrNum < size)
                    return array[arrNum];
                else
                    return Int32.MinValue;
            }
            set 
            {
                if (arrNum >= 0 && arrNum < size)
                    array[arrNum] = value; 
            }
        }

        public MyArr(int n)
        {
            array = new int[n];
            size = n;
        }

        public void Resize(int n)
        {
            int[] temp = new int[n];

            for(int i = 0; i < size; i++)
            {
                if (i >= n) break;
                temp[i] = array[i];
            }

            size = n;

            array = temp;
        }
    }
}