개념 정리 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