C#/기초

C# 개념 정리 4/ 상속, 다형성, out, ref / 면접 질문 대비

근본넘치는개발자 2024. 9. 25. 21:58

개념 정리 3에서 이어집니다.

2024.09.24 - [C#/기초] - C# - 개념 정리 3 / 메서드, 구조체, 클래스, 객체 / 면접 질문 대비

 

상속(Inheritance)

기존 클래스(= 부모클래스, 기본 클래스)를 확장하거나 재사용하여

새로운 클래스(= 자식 클래스, 파생 클래스)를 생성하는 방식

 

상속의 장점 :

코드 재사용성 용이

계층 구조 표현

유지보수성 향상

상속의 종류 

단일 상속(Single Inheritance) : 하나의 클래스만 상속받는 것. C#에서는 단일 상속만 지원.

다중 상속(Multilevel InHeritance) : 여러 개의 부모 클래스를 동시 상속 받는 경우.

다중 레벨 상속 (Multilevel Inheritance): 상속이 여러번 이어지는 경우  

계층적 상속 (Hirarchical Inheritance) : 하나의 클래스로부터 여러 파생 클래스가 상속받는 경우

 

// 단일 상속
public class Animal { }
public class Dog : Animal { }

====================
// 다중 상속 
// ※ C#에서는 안 쓰인다. 
// 아래 예시는 설명을 위해 C++ 작성 

class Animal { }
class mammal { }
class Person : publc Animal , public mammal { 
	// 내용생략
}

// 다중 상속을 직접적으로 지원하지는 않지만 
// 인터페이스를 활용하여 다중 상속처럼 사용 가능
=====================
//다중 레벨 상속

public class Animal { }
public class Mammal : Animal { }
public class Dog : Mammal { }

=====================
// 계층적 상속

public class Animal { }
public class Dog : Animal { }
public class Cat : Animal { }

=====================

 

 

더보기

+ 유니티의 MonoBehaviour 클래스도 상속의 예시

 
MonoBehaviour 클래스는
GameObject에 부착될 수 있는 스크립트의 기본 기능을 제공한다.

 

 

Awake(): 스크립트 인스턴스가 로드될 때 호출. 초기화에 사용

Start(): 첫 번째 프레임 업데이트 전에 호출. 초기화에 사용되지만 Awake() 이후에 실행

Update(): 매 프레임마다 호출 / 1초에 60 프레임으로 실행되나, 환경에 따라 실행 주기가 떨어질 수도 있다.

FixedUpdate(): 고정된 시간 간격으로 호출,  물리 연산에 주로 사용 / 1초에 약 50회 호출

LateUpdate(): 모든 Update 함수가 호출된 후 매 프레임 호출 / Update()와 같이 60 프레임


OnEnable(): GameObject가 활성화될 때 호출

OnDisable(): GameObject가 비활성화될 때 호출

OnDestroy(): 스크립트가 제거되거나 GameObject가 파괴될 때 호출


 

 
using UnityEngine;
public class ExampleBehaviour : MonoBehaviour
{

    public float speed = 5f;
    private bool isMoving = false;
   
    // Start is called before the first frame update

    void Start()
    {
        Debug.Log("ExampleBehaviour started!");
    }

    // Update is called once per frame
    void Update()
    {
        if (isMoving)
        {

            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
        if (Input.GetKeyDown(KeyCode.Space))
        {

            isMoving = !isMoving;
        }
    }

    // Called when the GameObject becomes enabled and active
    void OnEnable()
    {
        Debug
.Log("ExampleBehaviour enabled");

    }

    // Called when the GameObject becomes disabled or inactive
    void OnDisable()
    {
        Debug.Log("ExampleBehaviour disabled");
    }

    // Called when the script instance is being loaded
    void Awake()
    {
        Debug
.Log("ExampleBehaviour is awake");
    }

    // Called when the MonoBehaviour will be destroyed
    void OnDestroy()
    {
        Debug.Log("ExampleBehaviour is being destroyed");
    }

}

 

 

 

 

왜 다중 사용을 안 사용할까?

 

다이아몬드 문제 발생

->  한 클래스가 두 개 이상 부모 클래스로부터 동일 맴버 상속 시 모호함 발생

 

이름 충돌 발생 

 

설계의 복잡성 증가

 

설계의 일관성, 단순성 유지 

 

 

 

+ 알면 유용할  base 키워드

 부모 클래스의 맴버에 접근 할 수 있다.

 

public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("동물 소리");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        base.MakeSound(); // 기본 클래스의 MakeSound 메서드 호출 -> "동물 소리" 출력
        Console.WriteLine("멍멍!");
    }
}

===================================================

public class Animal
{
    public Animal(string name) { }
}

public class Dog : Animal
{
    public Dog(string name) : base(name) { }
}

 

다형성 

같은 타입이지만 다양한 동작을 수행할 수 있는 능력

 

다형성 종류 

컴파일 시간 다형성 (= 오버로딩)

->  동일한 이름의 메서드를 다양한 매개변수 목록으로 다중 정의해 사용하는 방법 

 

런타임 다형성(= 오버라이딩)

-> 상속과 인터페이스 기반으로 이미 정의된 메서드를

파생/자식 클래스에서 재정의하여 사용하는 것 

 

오버로딩

void SayHello(string a, string b)
{
	Console.WriteLine( a + "가 " +  b +  "에게 안녕 인사 한다");
}

void SayHello(string a)
{
	Console.WriteLine( a + "가 모두에게 안녕 인사 한다");
}


SayHello("철수", "영희"); //  철수가 영희에게 안녕 인사 한다
SayHello("철수"); // 철수가 모두에게 안녕 인사 한다

 

오버라이딩 

public Class Animal
{
    public virtual void bark()
    {
    	Console.WriteLine("멍멍");
    }

}

public Class Cat : Animal
{
    public override void bark()
    {
       Console.WriteLine("야옹");
    }

}

//추상 클래스
abstract Class Food
{
    //추상 메서드 : 선언만 있고 구현 없음
    public abstract void Eat();
	
    public void meat()
    {
    	Console.writeLine("");
    }
    
}


public Class Dog : Food
{
    public override void Eat()
    {
    	Console.WriteLine("잡식 동물");
    }


}

 

 

out 과 ref

둘 다 메서드에서 매개변수를 전달할 때 사용

 

차이점 

ref :

메서드 내에서 해당 변수의 값을 직접 변경 가능

호출 전에 반드시 초기화해야 함

out

메서드 내에서 반드시 값을 할당해야 함

호출 전에 초기화할 필요가 없음

 

public void RefExample(ref int number)
{
    number = number * 2; // 읽기와 쓰기 모두 가능
}

public void OutExample(out int number)
{
    // number = number * 2; // 컴파일 에러: 할당 전에 사용할 수 없음
    number = 10; // 반드시 값을 할당해야 함
}

public void UseExamples()
{
    int refNum = 5;
    RefExample(ref refNum); // refNum은 초기화되어 있어야 함
    Console.WriteLine(refNum); // 출력: 10

    int outNum;
    OutExample(out outNum); // outNum은 초기화되지 않아도 됨
    Console.WriteLine(outNum); // 출력: 10
}

 

 

개념 정리 5로 이어집니다.

 

2024.09.27 - [C#/기초] - C# 개념 정리 5 / 인터페이스, 열거형, 델리게이트, 이벤트, 람다, 제너릭, Func, Action, Predicate / 면접 대비

 

 

참고하면 좋을 내용

 

https://www.php.cn/ko/faq/360233.html

 

125가지 기본 C# 인터뷰 질문 및 답변 공유-C#.Net 튜토리얼-php.cn

이 문서는 125개의 기본 C# 인터뷰 질문과 답변 목록입니다. 이러한 인터뷰 질문은 간단하고 직설적이며 C#의 가장 기본적인 개념을 다루고 있으며, 그 중 대부분은 개체 지향 개념과 관련되어 있

www.php.cn

https://www.guru99.com/ko/c-sharp-interview-questions.html

 

상위 50개 C# 인터뷰 질문 및 답변(2024)

신입생 및 경력자를 위한 C# 인터뷰 질문: 다음은 신입생 및 2/3/5/10년 경력 전문가를 위한 기본부터 고급 C# 인터뷰 질문과 답변 목록입니다.

www.guru99.com

https://shypang.tistory.com/16

 

C# 해외 면접시 TOP50

가장 인기있는 C # 인터뷰 질문 및 답변기본 개념에 대한 질문Q # 1) 객체와 클래스 란 무엇입니까?Ans : 클래스는 실시간 엔터티를 나타내는 데 사용되는 속성 및 메서드의 캡슐화입니다. 모든 인

shypang.tistory.com