STIKA

Unity 캠프 12일차 TIL < C# 문법 3-1 / 팀 과제 > 본문

프로그래밍/Unity + C#

Unity 캠프 12일차 TIL < C# 문법 3-1 / 팀 과제 >

STIKA 2024. 1. 9. 15:48

24.01.09 Tue

 

❤️ TIL

Today I Learned

❤️하루에 1%씩만 나아가도 4개월 동안 쌓이면 꽤 덩치가 커진답니다 :)


📌 오늘의 계획

  • C# 문법 3주차 강의 듣기
  • 팀 과제 회의하기

✏️ 작업 내용

✔️ 팀 과제

기한 : 1/16(화) 21:00까지

  • 프로젝트 이름 : 다이어트 던전
  • 몬스터 종류
    • 탕후루
    • 떡볶이
    • 대창
  • GitHub Repository → Public으로 올리고 공유
  • README 작성
  • 작업 분배
    • 초기화면 (개인 과제 코드 가져와서 정리)
    • 전투의 전반적인 셋팅
    • 실제 전투, 공격 차례
    • 전투 결과
    • 휴식, 보상 등의 추가 구현
  • 제출
    • 시연 영상 찍기
    • 유튜브에 올리기
    • GitHub주소와 함께 Form제출

 


 

✔️ C# 문법

객체지향 프로그래밍

OOP - Object Oriented Programming 의 특징

  1. 캡슐화 (Encapsulation)
    • 관련된 데이터와 기능을 하나의 단위로 묶는 것
    • 데이터, 메서드의 정보를 은닉하고 접근을 제한하여 안전성과 유지보수성을 높임
  2. 상속 (Inheritance)
    • 기존의 클래스를 확장하여 새로운 클래스를 만드는 메커니즘
    • 부모의 특성과 동작을 자식이 상속받아서 재사용
    • 코드의 중복을 줄이고, 코드의 구조화와 유지보수에 용이
  3. 다형성 (Polymorphism)
    • 하나의 인터페이스나 기능을 다양한 방식으로 구현하거나 사용할 수 있는 능력
    • 오버로딩과 오버라이딩을 통해 구현
    • Virtual 가상 사용
    • 코드의 가독성과 재사용성을 높임
  4. 추상화 (Abstraction)
    • 복잡한 시스템이나 개념을 단순화하고 필요한 기능에 집중하는 것
    • 불필요한 부분을 생략하고 중요한 것에만 중점을 두는 것
    • 클래스들의 중요하고 공통된 성질들을 추출하여 부모 클래스를 선정하는 개념
  5. 객체 (Object)
    • 클래스로부터 생성된 실체
    • 데이터와 해당 데이터를 조작하는 메서드를 가지고있음
    • 체들 간의 상호작용을 통해 프로그램이 동작

 

class Person
{
    public string Name;
    public int Age;

    public void PrintInfo()
    {
        Console.WriteLine("Name: " + Name);
        Console.WriteLine("Age: " + Age);
    }
}

Person p = new Person();
p.Name = "John";
p.Age = 30;
p.PrintInfo(); 

출력: Name: John, Age: 30

Person p = new Person()
person의 주소를 담을 수 있는 p라는 공간을 만듬

new로 실제로 만들어진 person의 공간의 주소를 p에담음

or

p = 분양권

new person = 실제로 분양받은 아파트

 

 

 

Class의 구성요소

  1. 필드 (Fields)
    • 클래스에서 사용되는 변수
    • 보통 private 접근 제한자를 사용하여 외부에서 직접적인 접근을 제한
      필요한 경우에는 프로퍼티를 통해 간접적으로 접근
      class Player
      {
          // 필드 선언
          private string name;
          private int level;
      }​​​​
  2. 메서드 (Methods)
    • 수행되는 동작, 동작을 구현하기 위해 사용
    • 클래스 내부에 있는 함수를 메서드라고 함
    • 보통 메서드는 public 접근 제한자를 사용하여 외부에서 호출할 수 있도록 한다.
    • 메서드를 호출하기 위해서는 해당 메서드가 속해 있는 클래스의 객체를 생성해야 한다.
      class Player
      {
          // 메서드
          public void Attack()
          {
              // 공격 동작 구현
          }
      }​
  3. 생성자 (Constructors)
    • 객체를 초기화하는 역할
    • 객체가 생성될 때 자동으로 호출
    • 필드를 초기화
    • 생성자를 안만들면 디폴트 생성자가 생기지만
      매개변수를 받는 생성자를 만들고 나면 디폴트 생성자는 안생김
      Person person1 = new Person();                     // 디폴트 생성자 호출
      Person person2 = new Person("John", 25);           // 매개변수를 받는 생성자 호출​
  4. 소멸자 (Destructors)
    • 객체가 소멸될 때 호출되는 메서드
    • 메모리나 리소스의 해제 등의 작업

 

클래스 : 붕어빵틀

객체 : 붕어빵틀로 찍어낸 붕어빵

          하지만 팥붕, 슈붕, 피붕 다 다름

 

 

프로퍼티 (Property)​

  • Getter, Setter
  • 접근 제한자를 적절히 사용
  • 필요한 부분만 외부에서 접근 가능하도록 설정하는 것이 좋다
class Person
{
    private int age;
  
    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;         // 유효성 검사에 의해 나이 값이 설정되지 않습니다.

프로퍼티 접근 제한자 적용
유효성 검사

 

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

자동 프로퍼티 (Auto Property)

 

 

다형성

Virtual 사용

 

class Unit { ... }

class Marin : Unit
class Zergling : Unit

<참조형태와 실형태가 같을때>
Marine marine = new Marine();
marine.Move();
marine.Attack();

Zergling zergling = new Zergling();
zergling.Move();
zergling.Attack();

<참조형태와 실형태가 다를때>
List<Unit> list = new List<Unit>();
list.Add(new Marine());
list.Add(new Zergling());

foreach (Unit unit in list)
{
    unit.Move();
}

(참조형태 == 실형태) 로 관리할때는 문제가 안생김

 

근데 실형태를 참조형태(부모형태)로 관리하려고 할 때 문제가 생김

Unit은 Unit부분만 알고있기 때문

 

Unit 으로 Virtual 키워드가 있는 곳으로 접근했을 때

내가 유닛이지만 실형태랑 다를수있어 그러니 확인해봐

= 실형태에 재정의가 되어있는지 확인해봐라

 

 

추상클래스

  • 직접적으로 객체를 만들지는 못함
  • abstract class로 만듬
  • 주로 상속을 위한 베이스 클래스로 사용
  • abstract 메서드를 만들 수 있지만 자식클래스에서 반드시 구현되어야 함

 

오버라이딩(Overriding)

  • 부모 클래스에서 이미 정의된 메서드를 자식 클래스에서 재정의하는 것
  • 상속 관계에 있는 클래스 간에 발생
    메서드의 이름, 매개변수 및 반환타입이 동일해야 한다
  • 자식은 부모의 메서드를 재정의하여 자신에게 맞는 동작으로 구현 가능

 

오버로딩(Overloading)

  • 동일한 메서드 이름
  • 매개변수의 개수, 타입 또는 순서가 다름
  • 오버로딩을 통해 동일한 이름을 가진 메서드를 다양한 매개변수 조합으로 호출할 수 있습니다.

 

  •  
  •  

📝 오늘의 마무리

이제 본격적인 팀 프로젝트의 시작이다.

오늘 처음으로 제대로 된 회의를 하고 분업까지 깔끔히 됐다.

다같이 3주차 강의를 전부 듣고 나서 본격적으로 프로젝트를 만들기로 했는데

일단 욕심내지 않고 필수구현만 만들기로 했다.

Class로 들어가니까 갑자기 급격하게 외워야 할 것, 이해 할 것이 굉장히 많아졌다.

이거를 자판기마냥 내뱉을 수 있는 날이 왔으면 좋겠다.


 

✏️ 스스로 어제보다 한 발 더 나아갔다는 것을 자각하기

✏️ TIL을 쓰기 위해서라도, 오늘 반드시 단 하나라도 배우기

✏️ 꾸준히 기록을 남기는 습관 가지기

 

📕 오늘의 학습 키워드

📕  공부한 내용 본인의 언어로 정리하기

📕  오늘의 회고

📕  12시간 중 얼마나 몰입했는지

📕  더 나은 미래를 위해 내일 어떤 공부를 진행할 것인지