기획에 이어 개발 교육에 들어간 3번째 주.
요번 주는 C#에 대한 이론 수업에 들어갔다. 이전에 파이썬을 배우기는 했지만, C#은 파이썬과 다른 점이 많다고 들어서 조금 두렵기도 했지만, 그보다 더 많이 설레는 마음으로 수업에 임하기로 했다.
참고로 이번 주부터는 각 수업에서 중요한, 어려웠던 내용들만 정리하도록 하겠다!
Starters 부트캠프 3주 1일차 수업 - 2022. 07. 04
1일차 수업에서는 C#의 기본적인 개념들을 짚고 넘어가셨다.
모든 언어에서 기본적으로 이해가 필요한 부분과 C#에서 특별히 다른 부분까지 살펴보셨는데, 내가 배운 파이썬과 또 다른 내용들이 많아서 어려운 점이 많았다.
왜 C#을 사용하는가?
C#을 배우기 전에 왜 C#을 사용하는지에 대해 얘기해주셨다.
C#은 마이크로소프트의 공통 언어 기반의 표준의 기능인 CLR(Common Laguage Runtime) 가상 머신을 사용하는 언어이다. CLR은 자바의 VM과 유사한 역할을 하는데, C#, C++ 등의 소스코드를 다양한 OS 위에 있는 .NET Framework에서 작동하도록 해준다.
C#, VB.NET, 다른 .NET 언어들 |
CLR (Common Language Runtime) |
.Net Framework |
OS (Window, Linux 등) |
하드웨어 |
사실, 그렇다고 C#이 처음부터 다양한 OS에서 돌아갔던 것은 아니었다.
처음에는 윈도우에서만 지워하였다가 이후 'Mono Multi Platform' 프레임워크를 통해서 현재처럼 다양한 OS에서 사용할 수 있게 되었다.
변수
C#에서 변수는 보통 '명사'에 해당하는 개념들을 지시하는 참조자라고 했다.
여기서 중요한 것은 실제 존재하는 것(오브젝트)이 아니라 참조자라는 것이다.
int i = 10;
// i라는 변수가 실제 10의 값이라기 보다는 10을 가리키고 있는 참조자
부동 소수점과 고정 소수점 (Float vs Deciaml)
IEEE 754 표준에 따라서 숫자를 가수 x 밑수(지수)로 표현할 때에...
고정 소수점은 지수 부분을 먼저 고정시키는 방식으로 예를 들어 32비트 메모리에서 8비트를 지수로 사용하면, 보호 비트(+와 -의 기호를 표시하는) 1비트를 제외한 나머지를 저절로 가수로 사용하게 된다.
지수를 크게 잡으면....
→ 소수점을 이하의 값을 더 세밀하게 표현할 수있지만, 큰 숫자 값을 표현할 수가 없다.
지수를 작게 잡아서 가수가 커지면....
→ 더 큰 숫자까지 표현할 수 있지만, 정밀한 값을 표현하기가 힘들어진다.
하지만, 위 박스의 내용처럼 크고, 세밀한 값을 표현하는데 어디 하나 부족한 부분이 있다 보니.. 불편함이 생기고, 그 이유로 '부동 소수점'이 등장하게 된다.
부동 소수점은 가수 값을 먼저 받고 남은 부분을 지수 메모리로 사용하는 방법으로 가수와 지수의 메모리 경계가 떠다닌다고 하여(浮, 떠다닐 부 == Float) '부동 소수점'이라는 이름을 가지게 되었다.
물론 가수를 무지막지하게 써버리면, 실제 값과 오차가 생기는 고정 소수점보다 못한 점도 있기는 하지만, 보통의 경우는 '부동 소수점'을 더 많이 사용하게 된다. (금융권과 같이 오차 없는 아주 정밀한 값을 요구하는 특수한 환경에서는 '고정 소수점'(Decimal)을 더 많이 쓰기도 함)
논리 연산자
^(XOR)은 앞뒤의 bool 값이 다른 경우에만 true(참)을 도출하는 논리 연산자이다.
^(xor)
true ^ false → true
false ^ true → true
true ^ true → false
false ^ false → false
&&와 &는 앞 뒤의 값이 모두 true일 때에만 참을 도출하는 연산자이다.
둘의 차이점은 &&는 앞이 거짓인 경우 뒤의 값을 보지도 않고, false를 리턴하는 반면, &는 앞의 값이 거짓이어도, 뒤의 값까지 일단 체크한 뒤에 false를 리턴한다는 점이다.
||와 | 역시 비슷한 맥락으로 둘 다 앞이나 뒤 중에서 하나만 true여도 true를 리턴하지만, |는 ||와 다르게 앞이 true여도 뒤의 값까지 한 번 보고 true를 리턴한다.
&& vs &
false && Instantiate(‘Enemy’); → 앞에 false네 그냥 무시
false & Instantiate(‘Enemy’); → 앞에 false여도 일단 뒤에 있는 것도 실행하자
true || false → 앞에가 true네. 뒤에 거 볼 필요도 없이 true!
true | false → true이기는 하지만 그래도 뒤에 것도 보자
명시적 형변환과 암시적 형 변환 (Casting)
int값에서 float, float에서 double 값으로 변환하는 것은....
int a = 1;
float b = a;
// --> 별 문제없이 잘 실행되고, float타입으로 알아서 형변환이 일어남. (암시적 형변환)
하지만, 반대로 float에서 int, double에서 float으로 변환하는 경우에는....
float i = 3.14;
int z = i;
// 에러 발생
왜 에러가 날까?
잘 생각해보면 쉽다. 예를 들어 정수 1의 값은 실수로 바꿀 때에 1.00000...으로 표현할 수 있지만, 3.14라는 실수의 값을 정수로 완벽하게 바꿀 수 있을까? 정수로 바꾼 3이라는 값에는 0.14만큼의 손실이 발생하고, 결국 같은 값이 아니게 되므로 우리는 이런 경우에 '명시적 형 변환'을 사용하게 된다. (다만, 표현할 수 있는 범위를 초과해서 바꾸는 경우에는 여전히 에러가 날 수 있다.)
float i = 3.14;
int z = (int)i;
// 명시적 형변환
다차원 배열과 가변길이 배열
다차원 배열
1차원 이상의 배열을 의미하는 것으로 다음과 같이 선언한다.
public float[,] _nFloatArray = new float[,]
{
{1f,2f,3f,4f,5f},
{1f,2f,3f,4f,5f}
};
가변 길이 배열
가변 길이 배열은 비슷해 보이지만, 각각 내부의 배열들의 길이가 일정하지 않은 배열을 의미한다.
public float[][] _nFloatArray2 = new float[5][]
{
new float[] {1f, 2f,3f,4f,5f},
new float[] {6f,7f,8f,9f,10f},
new float[] {6f},
new float[] {6f},
new float[] {6f}
};
배열에서 주의해야할 점 (feat. Unity)
예를 들어 캐릭터가 가지고 있는 펫들의 active를 false로 바꾸는 코드가 있다고 하자.
for (var i = 0; i < this.transform.childCount; i++)
{
transform.GetChild(i).gameObject.SetActive(false);
}
이 경우에는 정상적으로 작동하지만, 만약 false가 아니라 아예 게임상에서 오브젝트를 삭제시키면 어떻게 될까?
for (var i = 0; i < this.transform.childCount; i++)
{
Destroy(transform.GetChild(i).gameObject);
}
해당 코드에서는 오브젝트가 삭제되면서 for문 도중에 childcount의 전체 길이가 줄어들어 오류가 날 수가 있게 된다. 그럴 경우에는 아래의 코드처럼 하면 해결이 된다.
for (var i = this.transform.childCount; i > -1; i--)
{
Debug.Log(i);
Debug.Log(this.transform.childCount);
Destroy(transform.GetChild(i).gameObject);
}
enum : 열거형
예를 들면 게임에서 몬스터 클래스에서 몬스터의 속성, 타입 등을 지정하는 데에 사용하는 것이 바로 enum(열거형 오브젝트)이다.
enum MyEnum
{
red = 0000,
blue = 0010,
yellow = 0100,
}
private MyEnum _enum;
switch (_enum)
{
case MyEnum.red:
Debug.Log("Color is red");
break;
case MyEnum.blue:
Debug.Log("Color is blue");
break;
case MyEnum.yellow:
Debug.Log("Color is yellow");
break;
}
삼항 연산자
자 damage의 값을 주는데 어떠한 조건이 있다고 할 때에 우리는 보통 if문을 돌려서 damage에 값을 조건에 따라 다르게 넣는다.
int damage;
if (_enum == MyEnum.red)
{
damage = 10;
}
else
{
damage = 5;
}
삼항 연산자를 쓰면, 이런 식으로 아주 효율적으로 바꿀 수 있다.
int damage = _enum == MyEnum.red ? 10 : 5;
Starters 부트캠프 3주 2일차 수업 - 2022. 07. 08
2일차 수업에서는 객체지향 그리고, 클래스와 메서드에 대한 내용을 가르쳐주셨다.
이 내용부터는 조금 들어봤거나 일부 알았을 뿐, 제대로 배운 적 없는 내용들이라 상당히 어려운 내용들이 많았다.
객체지향 언어란?
클래스
어떤 문제를 해결하고, 데이터를 만들기 위해서(인스턴스) 추상화를 한 것이다.
원래 자료형과 다소 차이는 있지만, (사용자가 정의한) 자료형이기도 하다.
클래스는 속성과 메서드를 가지고 있다.
객체화
클래스를 인스턴스화 시킨 것이 객체화이다.
인스턴스 : new int[10] 같은 것
예시) person이라는 클래스에 속하는 객체인 나 → 인스턴스화로 나를 찍어낼 수 있음
객체지향 언어
붕어빵 틀(클래스)로 붕어빵(객체)을 생산하는 것이 객체화(인스턴스화)라면, 객체지향 언어는 그 객체화를 통해 생성한 객체들을 가지고 관계들을 맺음으로 코딩을 해나가는 언어라고 생각하면 된다.
클래스를 생성하는 방법
이전에 해당 클래스를 선언 뒤에 아래와 같이 작성하면 클래스를 생성할 수 있다. → 인스턴스화
Champion a = new Champion();
// 클래스명(Champion) 자체가 참조형이 됨
// new : 생성자 호출 키워드
// Champion() : 생성자
참고로 클래스는 new를 붙여 생성하므로 '참조형' 자료형이고, 반대로 new(생성자 호출 키워드)가 안 붙은 것은 '값형' 자료형이다.
추상화가 무엇인가?
우리가 쓰고자 하는 내용만 뽑아내는 것으로 예를 들면, 다음과 같다.
챔피언 → HP, MP 등의 스테이터스 중에 필요한 것만 뽑는 것
클래스는 전체 게임(프로그램)에서 필요한 것 중에서 필요한 요소(스탯)를 골라서 묶어 추상화한 것이다.
속성과 행위
클래스에 들어 있는 객체들의 두 타입으로 보통 아래와 같이 쉽게 구분할 수 있다.
속성(attribute) : '명사'인 변수들을 담음
- 캐릭터
- a대미지 10
행위(behavior) : '동사'인 메서드
- 공격한다.
- 받는다.
속성
값을 다른 곳에서 수정할 수 있는지 없는지에 따라 제한을 두면서 속성을 선언할 수 있다.
private int _hp { get; set; };
// public int Hp { get; private set; } 이렇게 하면 get만 하게 할 수 있다.
public int HP
{
get
{
return _hp; // get에는 return 필수
}
private set
{
if (value < 0) // 값이 들어오는 것은 예약어 value에 들어옴
{
value = 0;
}
_hp = value; // set에서는 value도 필수
}
}
메서드
선언하는 방법
public int Add(int a, int b) { //실행할 내용 }
접근한정자반환형(리턴형) 메서드이름 매개변수 { 실행할 코드 (필요시 return) } 순으로 선언하면 된다.
예시
public int Add(int a, int b)
{
return a + b;
}
// 메서드 해석(?) : int a와 b 라는 입력 값을 a+b의 int 형으로 반환 받는데 public으로 받는다.
// input(입력) : a, b
// return(출력) : a+b
위의 메서드는 int라는 리턴형이 있기 때문에 return을 반드시 해주어야 한다. 하지만, void의 경우에는 따로 return 할 무언가가 필요하지 않고, 코드만 실행된다.
public void MyLog(string logMsg)
{
Debug.Log(logMsg);
}
오버 로딩
반환형과 매개 변수만 다르고 같은 내용의 메서드를 만들어야 할 경우, 귀찮게 새로운 이름을 지정할 필요 없이 다음과 같이 오버 로딩하면 된다.
public float Add(float a, float b)
{
// 대충 둘이 내용은 같음
}
public int Add (int a, int b)
{
// 대충 둘이 내용은 같음
}
다만, 매개변수 형이 같은데 위처럼 사용했다가는.. 중복된 이름이라며 에러가 나게 되므로 항상 매개변수가 다른 상황에서만 오버 로딩하도록 해야 한다.
팁으로 오버 로딩된 함수들은 vscode 등에서 함수를 쓸 때에 툴팁으로 두 가지가 다 나온다고 한다.
접근 제한자 (한정자)
어떠한 객체가 어디까지 접근이 가능한지 정해주는 기능을 하는 것이 바로 '한정자'로 C#에는 Public, Private, Internal, Protected 네 가지가 있다.
접근 가능 여부 | 외부 어셈블리 | 같은 어셈블리 내 외부 클래스 | 상속 받은 클래스 및 구조체 | 해당 클래스 및 구조체 |
public | O | O | O | O |
internal | X | O | O | O |
protected | X | X | O | O |
private | X | X | X | O |
만약, private 한정자를 public으로 바꾸기는 싫은데 유니티 인스펙터에서 수정하고 싶다면.....
[SerializeField]
private int a;
이런 식으로 작성하면 된다.
생성자와 소멸자
클래스 등을 여러 개 케이스로 생성하고 싶을 때에 생성자를 사용한다.
보통 클래스 등을 생성할 때에도 사용하게 된다.
// case 01
Champion ch = new Champion();
// case 02
public Champion(int hp, int mp) ← class와 같은 이름 (매개변수에 원하는 스테이터스),
{
_hp = hp;
_mp = mp;
}
반대로 소멸자는 생성자를 메모리에서 없애는 것으로 보통 C#에서는 자동으로 처리해주기 때문에 크게 쓸 일은 없다.
~Champion()
{
_hp = 0;
_mp = 0;
}
상속과 다형성
상속은 상위 객체에 구현되어 있는 것을 자식 객체가 가져오는 것을 뜻한다.
참고로 using은 상속과는 다른 것이다.
using은 라이브러리를 가져오는 데 쓰는 것인데, 상속은 부모 객체에서 원하는 부분만 골라서 가져오게 된다.
상속의 예시
챔피언이라는 클래스가 있다고 생각해보자.
해당 챔피언 클래스에는 여러 챔피언의 하위 클래스가 존재한다.
ex ) 아리 : 속력(명사 → 속성으로 들어감) 2, 이동하기 (동사 → 함수)
class Ahri : champion // champion 클래스를 상속하겠다는 뜻
{
move() { } // 속력 2 (명사)
skill(){ } // Q W E R
}
참고로 만약 부모 객체 안에서 virtual move()로 바꾸면 부모 자체에 move()라는 메서드를 자식들을 통해서 바꾼다는 것을 뜻한다고 한다.
(재정의를 함 → new or override)을 암시
- 이런 식으로 상속을 하면, 만약 respawn()이라는 메서드가 Champion 클래스에만 있어도 ahri 등의 자식 클래스에서 new를 통해 호출 가능하다.
Starters 부트캠프 3주차 후기
요번 주는 뭔가 배운 내용만 엄청 정리한 것 같은데.. 사실 중간중간 배운 내용을 활용하는 과제들도 많았다.
강사님께서 직접 유니티에서 시각적으로 보일 수 있는 과제들을 만들어 주시고, 과제로 제출해야 하는 cs파일의 특정 부분에 정답을 써넣으면 유니티로 답을 확인할 수 있게 해 주셨다.
해당 이미지는 2일차 과제를 유니티 콘솔 창으로 확인하는 사진이다.
과제의 내용은 위의 상속을 이용해 롤의 ddragon api의 각 챔피언 내용들을 Champion클래스의 하위 클래스로 넣는 것이었는데.. 아직 많이 배워야 하는 걸 느끼면서도 새로운 것들을 많이 알게 되어 신나기도 하였다.
유데미 코리아 바로가기 :
Udemy Korea - 실용적인 온라인 강의, 글로벌 전문가에게 배워보세요. | Udemy Korea
유데미코리아 AI, 파이썬, 리엑트, 자바, 노션, 디자인, UI, UIX, 기획 등 전문가의 온라인 강의를 제공하고 있습니다.
www.udemykorea.com
💡 본 포스팅은 유데미-웅진씽크빅 취업 부트캠프 유니티 1기 과정 후기로 작성되었습니다.
'Starters 부트캠프 > B - log' 카테고리의 다른 글
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 6주차 학습 일지 (2) | 2022.07.30 |
---|---|
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 5주차 학습 일지 (2) | 2022.07.24 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 4주차 학습 일지 / 유데미 [C#과 Unity로 3D 게임 개발하기] 강의 리뷰 (4) | 2022.07.16 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 2주차 학습 일지 (1) | 2022.07.03 |
유데미 스타터스 유니티 개발자 취업 부트캠프 1기 - 1주차 학습 일지 (13) | 2022.06.25 |