1. 산술 연산자

산술연산자는 기본적이면서 가장 사용 많이 되는 사칙연산입니다.  기본적인 사칙연산과 나머지 계산(%)가 산술연산자입니다. 우선순위는 사칙연산 법칙과 같이 곱하기, 나누기, 나머지 계산이 먼저 그 다음 더하기,빼기가 우선순위가 됩니다. 연산자의 종류는 아래와 같습니다. (아래의 예제는 a: 20, b: 10)

연산자 표기 예제
더하기 + c = a + b      // 결과 : 30
빼기 - c = a - b      // 결과 : 10
곱하기 * c = a * b     // 결과 : 200
나누기 / c = a / b     // 결과 : 2
나머지 계산 % c = a % b  // 결과 : 0

※ 예제

int a = 1;
int b = 2;
int c = 4;
int d = 4;

Console.WriteLine(a + b);           // 3
Console.WriteLine(a - b);           // -1
Console.WriteLine(c * a - d);       // 0
Console.WriteLine(d * (c - b));     // 8
Console.WriteLine(b / (c- d));      // Error : DivideByZeroException 발생

5번째 같은 경우는 0나누기 오류가 발생하여 에러가 발생하게 됩니다. 연산은 0으로 값을 나누기를 할 수 없어  오류를 발생 시킵니다. 위와 관련하여 나중에 예외처리(Exception)에서 추가적으로 설명 드리겠습니다. 

나머지는 기존 연산과 동일하게 동작을 합니다. 그리고 괄호를 사용하여 우선순위를 변경 할 수 있습니다. 일반적인 사칙 연산과 동일합니다. 

2. 대입 연산자

우리가 평소 수학에서 '='은 같다를 의미하지만 컴퓨터에서 '='은 대입을 의미합니다. 이전 포스팅 변수에서 보시면 변수에 값을 대입하기 위하여 '='를 사용하였습니다. 대입 연산자의 종류는 아래와 같습니다. 

대입 연산자 설명 예제
=  왼쪽에 있는 변수에 값을 대입 a = b
+=  왼쪽에 있는 값과 오른쪽에 있는 변수 또는 데이터를 덧셈 후 왼쪽에 있는 변수에 대입  a += b (a = a +b)
-=  왼쪽에 있는 값과 오른쪽에 있는 변수 또는 데이터를 뺼셈 후 왼쪽에 있는 변수에 대입 a -= b (a = a -b)
*=  왼쪽에 있는 값과 오른쪽에 있는 변수 또는 데이터를 곱셈 후 왼쪽에 있는 변수에 대입 a *= b (a = a * b)
/=  왼쪽에 있는 값과 오른쪽에 있는 변수 또는 데이터를 나눗셈 후 왼쪽에 있는 변수에 대입 a /= b (a = a / b)
%=  왼쪽에 있는 값과 오른쪽에 있는 변수 또는 데이터를 나머지 연산 후 왼쪽에 있는 변수에 대입 a %= b (a= a % b)

※ 예제

int a = 3;
int b = 2;

b = a;
Console.WriteLine(b);      // 3
b += 2;
Console.WriteLine(b);      // 5
b -= 2;
Console.WriteLine(b);      // 3
b *= 3;
Console.WriteLine(b);      // 9
b /= 3;
Console.WriteLine(b);      // 3
b %= 2;
Console.WriteLine(b);      // 1

3. 증감 연산자

증감 연산자는 1씩 증가 또는 감소 시키는 연산자입니다. 증감 연산자의 위치에 따라 순서와 결과가 다릅니다. 

증감 연산자 설명
a++ 값을 1 증가시킨 후에 연산을 진행
++a 연산을 진행 후 값을 1 증가 시킴
a-- 값을 1 감소시킨 후에 연산 진행
--a 연산을 진행 후 값을 1 감소 시킴

※ 예제

int a = 3;
int b = 2;

int result;

result = a++ + b;
Console.WriteLine(result);      // 5
Console.WriteLine(a);           // 4

4. 비교 연산자

비교 연산자는 두 값의 크기를 비교하는 연산자입니다. 결과는 참 또는 거짓을 나타냅니다. 

비교 연산자 설명
==  왼쪽 변수와 오른쪽 변수가 같으면 True 틀리면 False를 반환
!=  왼쪽 변수와 오른쪽 변수가 다르면 Ture 같으면 False를 반환
>  왼쪽 변수가 오른쪽 변수보다 크면 True 작거나 같으면 False를 반환
>=  왼쪽 변수가 오른쪽 변수보다 크거나 같으면 True 작으면 False를 반환
<  왼쪽 변수가 오른쪽 변수보다 작으면 True 크거나 같으면 False를 반환
<=  왼쪽 변수가 오른쪽 변수보다 작거나 같으면 True 크면 False를 반환

※ 예제

int a = 4;

Console.WriteLine(a==4);    // True
Console.WriteLine(a!=4);    // False

Console.WriteLine(a>4);    // False
Console.WriteLine(a>=4);   // True

Console.WriteLine(a<4);    // False
Console.WriteLine(a<=4);   // True

5. 논리 연산자

논리 연산자는 And와 Or, Not 연산에 대하여 표현합니다.

논리 연산자 설명
&& 왼쪽과 오른쪽이 모두 True일 경우 True 반환 아니면 False 반환
|| 왼쪽 또는 오른 쪽이 True 일 경우 True를 반환  아니면 False 반환
! 논리 값에 반대 되는 값을 반환 

※ 예제

bool a = True;
bool b = False;


Console.WriteLine(a && b);    // False
Console.WriteLine(a || b);    // True
Console.WriteLine(!a);        // False

6. 비트 연산자

비트 연산자는 논리 연산자와 비슷하지만, 비트(bit) 단위로 논리 연산을 할 때 사용하는 연산자입니다.

비트 연산자 설명
&  대응 되는 비트가 모두 1이면 1을 반환
|  대응 되는 비트가 하나라도 1이면 1을 반환
^  대응 되는 비트가 서로 다르면 1을 반환 
~  비트가 1이면 0 , 0 이면 1로 반환
<< 지정한 수만큼 비트들을 전부 왼쪽으로 이동
>> 지정한 수만큼 비트를 전부 오른쪽으로 이동

※ 예제

int a = 8;

Console.WriteLine(a<<1);    // 16
Console.WriteLine(a>>1);    // 4

8은 2진수로 표현을 하면 1000입니다. 1000을 왼쪽으로 한칸씩 이동하게 되면 10000이 됩니다. 10000은 10진수로 다시 바꾸면 16이 되게 됩니다. 오른쪽으로 이동하게 되면 100이 됩니다. 100은 10진수로 4가 됩니다.

7. 삼항 연산자

삼항연산자의 구조는 조건식 : 참일떄 값? 거짓일때 값 이렇게 구성이 됩니다. 

※ 예제

int a = 2;
int b = 3;

int c = (a==b)? a: b;

Console.WriteLine(c);     //3

삼항 연산자는 비교 연산을 하고 True와 False의 조건에 따라 결과값을 다르게 연산됩니다. 


?? 연산자

?? 연산자는 Null-coalescing operator라고 불리우는 특별한 연산자로서 C# 3.0 이상에서 지원하는 연산자이다. ?? 연산자는 ?? 왼쪽 피연산자의 값이 NULL인 경우 ?? 뒤의 피연산자 값을 리턴하고, 아니면 그냥 ?? 앞의 피연산자 값을 리턴한다. ?? 연산자는 왼쪽 피연산자가 NULL이 허용되는 데이타 타입인 경우에만 사용된다. 예를 들어, int 타입은 NULL을 가질 수 없으므로 허용되지 않지만, Nullable<int> 즉 int? 타입은 허용된다.

int? i = null;
i = i ?? 0;

string s = null;
s = s ?? string.Empty;



'c# 기초 문법' 카테고리의 다른 글

c# 두 변수의 값 바꾸기(Swap)  (0) 2024.08.01
c# + 연산의 추가기능  (0) 2024.08.01
c# 형변환  (0) 2024.08.01
문자열 보간(String interpolation)  (0) 2024.08.01
c# 배열  (0) 2024.07.31

C#에서 형변환방법

형변환은 한 데이터 타입을 다른 타입으로 변환하는 과정을 말하며, 형변환 방법은 다음 예시처럼 다양한 방법이 있습니다.

1. 명시적 형변환(Explicit Casting)

double doubleVal = 11.5;
int intValue = (int)doubleVale; // 명시적으로 double을 int로 변환

Console.WriteLine(intValue); // 출력 결과: 11

2. 암시적 형변환 (Implicit Casting)

int intValue = 10;
double doubleValue = intValue; // 암시적으로 int를 double로 변환

Console.WriteLine(doubleValue); // 출력 결과: 10.0

3. is 연산자

object obj = "Hello";

if (obj is string) // obj가 string 타입인지 확인
{
Console.WriteLine("obj는 string 타입입니다.");
} else {
Console.WriteLine("obj는 string 타입이 아닙니다.");
}

4. as 연산자

code object obj = "Hello";

string str = obj as string; // obj를 string으로 변환하여 할당, 실패할 경우 null 반환

if (str != null)
{
Console.WriteLine("obj를 string으로 변환했습니다.");
}
else
{
Console.WriteLine("obj를 string으로 변환할 수 없습니다.");
}

5. Convert 클래스

double doubleValue = 10.5;
int intValue = Convert.ToInt32(doubleValue); // Convert 클래스를 사용하여 double을 int로 변환

Console.WriteLine(intValue); // 출력 결과: 10

6. Parse 메서드

csharp Copy code string numberString = "10"; int intValue = int.Parse(numberString); // Parse 메서드를 사용하여 문자열을 int로 변환 Console.WriteLine(intValue); // 출력 결과: 10

string numberString = "10";
int intValue = int.Parse(numberString); // Parse 메서드를 사용하여 문자열을 int로 변환

Console.WriteLine(intValue); // 출력 결과: 10

위 예제들은 다양한 형변환 방법을 보여줍니다.

각각의 방법은 특정 상황에 적합하며, 데이터의 유형과 변환하는 방향에 따라 적합한 방법을 사용해야 합니다.


 

C#에서 형변환이 필요한 경우

C#에서 형변환은 다음과 같은 경우에 필요합니다.

1. 데이터 유형이 다른 변수에 값을 할당할 때

int num1 = 100;
double num2 = num1; // 암시적 형변환

string str = num2.ToString(); // 명시적 형변환

위 코드에서 num1은 int형 변수이고 num2는 double형 변수입니다.

num1 값을 num2에 할당하려면 암시적 형변환이 발생합니다.

암시적 형변환은 데이터 손실이 발생하지 않는 경우에만 자동으로 수행됩니다.

num2 값을 str 문자열 변수에 할당하려면 명시적 형변환이 필요합니다.

명시적 형변환은 () 연산자를 사용하여 수행합니다.

 

2. 함수 또는 메서드의 매개변수와 인수의 데이터 유형이 다른 경우

void PrintNumber(int num)
{
    Console.WriteLine(num);
}

double num1 = 3.14;
PrintNumber(num1); // 명시적 형변환

위 코드에서 PrintNumber 함수는 int형 매개변수를 가지고 있습니다.

num1은 double형 변수입니다.

PrintNumber 함수에 num1 값을 전달하려면 명시적 형변환이 필요합니다.

 

3. 연산의 피연산자의 데이터 유형이 다른 경우

C# int num1 = 10; double num2 = 3.14; double result = num1 + num2; // 암시적 형변환

int num1 = 10;
double num2 = 3.14;

double result = num1 + num2; // 암시적 형변환

위 코드에서 num1은 int형 변수이고 num2는 double형 변수입니다.

+ 연산을 수행하려면 두 피연산자의 데이터 유형이 동일해야 합니다.

암시적 형변환은 num1을 double형으로 변환하여 연산을 수행합니다.

 

4. 형식 검사 및 캐스팅

C# object obj = 10; if (obj is int) { int num = (int)obj; }

object obj = 10;

if (obj is int)
{
    int num = (int)obj;
}

위 코드에서 obj는 object형 변수입니다.

obj가 int형인지 검사하고 int형이면 num 변수에 할당합니다.


형변환을 사용할 때 주의해야 할 점

C#에서 형변환을 사용할 때 다음 사항을 주의해야 합니다.

 

1. 데이터 손실

형변환은 데이터 유형을 변환하는 과정으로 데이터 손실이 발생할 수 있습니다.

예를 들어, int형 값을 byte형 값으로 변환하면 값의 일부가 손실될 수 있습니다.

 

2. 코드 가독성

형변환을 사용하면 코드의 가독성이 나빠질 수 있습니다.

특히, 명시적 형변환을 사용하면 코드가 복잡해지고 이해하기 어려워질 수 있습니다.

 

3. 런타임 오류

 형변환이 잘못 수행되면 런타임 오류가 발생할 수 있습니다.

일례로 null 값을 int형 값으로 변환하려고 하면 런타임 오류가 발생합니다.

따라서 형변환은 필요한 경우에만 사용해야 하고, 주의해서 사용해야 합니다.

 

다음은 형변환을 사용할 때 주의해야 할 점을 보여주는 예입니다.

 

- (예시 1) 코드 스니펫

int num1 = 100;
byte num2 = num1; // 데이터 손실 가능성 있음

위 코드에서 num1은 int형 변수이고 num2는 byte형 변수인데 num1 값을 num2에 할당하면 데이터 손실이 발생할 수 있습니다.

 

- (예시 2) 코드 스니펫 

object obj = null; int num2 = (int)obj; // 런타임 오류 발생 가능성

 

위 코드에서 obj는 object형 변수이고 num2는 int형 변수입니다.

obj 값이 null인 경우 int형 값으로 변환하려고 하면 런타임 오류가 발생합니다.


지금까지 살펴본 바와 같이 C#에서 형변환은 프로그래밍에서 빈번하게 사용되지만, 신중하게 다뤄져야 하는 중요한 주제입니다.

암시적 형변환과 명시적 형변환을 올바르게 구분하고, 데이터 손실을 최소화하는 데 주의를 기울여야 합니다.

또한, 형변환을 남용하지 않고 코드의 가독성을 유지하며, 잘못된 형변환으로 인한 런타임 오류를 방지하기 위해 주의 깊게 사용해야 합니다.

형변환은 올바르게 사용될 때 유용한 도구이지만, 오용할 경우 코드의 안정성과 이해도에 영향을 줄 수 있습니다.

따라서 형변환을 사용할 때에는 항상 주의를 기울여야 합니다

출처: https://applecorn.com/entry/C-형변환-방법-및-주의사항 [리치코딩:티스토리]

'c# 기초 문법' 카테고리의 다른 글

c# + 연산의 추가기능  (0) 2024.08.01
c# 연산자  (0) 2024.08.01
문자열 보간(String interpolation)  (0) 2024.08.01
c# 배열  (0) 2024.07.31
c# 변수 및 상수  (0) 2024.07.29

C# 6.0에서 문자열 보간(String interpolation)이라는 기능이 추가되었다.

$ 특수문자는 문자열 리터럴을 보관된 문자열로 식별하는데, 보간 된 문자열이란 보간 식이 포함될 수 있는 문자열 리터럴이다.

기존 String.Format()과 기능은 동일 하지만 더 읽기 쉽고 편리하게 출력 서식을 지정할 수 있다고 한다.

기본적으로 사용은 문자열 앞에 $기호를 추가하면 된다.

$"오늘은 {month}월 {day}일이야."

 

보간 된 문자열의 구조

보간 된 문자열의 구조는 다음과 같다.

{<interpolationExpression>[,<alignment>][:<formatString>]}

대괄호 안의 요소는 선택사항으로, 각 요소들이 의미하는 바는 아래 표와 같다.

요소 설명
interpolationExpression 서식을 지정할 결과를 생성하는 식.
null의 문자열 표현은 String.Empty
alignment 식 결과의 문자열 표현에 최소 문자수를 정의하는 값을 갖는 상수 식
양수: 문자열 표현 오른쪽
음수: 문자열 표현 왼쪽
formatString 식 결과의 형식을 기준으로 지원되는 서식 문자열.
서식 문자열 구성요소 참고

예시:

 
Console.WriteLine($"|{"왼쪽",-7}|{"오른쪽",7}|");
 
 
 
const int FieldWidthRightAligned = 20;
 
Console.WriteLine($"{Math.PI,FieldWidthRightAligned} - 원주율의 기본 형식");
 
Console.WriteLine($"{Math.PI,FieldWidthRightAligned:F3} - 원주율을 소수점 셋째자리까지 나타내기");

결과:

 
|왼쪽 | 오른쪽|
 
3.14159265358979 - 원주율의 기본 형식
 
3.142 - 원주율을 소수점 셋째자리까지 나타내기

 

특수문자

보간 된 문자열에서 중괄호를 사용하고 싶다면 중괄호를 연달아 쓰면 된다.

예시:

 
int age = 34;
 
Console.WriteLine($"public int {age}");
 
Console.WriteLine($"public int {{age}}");

결과:

 
line 2: public int 34
 
line 3: public int age

그리고 조건부 삼항 연산자(?:)도 사용할 수 있는데, 보간 된 문자열의 구조에서 콜론(:)이 특별한 의미를 가지고 있어서 조건식을 괄호로 묶어 사용해야 한다.

예시:

 
int age = 34;
 
Console.WriteLine($"public int {(age >= 30 ? "30":"30대 아님")}");

결과:

30대

'c# 기초 문법' 카테고리의 다른 글

c# 연산자  (0) 2024.08.01
c# 형변환  (0) 2024.08.01
c# 배열  (0) 2024.07.31
c# 변수 및 상수  (0) 2024.07.29
c# 데이터 타입  (0) 2024.07.29

이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의 참조

 

맵 바닥에 색깔 입히기

  1. 맵 바닥을 만들어 주자
    • Hierarchy 창에서 create - 3D object - plane
    • 만들어진 plane 오브젝트를 더블 클릭하여 씬 카메라가 plane 오브젝트를 비추게 하자.
  2. 바닥에 색깔이 되어 줄 Material을 만든다.
    • Project 창의 /Assets 폴더에 마우스 우클 - create - Material 을 하여 Material을 만들어 준다. 이름은 Plane이라고 해주자.
    • Material
      • 마치 물감같은 것.
      • 오브젝트에 붙여주면 오브젝트의 표면의 색을 결정해준다.
      • 쉐이더(빛에 의한 표면) 텍스처(그림 파일)가 합쳐진 것.
    • Inspector 창에서 방금 만든 Plane 이름의 Material 색상을 바꿔준다.
      • 색은 Albedo 속성에서 바꿈.
      • smoothness 속성은 표면의 반들 반들 정도
  3. 만든 Material을 드래그 해서 오브젝트에 드롭해주면 색이 입혀진다.

 

플레이어가 될 ‘구’ 만들기

  1. ‘구’ 오브젝트 생성
    • Hierarchy 창에서 create - 3D object - sphere
    • 이름은 Player로 바꿔주자.
    • 이름은 Inspector 창에서도 바꿀 수 있다.
  2. ‘구’가 ‘plane’에 절반 묻혀있는 이유
    • 구 오브젝트의 좌표 기준이 구의 중앙에 있기 때문에.
  3. plsne 오브젝트의 transform 컴포넌트에서 y.position을 -0.5로 설정해준다. 바닥을 좀 내려서 반쯤 묻혀있는 구를 보이게 해주자.

 

오브젝트에 물리 기능 넣기 : Rigidbody

  • 플레이 버튼을 누르면 중력에 의해 오브젝트가 떨어지게 만드려면 Rigidbody 컴포넌트를 붙여주면 된다.
  • Add Component에서 Rigidbody를 검색
  • 이 컴포넌트가 붙어있는 것만으로도 오브젝트에 물리 기능이 추가되는 셈이다.

 

Collider 컴포넌트

  • 오브젝트를 생성하면 기본으로 붙어있는 디폴트 컴포넌트다.
  • 구 오브젝트에 Rigidbody를 붙여주고 플레이를 누르면 중력을 받아 밑으로 떨어지면서 Plane에 부딪쳐 더 이상 떨어지지 않고 Plane에 붙어있게 되는데 이는 Collider 컴포넌트 때문이다
  • 물리적으로 오브젝트끼리 충돌이 일어났을 때를 감지하고 이를 처리하는 컴포넌트다.

 

플레이어를 위한 C# 스크립트 작성하기

  • 구 오브젝트가 어떤 동작을 하게 할 컴포넌트(스크립트)를 작성해보자.
    • /assets에 create - c# script
    • script 파일의 이름은 반드시 **대문자**로 시작하여야 한다.
      • 클래스는 무조건 대문자로 시작하자고 프로그래머들끼리 한 약속임
      • 변수나 함수는 소문자로 시작하기
  1. 스크립트 작성 후 적용할 오브젝트에 붙여준다.
  2. 오브젝트에 실존하여 붙어있는 컴포넌트를 해당 변수 슬롯에 드래그해 붙여준다.
    • 단 스크립트 내에 실존하는 컴포넌트를 참조할 변수가 public이어야 함.
    • public이 아닌 변수들 은 유니티 인터페이스에서 슬롯이 열리지 않는다. 안 보임.
    • public인 변수들 은 유니티 인터페이스 안에서도 슬롯을 통해 값을 수정할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed = 10f;
    public Rigidbody playerRigidbody; 

    // Start is called before the first frame update
    void Start()
    {
        playerRigidbody.AddForce(0, 10, 0); // 게임이 시작되면 (Start()) y방향으로 10 만큼의 힘을 준다. 플레이어 오브젝트가 하늘로 승천할 것..
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}
  • public Rigidbody playerRigidbody;
    • 추상적인 전체 Rigidbody 컴포넌트가 아닌 진짜 구 오브젝트에 현재 붙어있는 Rigidbody 컴포넌트를 가리킴
    • 슬롯을 통해 실존하는 현재 붙어있는 컴포넌트를 여기 드롭해줄 것이다.
      • public으로 선언해야 유니티에서 드래그 앤 드롭을 할 수 있다.

 

정리

이 챕터에서 새로 알게된 컴포넌트들 정리

  • Transform
    • 오브젝트를 생성하면 기본으로 붙어있는 디폴트 컴포넌트다.
    • 오브젝트의 position, rotation, scale 즉 위치, 회전, 크기를 담당한다.
    • 톱니 바퀴 버튼을 누른 후 Reset을 누르면 오브젝트 위치가 원점으로 돌아간다.
  • Collider 컴포넌트
    • 오브젝트를 생성하면 기본으로 붙어있는 디폴트 컴포넌트다.
    • 구 오브젝트에 Rigidbody를 붙여주고 플레이를 누르면 중력을 받아 밑으로 떨어지면서 Plane에 부딪쳐 더 이상 떨어지지 않는데 이는 Collider 컴포넌트 때문이다
    • 물리적으로 오브젝트끼리 충돌이 일어났을 때를 감지하고 이를 처리하는 컴포넌트다.

이 챕터에서 새로 알게된 Unity Engine제공 집합

  • Mathf
    • 수학과 관련된 함수들 제공

변수

상수

 

'수업일지 > C# 문법' 카테고리의 다른 글

24-08-05 6일차  (0) 2024.08.05
24-08-03 5일차  (0) 2024.08.02
24-08-01 4일차  (0) 2024.08.01
24-07-30 2일차  (0) 2024.07.30
24-07-29 오리엔테이션  (0) 2024.07.29
C# 배열 (Array)

배열은 일련의 동일한 데이타 타입 요소들로 구성된 데이타 집합으로서, 인덱스를 통하여 개개의 배열요소(Element)를 엑세스할 수 있다. C#에서 배열은 Zero-based Array 즉 첫번째 요소가 인덱스 0을 갖는다. 두번째 요소는 인덱스 1, 그 다음 요소들은 인덱스 2, 3, ... 등을 갖는다.

배열의 요소는 Sqaure Bracket([ ])안에 인덱스를 넣어 표시한다. 즉, 배열 A의 첫번째 요소는 A[0] 으로 표시한다.

C# 배열은 1차배열, 2차배열, 3차배열,..., 32차 배열 등 최고 32차 배열을 가질 수 있다. 2차 이상의 다차원 배열은 (1)각 차원별 요소 크기가 고정된 Rectangular 배열과 (2) 각 차원별 크기가 서로 다른 가변배열로 나뉠 수 있다.

다음은 1차 배열과 2차,3차 배열(C-Style의 Rectangular 배열)을 선언하는 예이다. 아래 예제에서 배열 players는 10개의 string 요소를 갖도록 선언되었고, Regions/Depts는 각각 1차,2차 배열이며 초기화 값들을 할당하고 있다. 마지막의 Cubes 는 3차배열을 선언한 예이다.


예제

// 1차 배열
string[] players = new string[10];
string[] Regions = { "서울", "경기", "부산" };

// 2차 배열 선언 및 초기화
string[,] Depts = {{"김과장", "경리부"},{"이과장", "총무부"}};

// 3차 배열 선언
string[,,] Cubes;


가변 배열 (Jagged Array)

다차원 배열에서 각 차원별 배열 요소 크기가 동일한 Rectangular 배열은 C#에서 [,] 와 같이 괄호안에 콤마로 분리하여 (C 언어 스타일) 다차원을 표현한다. 하지만 각 차원별 배열 요소 크기가 가변적인 가변 배열(Jagged Array)의 경우 [][] 와 같이 각 차원마다 괄호를 별도로 사용한다 (Java 언어 스타일).

가변 배열은 배열의 배열(array of arrays)이라 불리우는데, 첫번째 차원의 크기는 컴파일 타임에 확정되어야 하고, 그 이상 차원은 런타임시 동적으로 서로 다른 크기의 배열로 지정할 수 있다. 이러한 가변 배열은 각 차원별 배열 요소가 불규칙하여 Rectangular 배열처럼 고정된 크기를 사용하면 메모리의 낭비가 심한 경우에 사용하면 유용하다.


예제

//Jagged Array (가변 배열)
//1차 배열 크기(3)는 명시해야
int[][] A = new int[3][];

//각 1차 배열 요소당 서로 다른 크기의 배열 할당 가능
A[0] = new int[2];
A[1] = new int[3] { 1, 2, 3 };
A[2] = new int[4] { 1, 2, 3, 4 };

A[0][0] = 1;
A[0][1] = 2;

 
C# 배열의 사용

C# 배열은 각 요소를 인덱스를 사용하여 엑세스한다. 예를 들어 Regions 배열의 첫번째 요소는 Regions[0]으로, 두번째 요소는 Regions[1]로 표시된다.

모든 C# 배열은 내부적으로 .NET Framework의 System.Array에서 파생된 것이다. 따라서, System.Array의 메서드, 프로퍼티를 사용할 수 있다.
 


다음 예제는 점수 배열(scores)을 하나 하나 엑세스하면서 총합을 구하는 예이다. 아래 예제에서 배열 scores의 사이즈를 구하기 위하여 scores.Length 처럼 .Length 속성을 사용하였는데, 이는 System.Array 클래스에 정의된 속성이다.


예제

static void Main(string[] args)
{
    int sum = 0;
    int[] scores = { 80, 78, 60, 90, 100 };
    for (int i = 0; i < scores.Length; i++)
    {
        sum += scores[i];
    }
    Console.WriteLine(sum);        
}

C# 배열의 전달

C#에서 배열 전체를 전달하기 위해서는 보내는 쪽에서는 배열명을 사용하고, 받는 쪽에서 동일한 배열타입의 배열을 받아들이면 된다.

배열은 레퍼런스(Reference) 타입이기 때문에, 배열을 다른 객체나 메서드에 전달할 때, 직접 모든 배열 데이타를 복사하지 않고, 배열 전체를 가리키는 참조 값(Reference pointer)만을 전달한다. 즉, 전달하는 쪽에서는 단순히 레퍼런스인 배열명을 사용하며, 받는 쪽에서는 아래 예제와 같이 배열 데이타 타입 및 배열 파라미터명을 사용한다.


예제

static void Main(string[] args)
{            
    int[] scores = { 80, 78, 60, 90, 100 };
    int sum = CalculateSum(scores); // 배열 전달: 배열명 사용
    Console.WriteLine(sum);        
}

static int CalculateSum(int[] scoresArray) // 배열 받는 쪽
{
    int sum = 0;
    for (int i = 0; i < scoresArray.Length; i++)
    {
        sum += scoresArray[i];
    }
    return sum;
}

'c# 기초 문법' 카테고리의 다른 글

c# 형변환  (0) 2024.08.01
문자열 보간(String interpolation)  (0) 2024.08.01
c# 변수 및 상수  (0) 2024.07.29
c# 데이터 타입  (0) 2024.07.29
c# 프로그래밍 언어  (0) 2024.07.29

VS

HelloWorld

 

Unity 프로젝트 생성

 

 

HelloWorld 폴더 생성 -> FileNew 스크립트생성

C# 스크립트 만들기

  • Project 창에서 Create - C# Script
  • 새 스크립트를 만든 후 열어준다.
  • 스크립트 또한 컴포넌트다. 사용자 지정 컴포넌트나 마찬가지.
  • 스크립트 생성하면 있는 디폴트 코드

 

스크립트 안에 "Hello World" 출력문 적기

  • using UnityEngine;
    • 유니티 엔진에서 제공하는 코드를 사용할 것.
  • public class NewBehaviourScript : MonoBehaviour
    • 모든 컴포넌트들은 MonoBehaviour을 상속 받아야 유니티로부터 메세지를 받을 수 있다.
  • void Start()
    • 게임이 실행될 때 유니티는 가장 먼저 Start 메세지부터 브로드캐스팅 한다.
    • 게임이 실행되자마자 이 컴포넌트가 실행할 내용.
    • 게임 시작될 때 딱 한번 실행 됨.
    • 따라서 컴포넌트를 초기화하는 내용이 주로 들어간다.
  • void Update()
    • 매 프레임마다 계속해서 실행되는 부분
    • 게임 내내 계~속 실행되야 하는 컴포넌트라면 이 부분을 작성해야 함.

 

콘솔 출력

  • Debug.Log를 사용한다. using한 UnityEngine에 들어있다. 유니티 인터페이스의 Console창에 문자열이 출력된다.
  • Unity Console창에서 Clear on Play하면 이전에 쌓여있던 과거의 로그들이 정리된다.
  • Unity 에서 플레이 버튼을 누르면 Debug.Log로 입력한 문자열들이 콘솔에 출력될 것이다!
Debug.Log("유니티의 Console 창에 출력할 내용");
Debug.Log("Hello, World!");

스크립트를 오브젝트에 붙이기

스크립트를 드래그 해서 Hierarchy창의 해당 오브젝트에, 혹은 오브젝트 클릭 후 Inspector 창의 오브젝트에 대고 드롭 해주면 된다. 스크립트도 컴포넌트기 때문에 이렇게 오브젝트에 붙여주면 스크립트 내용대로 오브젝트가 기능하게 된다.

 

주석 처리 

컨트롤+/ 한줄 주석 (확장프로그램설치함)

 

컨트롤 + K , 컨트롤 + U

선택한 라인 주석 제거입니다. 위에 단축키로 주석처리 하고 나면 해제할 때는 위 단축키로 해제합니다. 위에 단축키 쓴 만큼 씁니다.

 

정렬

컨트롤 +K + F 

 

 

'수업일지 > C# 문법' 카테고리의 다른 글

24-08-05 6일차  (0) 2024.08.05
24-08-03 5일차  (0) 2024.08.02
24-08-01 4일차  (0) 2024.08.01
24-07-31 3일차  (1) 2024.07.31
24-07-29 오리엔테이션  (0) 2024.07.29

int.Parse: 입력 문자열이 항상 유효한 정수일 때 사용합니다. 예외 처리를 통해 변환 실패를 처리할 수 있습니다.
int.TryParse: 입력 문자열이 유효하지 않을 수 있을 때 사용합니다. 예외 처리를 피하고 변환 실패를 논리적으로 처리할 수 있습니다.
Convert.ToInt32: null을 포함한 입력 값을 처리해야 할 때 사용합니다. null 값을 0으로 처리하는 특징이 있습니다.

https://unity.com/kr/download

 

창의적인 프로젝트 시작 및 Unity Hub 다운로드 | Unity

간단한 3단계로 Unity를 다운로드하고 전 세계적으로 가장 큰 인기를 누리는 2D/3D 멀티플랫폼 경험 및 게임 제작용 개발 플랫폼을 사용하세요.

unity.com

유니티 설치완료 - 버전 (2022.3.39ff1)

vscode 설치 

'수업일지 > C# 문법' 카테고리의 다른 글

24-08-05 6일차  (0) 2024.08.05
24-08-03 5일차  (0) 2024.08.02
24-08-01 4일차  (0) 2024.08.01
24-07-31 3일차  (1) 2024.07.31
24-07-30 2일차  (0) 2024.07.30
C# 변수

C# 변수는 메서드 안에서 해당 메서드의 로컬변수로 선언되거나, 혹은 클래스 안에서 클래스 내의 멤버들이 사용하는 전역적 변수(이를 필드(Field)라고 부름)로 선언될 수 있다. 로컬변수는 해당 메서드내에서만 사용되며, 메서드 호출이 끝나면 소멸된다. 반면 필드는 클래스의 객체가 살아있는 한 계속 존속하며 또한 다른 메서드들에서 필드를 참조할 수 있다. (주: 만약 필드가 정적 필드(static field)이면 클래스 Type이 처음으로 런타임에 의해 로드될 때 해당 Type 객체(타입 메타정보를 갖는 객체)에 생성되어 프로그램이 종료될 때까지 유지된다).

로컬변수는 기본값을 할당받지 못하기 때문에 반드시 사용 전에 값을 할당해야 하는 반면, 필드는 값을 할당하지 않으면, 해당 타입의 기본값이 자동으로 할당된다. 예를 들어, int 타입의 필드인 경우 기본값 0 이 할당된다.

모든 C# 변수의 이름은 대소문자를 구별(case-sensitive)한다. 예를 들어, var1 과 Var1은 서로 다른 변수이다.



C# 변수 예제

예제

using System;

namespace ConsoleApplication1
{
    class CSVar
    {
        //필드 (클래스 내에서 공통적으로 사용되는 전역 변수)
        int globalVar;
        const int MAX = 1024;

        public void Method1()
        {
            // 로컬변수
            int localVar;

            // 아래 할당이 없으면 에러 발생
            localVar = 100;

            Console.WriteLine(globalVar);
            Console.WriteLine(localVar);
        }
    }

    class Program
    {
        // 모든 프로그램에는 Main()이 있어야 함.
        static void Main(string[] args)
        {
            // 테스트
            CSVar obj = new CSVar();
            obj.Method1();
        }
    }
}

  • 필드 globalVar는 값을 명시적으로 할당하지 않은 경우 기본값 0 이 할당된다. 여기서 전역(Global)의 의미는 객체 (혹은 클래스) 내에서의 전역을 의미한다.
  • 지역변수 localVar는 값을 할당하지 않고 사용하게 되면, 컴파일러 에러가 발생한다.

C# 상수

C# 상수는 C# 키워드 const를 사용하여 정의한다. C# 변수와 비슷하게 선언하는데, 다만 앞에 const를 붙여 상수임을 나타낸다. 상수와 변수의 차이점은, 변수는 프로그램 중간에 값을 변경할 수 있지만, 상수는 초기에 정한 값을 중간에 변경할 수 없다. const는 필드 선언부에서 사용되거나 메서드 내에서 사용될 수 있으며, 컴파일시 상수값이 결정된다.

C# const 대신 readonly 키워드를 사용하여 읽기전용 (개념적으로 상수와 비슷한) 필드를 만들 수 있다. readonly는 필드 선언부나 클래스 생성자에서 그 값을 지정할 수 있고, 런타임시 값이 결정된다)


예제

using System;

namespace ConsoleApplication1
{
    class CSVar
    {
        // 상수
        const int MAX_VALUE = 1024;

        // readonly 필드 
        readonly int Max;
        public CSVar() 
        {
           Max = 1;
        }
        
        //...
    }
}



'c# 기초 문법' 카테고리의 다른 글

c# 형변환  (0) 2024.08.01
문자열 보간(String interpolation)  (0) 2024.08.01
c# 배열  (0) 2024.07.31
c# 데이터 타입  (0) 2024.07.29
c# 프로그래밍 언어  (0) 2024.07.29

+ Recent posts