오늘 드디어 개인과제를 제출하였다
제출하기 위해 깃허브 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();
'TIL' 카테고리의 다른 글
[TIL] 내일배움캠프_Unity 4주차 복습(람다 , LINQ), is,as 연산자, 5주차 강의 - 정렬 (0) | 2023.08.25 |
---|---|
[TIL] 내일배움캠프_Unity 4주차 복습(인터페이스, 델리게이트), 과제 제출 (0) | 2023.08.24 |
[TIL] 내일배움캠프_Unity 개인과제 버그 (0) | 2023.08.22 |
[TIL] 내일배움캠프_Unity 개인과제, 문자열 포맷, 정렬, 입력 경고 메세지 (0) | 2023.08.21 |
[TIL] 내일배움캠프 _Unity static, 코딩 팁, 컴퓨터구조&운영체제, 코드컨벤션 특강, 코드리뷰 (0) | 2023.08.18 |