본문 바로가기
다이어리/내일배움 개발일지

게임개발캠프 - 개인과제(A) 2일차

by E.Clone 2024. 1. 2.

과정명 : 내일배움캠프 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주차 강의까지 마치기.

반응형