TIL

[TIL] 내일 배움 캠프 _Unity 개인과제 제출 및 후기, 4주차 강의

Hwone 2023. 8. 23. 21:46

오늘 드디어 개인과제를 제출하였다 

제출하기 위해 깃허브 Readme 작성법도 익히고, 클래스 다이어 그램도 만들어보고, 플레이 동영상도 찍어보았다

이번 과제를 진행하면서 팀 프로젝트도 아닌데 팀원들과 많은 이야기와 아이디어를 나누고 에러도 나눠볼 수 있었다 

또, 각자 만들고 있는 프로젝트를 보여주며 어디까지 진행되고 있는지에 대해 말해보는 시간도 간간히 가질 수 있었는데 

내가 만들고 있는 것을 보다가 팀원의 프로젝트를 보면 괜히 부족해보여 더 열심히 더 잘 하고 싶은 생각이 들어 좋은 자극이 되었다 처음 개인과제를 하는데 왜 팀이 필요한가에 대해서 생각해본적 있는데 아주 긍정적인 효과를 몸소 느꼈다 아주 좋은 방법이다...! 그리고 좋은 팀원들을 만나서 더 좋은 시너지가 발생하는 것 같다 

 

개발에 대한 자세한 내용은 개발일지에 적어놓았다 

https://hwon-note.tistory.com/36

 

[C# 개인과제] TextRPG

https://github.com/phw97123/LegendofSparta.git GitHub - phw97123/LegendofSparta: TextRPG TextRPG. Contribute to phw97123/LegendofSparta development by creating an account on GitHub. github.com 개발 과정 처음 개인 과제를 받고 시작하기에

hwon-note.tistory.com

 

 

개인 과제 제출을 미리 끝내놓고 4주차 강의를 시작해보았다

 

4주차 강의 정리

이번 강의는 중요하고 조금 어려운 부분인 것 같아 내용이 길어질듯 하다 

인터페이스 vs 추상클래스

  인터페이스 추상 클래스
사용 방법  추상적인 동작만 정의하고 구현 X
(필드는 선언 불가, 프로퍼티 사용) 
일부 동작의 구현을 가질 수 있고, 추상메서드를 포함할 수 있다 
상속 다중상속 지원 단일 상속 지원
쓰임새 특정한 기능들의 대한 호환성을 높일 때  상속을 받아서 동작을 해야할 때

예외처리 

try 
{//예외가 발생할 수 있는 코드 
}
catch(ExceptionType ex)
{//해당하는 예외처리
}
finally
{ //예외발생 여부와 상관없이 항상 실행되는 코드 
}

catch 블록은 여러개를 사용하여 다양한 예외 타입을 처리하고, 위에서부터 순서대로 실행된다 

finally 블록은 정리 작업이나 리소스 해제 등의 코드를 포함할 수 있다 (생략가능) 

 

사용자 정의 예외 클래스 작성 

Exception 클래스를 상속받아 작성할 수 있다 

*일부러 에러를 내기 위한 키워드 throw가 있다 (무조건 예외 발생) 

 

Boxing과 Unboxing 

Boxing: 값형을 참조형으로 변환하는 과정 

UnBoxing: Boxing된 객체를 다시 값형으로 변환하는 과정 

(명시적으로 타입캐스팅을 해야하며, 런타임에서 타입 검사가 이루어짐) 

 

주요특징 

-반복적으로 하게 되면 성능 저하가 일어난다 

-Boxing 된 객체는 힙 영역에 할당하므로 가비지 컬렉션의 의해 지워질 수 있으니 또 써야한다면 참조를 유지하고 있어야 -한다 

-Boxing된 객체와 원래의 값형은 독립적이므로 값을 수정하더라도 상호간에 영향을 주지 않는다 

 

*Object 는 .Net Common Type System (CTS)의 일부이며, 모든 클래스의 직간접적인 상위 클래스

모든 클래스는 object에 상속 되며, object는 모든 형식을 참조할 수 있는 포괄적인 타입이다. 

 

이 설명을 들으면서 나도 모르게 Boxing, Unboxing을 하고 있다고 생각을 했다 

예를 들어 List를 만들어서 List에 일반 변수를 넣으면 Boxing이 일어나고 

일반 변수에 List 의 값을 형변환하여 저장하면 Unboxing이 일어난다 

 

델리게이트 

메서드를 변수에 참조할 수 있는 키워드 다른 언어의 함수 포인터와 비슷하다 

(c++에서 함수포인터란 함수의 주소를 저장하는 변수이다) 

 

여러개의 메서드들을 연결하여 모두 호출할 수 있다 

event 키워드를 이용해 호출 함수를 (+= -= ) 관리하고, invoke()로 이벤트를 호출한다 

클래스 외부에서는 직접 이벤트를 호출할 수 없다 (보완성을 높이고 캡슐화를 위해)  

 

실제로는 접근이 불현한 상황일 때 연결해놓는 상황에서 사용한다 

 

나는 언리얼 포트폴리오를 만들 때 이런 델리게이트를 이용하여 필드에 몬스터가 전부 처치되었다면 보스로 가는 포탈을 생성하는 기능을 구현했던 기억이 있다 

 

*? null 조건부 연산자 

null 이 아닌 경우에만 멤버에 접근하거나 메서드를 호출한다 

(개인 과제를 만들면서 Console.ReadLine 오류에서 사용해봤던 연산자) 

 

전부터 생각했던건데 델리게이트를 보면 디자인 패턴의 옵저버 패턴이 자연스럽게 떠오른다 

*옵저버 패턴 : 어떠한 상태가 변경되거나 실행될 때 일일이 참조해주지 않고 관찰자가 구독중인 객체에게 알려주는 패턴

 

람다 

익명 메서드를 만드는 방법 ( 이름이 없는 메서드) 
(parameter_list)=> expression 

람다는 이름이 없기 때문에 델리게이트와 연결하여 사용하는 편이다 
대부분 간단하게 사용하는 메서드에 사용된다 
*내가 사용했던 람다식은 보통 컬렉션에 있는 메서드 들을 활용할 때 사용했다

 

Func, Action 
미리 델리게이트를 대체하는 미리 정의된 제네릭 형식 
Func는 값을 반환하는 메서드를 나타내는 델리게이트 
Action은 값을 반환하지 않는 메서드를 나타내는 델리게이트 

Func<int,int,int> addFunc = 함수 이름 
//int,int : 매개변수, 마지막 int : 반환값 

Action<string> printAction = 함수 이름 
// string 매개변수 , 반환값 없음 

LINQ 
.NET 프레임워크에서 제공되는 쿼리 언어 확장 
데이터를 쿼리하고 조작하는데 사용 
데이터 필터링, 정렬, 그룹화, 조인 등 다양한 작업을 수행 
예시를 보면 이해하기 좋다 
ex) 
//데이터 소스 정의 
List<int> numbers = new List<int> {1,2,3,4,5}; 

var evenNumbers = form num in numbers // foreach문이라고 생각하면 됨 numbers를  num이라고 생각하고 
                            where num % 2 == 0 // 그 중에서 짝수가 있다면 (조건식 지정)
                 select num; // 그 짝수만 저장하겟다 (조회할 데이터 지정)
foreach ( var num in evenNumbers)
 Console.WriteLine(num); 

Nullable 
null : 참조를 하지 않았다 
Nullable : 값형 변수에 null값을 지정할 수 있는 방법을 제공한다 
주로 값형 변수가  null인지 아닌지를 확인하고 처리할 때 사용 
형식은 자료형?  물음표로 함 
값 검사 
.HasValue로 사용한다 (null 인지 확인)  

int nonNullableInt = nullableInt ?? 0 // null 이면 0을 반환 

StringBuilder
문자열들을 내부적인 버퍼에 넣어놔서 조합 해놨다가 필요할 때 사용가능하다 
다양한 메서드를 제공하여 추가, 삽입, 치환, 삭제 작업을 수행할 수 있다 
문자열 조작, 가변성, 효율적인 메모리 관리에 좋다 

StringBuilder sb = new StringBuilder() ; // 스트링빌더 클래스 생성 

sb.Append("Hello"); 
sb.Insert(5,' '); 
sb.Replace("Hello", C#); 
sb.Remove(5,2); 
string result = sb.ToString();