과정명 : 내일배움캠프 Unity 게임개발 3기
전체진행도 : 7일차
부분진행도 : Chapter2.1 - 2일차
작성일자 : 2024.01.02(화)
개발일지 목록 : 클릭
1. 진행중인 과정에 대해
강의 듣기 및 개인 프로젝트의 2일차다. 개인 프로젝트를 살짝 진행 해 두었고, 강의의 진도를 나갔다.
C# 문법 강의를 듣고 있는데 처음 보는 내용들이 있어 시간이 걸리고 있다.
오늘은 C# 학습 내용에 대해 살짝 정리하고, 개인 프로젝트에 대해서는 이후 작성할 것.
2. 오늘 학습에 대해
Visual Studio의 디버깅 관련
- F9로 코드상의 브레이크 포인트 지정
- F5로 디버깅 시작
- F10으로 코드 디버깅 순차적으로 진행
- 확인 원하고자 하는 변수 위에 마우스 올려 고정버튼 가능
foreach문
- Python의 for i in ['a','b','c']과 같은 역할을 한다. 예제는 아래와 같음
string[] inventory = { "검", "방패", "활", "화살", "물약" };
foreach (string item in inventory)
{
Console.WriteLine(item);
}
Random 사용 예시
string[] choices = { "가위", "바위", "보"};
string computerChoice = choices[new Random().Next(0,3)] // 0,1,2중에 랜덤한 값 하나
캐스트 관련 참고사항
double average = sum / scores.Length; // int형인 sum과 scores.Length 둘 중 하나는 double로 캐스팅 해야 맞는 average가 나옴
double average = (double)sum / scores.Length;
다차원 배열의 선언과 초기화
int[,] array2da = new int[2,3]; // 2행 3열
array2da[0,0] = 1; // 초기화
int[,] array2db = new int[2,3]{{1,2,3},{4,5,6}}; // 선언과 초기화
컬렉션(Collection)
- 배열과는 다르게 크기가 가변적
- System.Collections.Generic 네임스페이스 추가 필요
컬렉션:List 의 예시
List<int> list = new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Remove(2);
foreach(int i in list){Console.WriteLine(i);}
for(int i=0; i<list.Count; i++){Console.WriteLine(list[i]);}
// 1 3
컬렉션:Dictionary 의 예시
Dictionary<string, int> scores = new Dictionary<string, int>();
scores.Add("Alice",100);
foreach(DeyValuePair<string, int> pair in scores){Console.WriteLine(pair.Key + ": " + pair.Value);
컬렉션:Stack 의 예시
Stack<int> stack1 = new Stack<int>();
stack1.Push(1);
stack2.Push(2);
int value = stack1.Pop(); // value = 2
컬렉션:Queue 의 예시
Queue<int> queue1 = new Queue<int>();
queue1.Enqueue(1);
queue1.Enqueue(2);
int value = queue1.Dequeue(); // value = 1
컬렉션:HashSet(중복되지 않은 요소로 이루어진 집합) 의 예시
HashSet<int> set1 = new HashSet<int>();
set1.Add(1);
set1.Add(2);
foreach(int element in set1){ Console.WriteLine(element); }
구조체
여러 개의 데이터를 묶어 하나의 사용자 정의 형식으로 만듦
struct Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine($"Name: {Name}, Age: {Age}");
}
}
Person person1;
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo();
클래스:용어메모와 구조체와의 비교
- 특징 : 캡슐화/상속/다형성/추상화/객체
- 구성요소 : 필드/메서드/생성자/소멸자
- 구조체와 클래스는 모두 사용자 정의 형식을 만드는 데 사용될 수 있다.
- 구조체는 값 형식으로, 스택에 할당되고 복사될 때 값이 복사된다.
- 클래스는 참조 형식으로, 힙에 할당되고 참조로 전달되어 성능 측면에서 구조체와 차이가 있다.
- 구조체는 상속을 받을 수 없지만, 클래스는 단일 상속 및 다중 상속이 가능하다.
- 구조체는 작은 크기의 데이터 저장이나 단순한 데이터 구조에 적합하며, 클래스는 더 복잡한 객체를 표현하고 다양한 기능을 제공하기 위해 사용한다.
접근제한자
- public : 외부에서도 자유 접근 가능
- private : 같은 클래스 내부에서만 접근 가능
- protected : 같은 클래스 내부와 상속받은 클래스에서 접근 가능
프로퍼티(Property)
- 객체의 필드에 직접 접근하지 않고 간접적으로 필드값을 읽거나 설정하는 데에 사용되는 접근자(Accessor) 메서드의 조합.
- 필드에 대한 접근제어와 데이터 유효성 검사 등을 수행
- 필드와 마찬가지로 객체의 상태를 나타내는 데이터 역할을 하지만, 외부에서 접근할 때 추가적인 로직을 수행 할 수 있음.
- get과 set 접근자를 사용하여 동작을 정의한다
- get 접근자는 프로퍼티의 값을 반환하고, set 접근자는 프로퍼티의 값을 설정한다.
- 필요에 따라 두 접근자 중 하나를 생략하여 읽기 전용 혹은 쓰기 전용 프로퍼티를 정의할 수 있다.
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
private set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
age = value;
}
}
}
Person person = new Person();
person.Name = "John"; // 컴파일 오류: Name 프로퍼티의 set 접근자는 private입니다.
person.Age = -10; // 유효성 검사에 의해 나이 값이 설정되지 않습니다.
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // Name과 Age 프로퍼티에 접근하여 값을 출력합니다.
또한, 다음과 같은 자동 프로퍼티 구문으로 간단하게 정의하고 사용이 가능
[접근 제한자] [데이터 타입] 프로퍼티명 { get; set; }
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person();
person.Name = "John"; // 값을 설정
person.Age = 25; // 값을 설정
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // 값을 읽어 출력
상속
- 여러 부모의 클래스를 하나에 자식에 상속받는 다중상속은 C#에서 불가능
- 단, 하나의 클래스와 동시에 여러 개의 인터페이스를 상속받는 것은 가능
public class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public void Eat() { Console.WriteLine("Animal is eating."); }
public void Sleep() { Console.WriteLine("Animal is sleeping."); }
}
public class Dog : Animal
{
public void Bark() { Console.WriteLine("Dog is bark."); }
}
다형성 : 가상 메서드
- 자식 클래스에서 재정의 할 수 있는 메서드
public class Unit{
public virtual void Move(){
Console.WriteLine("두발로 걷기");
}
}
public class Marine:Unit{
public override void Move(){
Console.WriteLine("네발로 걷기");
}
}
Marine marine = new Marine();
marine.Move(); // virtual/override 를 사용하지 않았어도, 문제 없이 "네 발로 걷기"를 출력
List<Unit> list = new List<Unit>();
list.Add(new Marine()); // 부모의 형태로 관리하는 경우, virtual/override를 사용하여 실형태인 자식을 탐색할 수 있도록 함
foreach(Unit unit in list) { unit.Move(); } // 즉, virtual/override를 사용하지 않았다면, "두발로 걷기"를 출력
추상 클래스와 메서드
- 추상 클래스는 직접적인 인스턴스를 생성 불가
- 상속을 위한 뼈대 클래스로 사용
- 추상 클래스는 abstract 키워드를 사용하여 선언되고, 추상 메서드를 포함 할 수 있다.
- 추상 메서드는 구현부가 없는 메서드이며, 자식 클래스에서 의무적으로 구현을 요구.
abstract class Shape{ public abstract void Draw(); }
class Circle : Shape{ public override void Draw() { Console.WriteLine("Drawing a Circle"); } }
용어 혼동 주의
- 오버라이딩(Overriding) : 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의 하는 것
- 오버로딩(Overloading) : 매개변수의 갯수와 타입에 따라 동일한 이름의 여러개의 메서드를 정의하는 것
제너릭 / out, ref 키워드에 대한 학습과 정리는 내일 중 진행
3. 과제에 대해
- 개인 과제의 필수 항목은 1차적으로 완성하였고, UI 개편과 선택 항목 구현의 진행이 필요.
- 3주차 강의까지 학습 완료, 5주차 강의까지 마치기.
'다이어리 > 내일배움 개발일지' 카테고리의 다른 글
게임개발캠프 - 개인과제(A) 4일차 (0) | 2024.01.04 |
---|---|
게임개발캠프 - 개인과제(A) 3일차 (0) | 2024.01.03 |
게임개발캠프 - 개인과제(A) 1일차, 팀셔플 (0) | 2023.12.29 |
게임개발캠프 - 팀과제(A) 5일차, 발표 시연 (0) | 2023.12.28 |
게임개발캠프 - 팀과제(A) 4일차 (0) | 2023.12.27 |