Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

great minds think alike

[3] C# 스크립트 (2) 본문

서울여자대학교 SWU/2023 여름방학 SW사관학교 Programing GURU

[3] C# 스크립트 (2)

gapsoo 2023. 6. 29. 17:53

[3].1 제어문 사용하기

[3].2 배열 사용하기

 



[3].1 제어문 사용하기

>> if 문으로 조건 분기하기

  • 특정한 조건을 충족할 때만 스크립트를 실행하고 싶다면 if 문을 사용함
  • if 문을 사용하는 방법에는 몇 가지 형식이 있는데, 이 중 가장 간단한 조건식은 다음과 같음

C# if 문 형식

  • 조건식에 표시한 조건을 만족하면(조건이 '참' 이면) 중괄호 ({}) 블록에 담긴 처리를 실행함
  • 조건을 만족시키지 못하면(조건식이 '거짓'이면) 중괄호 블록 안에 담긴 처리를 실행하지 않고 다음 스크립트로 넘어감

if  문의 흐름

  • if 문의 조건식에는 관계 연산자를 사용할 수 있음
  • == 연산자는 왼쪽과 오른쪽 값이 같으면 '참', 같지 않으면 '거짓'이 됨
  • 대입할 때 쓰는 = 연산자와 헷갈리지 않도록 주의함
  • !=은 ==과 반대로 왼쪽과 오른쪽 값이 같으면 '거짓'이 됨
  • 이외에는 수학에서 자주 사용하는 부등호와 같은 개념으로 쓰임

관계 연산자

✏️ 대입 연산자와 관계 연산자를 헷갈리지 않도록 주의해야 함!

 

 

  • 코드: if 문 사용하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int herNum = 1;
		if(herbNum == 1)
		{
			Debug.Log("체력을 50 회복");
		}
	}
}

\ 출력 결과 /

체력을 50 회복

 

✏️ 이 코드에서 만약 herbNum == 1 조건을 만족시키지 않으면, 스크립트를 실행하지 않고 빠져나옴

 

  • 약초 수(herbNum)가 1일 때 체력을 50 회복하는 스크립트임
  • 10번 줄의 조건식에서 herbNum의 변수 값이 1인지 확인함
  • 9번 줄에서 herbNum에 1을 대입하므로 10번 줄의 조건식은 '참'임
  • 참일 때는 중괄호 블록 안에 담긴 처리가 실행되므로 Console 창에 [체력을 50 회복]이 출력됨
  • 이 스크립트는 조건식이 '거짓'이면 Console 창에 메시지를 출력하지 않고 종료함

✏️ 만약 int herbNum == 0; 으로 초기화했다면 if 조건문이 거짓이 되어 스크립트를 실행하지 않고 빠져나옴 (실제로 int herbNum == 0; 으로 초기화한 뒤 실행해보면 콘솔창에 아무것도 뜨지 않는다)

 

 

 

>> if~else 문으로 조건 분기하기

  • if 문을 응용한 if~else문이 있음
  • 이것은 '체력이 100이상이면 공격하고 아니면 방어한다'처럼 조건식을 만족할 때와 만족하지 않을 때를 각각 다르게 처리할 때 씀

if~else 문 형식
if~else 문의 흐름

  • 코드: if~else 문 사용하기 ①
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int hp = 200;
		if(hp >= 100)
		{
			Debug.Log("공격!");
		}
		else
		{
			Debug.Log("방어!");
		}
	}
}

\ 출력 결과 /

공격!

 

 

 

 

>> if 추가하기

  • 조건이 두 개라고 해서 추가되는 요소는 없음
  • if 문 뒤에 else if 문을 연결시키기만 하면 됨

 

  • 조건문의 흐름은 위에서 아래로 차례대로 검사해 조건을 만족하면 중괄호 블록 안에 든 처리를 실행함
  • else if 문이나 else 문은 실행하지 않고 조건 분기를 종료한 후 그다음 스크립트를 처리함
  • 모든 조건식을 만족하지 않으면 마지막에 있는 else에 해당하는 중괄호 블록 안의 처리를 실행함
  • 앞의 if 문과 마지막 else 문 사이에 있는 else if 문은 몇 개라도 상관없고 마지막 else 문은 생략할 수 있음

연속된 if~else 문의 흐름

  • if~else 문 사용하기 ②
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int hp = 180;
		if(hp >= 50)
		{
			Debug.Log("도망");
		}
		else if(hp >= 2000
		{
			Debug.Log("공격!");
		}
		else
		{
			Debug.Log("방어!");
		}
	}
}

\ 출력 결과 /

방어!

 

✏️int hp = 180; 에서 hp가 180으로 초기화되었기 때문에 else에 해당하여 [방어!]가 출력됨

 

 

 

>> 변수 범위

  • if 문의 블록에서 정의한 변수는 사용할 수 있는 범위가 정해져 있음

 

  • 코드: 변수 범위의 예
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int x = 1;
		if(x == 1)
		{
			int y = 2;
			Debug.Log(x);
			Debug.Log(y);
		}
		Debug.Log(y);
	}
}

오류 발생!

 

✏️ if 문에서 x에 1을 대입하는 것이 아니라, x가 1과 같은지를 물어보는 것이므로 비교 연산자 =를 사용해야 함

✏️ y는 지역 변수로 선언이 된 상태

 

  • 실행 도구를 클릭해 스크립트를 실행하려고 하면 유니티 에디터의 왼쪽 아래에 The name 'y' does not exist in thr current context 오류가 발생함
  • 16번 줄에서 사용하는 y 변수가 선언되지 않아 위험하다는 오류임
  • 분명 12번 줄에서 y 변수를 제대로 선언하고 초기화까지 했는데 오류가 뜨는 건 변수는 선언한 줄을 포함하는 중괄호 안에서만 사용할 수 있기 때문임
  • 이것을 변수 범위(사용할 수 있는 범위)라고 함
  • x 변수는 9번 줄에서 정의한 이후부터 17번 줄의 } 사이에서 사용할 수 있음
  • y 변수는 12번 줄에서 정의한 이후부터 15번 줄의 } 사이에서만 사용할 수 있음

 

  • 오류가 발생한 원인은  y변수의 범위는 if 문 블록 안이므로 16번 줄에서 'y변수가 선언되어 있지 않다'는 오류가 발생한 것임
  • 16번 줄을 주석으로 처리하면 오류가 사라지면서 실행할 수 있음
  • 예제처럼 if 문 안에서 선언한 변수는 if 문 바깥에서는 사용할 수 없으므로 주의함

 

 

 

 

>> for 문으로 반복하기

  • 스크립트를 작성하다 보면 같은 처리를 여러 번 반복해야 할 때가 있는데 이때는 반복 횟수를 지정하면 자동으로 반복 횟수만큼 처리를 반복하는 for 문을 사용함

  • 반복 횟수는 for(3)처럼 단순히 쓸 수는 없음
  • 실제 스크립트에서는 다음과 같이 사용함

 

for 문의 흐름

 

  • for 문의 괄호 안에는 반복 조건을 작성함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		for(int i = 0; i <5; i++)
		{
			Debug.Log(i);
		}
	}
}

 \ 출력 결과 /

0
1
2
3
4
  • for 문을 써서 처리를 다섯 번 반복하는 예제임

for 문의 처리 흐름

  •  1이 한 번 2는 여섯 번, 3~5는 다섯 번 반복해서 실행됨
  1. i 변수를 0으로 초기화함
  2. 반복조건 (i<5)을 만족하면 3, 만족하지 않으면 반복문을 종료함
  3. Console창에 i 값을 출력함
  4. i를 증가시킴(i 값을 1 증가)
  5. 2로 돌아감

 

  • 코드: 짝수만 출력하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		for(int i = 0; i <10; i += 2)
		{
			Debug.Log(i);
		}
	}
}

 \ 출력 결과 /

0
2
4
6
8
  • 다음은 3부터 5까지 출력하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		for(int i = 3; i <= 5; i++)
		{
			Debug.Log(i);
		}
	}
}

 \ 출력 결과 /

3
4
5

 

  • 다음은 3부터 0까지 카운트다운하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		for(int i = 3; i >= 0; i--)
		{
		Debug.Log(i);
		}
	}
}

\ 출력 결과 /

3
2
1
0

 

  • 다음은 1부터 10까지 더한 값을 출력하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int sum = 0;
		for(int i = 1; i <= 10; i++)
		{
			sum += i;
		}
		Debug.Log(sum);
	}
}

\ 출력 결과 /

55

 

>> 스크립트에서 오류는 흔한 것!

  • 스크립트를 작성하고 '자, 이제 게임이 움직인다!'라고 생각하자마자 오류 메시지가 나올 때가 있음
  • 이때마다 '아아, 스크립트는 어렵다!'고 생각할 수 있음
  • 컴파일이 한 번에 되는 경우는 생각만큼 많지 않음
  • 마음을 편하게 먹고 오류 코드를 읽은 후 해당하는 부분을 살펴보자

 

 


[3].2 배열 사용하기

 

>> 배열 사용하기

  • 스크립트를 사용하다보면 여러 가지 값(게임 순위와 점수 등)을 한꺼번에 다뤄야 할 때가 있음
  • 이때 변수를 하나하나 만드는 것은 너무나 수고로움
  • 예를 들어 학생 100명의 점수를 다룬다면 변수를 100번 선언해야 함
  • 숫자가 늘어날수록 힘들고 실수도 늘어날 수 있음

 

 

 

>> 배열 선언과 규칙

이때는 배열을 쓰면 해결됨

배열은 변수 상자를 가로로 이어 붙인 길고 얕은 상자와 비슷함

배열 이미지

 

 

 

>> 배열 준비

  • 배열을 사용하면 변수 상자를 굳이 100개씩 준비하지 않아도 됨
  • 길고 얕은 상자 한 개만 쓰면 되므로 다루기도 쉽고 만들기도 간단함

  • int가 정수형을 나타내는 것처럼 int[ ]는 정수 배열형을 나타냄
  • 다만 이것만으로는 변수 상자를 몇 개 연결하고 싶은지 알 수 없음
  • 앞의 선언에 이어서 준비하려는 상자 수를 다음과 같이 씀
  • 상자를 다섯 개 준비하려면 오른쪽에 new int[5]를 씀

  • 오른쪽에 new 키워드가 나옴
  • 영어로는 '새로운'이라는 뜻이지만 스크립트에서는 '만든다'라는 뜻에 가까움
  • 여기서는 new int[5]를 써서 int형 상자를 다섯 개 만듦
  • 즉, 배열을 만들려면 배열을 선언하고 바로 이어서 new를 이용해 배열에 필요한 상자 수를 지정해야 함

 

 

 

>> 배열 값 이용

  • 이것으로 상자 다섯 개를 연결한 배열을 만듦
  • 이 배열에 값을 대입하거나 꺼내려면 다음과 같이 상자 번호를 지정해야 함
  • 앞에서 세 번째에 있는 상자에서 값을 꺼내고 싶다면 다음과 같이 씀

  • 'points[3]을 잘못 쓴 것 아니야?'라고 생각했나요? 바르게 쓴 것임
  • 배열은 0번부터 세기 때문임!
  • 맨 앞 번호는 0, 앞에서 두 번째 번호는 1, 마지막 상자 번호는 4 임
  • 배열에서는 상자에 넣는 값을 요소, 상자의 총수를 요소 수라고 함

배열 정하기

  • 코드: 배열 사용하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int[] array = new int[5];

		array[0] = 2;
		array[1] = 10;
		array[2] = 5;
		array[3] = 15;
		array[4] = 3;

		for(int i = 0; i < 5; i++)
		{
			Debug.Log(i);
		}
	}
}

 

\ 출력 결과 /

2
10
5
15
3

 

 

 

>> 배열을 사용하는 방법

  • 9번 줄에서는 요소 수가 5인 int형 배열 array를 선언함
  • 11~15번 줄에서는 대괄호([])를 써서 각 배열 요소에 숫자를 대입함
  • 배열의 첫 번째 요소가 0번인 것을 주의함
  • 17~20번 줄에서 배열 내용을 출력함
  • Debug.Log를 다섯 번 쓰지 않고 for 문을 써서 배열의 모든 요소를 출력함
  • 배열과 반복문은 자주 함께 쓰이므로 묶음으로 생각하면 편함
  • 배열의 요소에 값을 대입할 때 11~15번 줄처럼 하나하나 쓰면 꽤 번거로움
  • 이때는 다음과 같이 간단히 쓸 수 있음 

  • 이 방법에서는 배열에 넣는 개수가 분명하므로 new를 써서 배열의 요소 수를 지정하지 않아도 됨

 

  • 다음은 배열에 포함된 숫자 중 90 이상인 숫자만 출력하는 스크립트임
  • 코드: 조건을 만족하는 요소만 출력하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int[] points = [83, 99, 52, 93, 15];

		for(int i = 0; i < points.Length; i++)
		{
			if(points[1] >= 90)
			{
			Debug.Log(points[1]);
			}
		}
	}
}

\ 출력 결과 /

99
93
  • 11~17번 줄에서는 for 문을 사용해 배열의 요소를 첫 번째부터 차례로 확인함
  • 13~16번 줄에서는 if 문을 써서 값이 90 이상인 요소만 출력함
  • for 문의 반복 조건은 0부터 points.Length까지임
  • points.Length란 글자 그대로 points 배열의 길이(요소 수) 임
  • 배열형의 변수명.Length를 써서 배열의 길이(이 예제에서는 5)를 얻을 수 있음

 

  • 다음은 배열에 포함되는 값의 평균을 구하는 스크립트임
  • 코드: 평균값 구하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
	void Start()
	{
		int[] points = [83, 99, 52, 93, 15];

		int sum = 0;
		for(int i = 0; i < points.Length; i++)
		{
			sum += potints[i]; ...①
		}

		int average = sum / points.Length; ...②
		Debug.Log(average);
	}
}

\ 출력 결과 /

68

 

  • 평균값을 구하려면 ①배열에 있는 모든 요소의 합계를 구하고 ②구한 합계를 배열의 요소 수로 나눔
  • 먼저 배열 요소의 합계를 구해야 하므로 11번 줄에서 sum 변수를 준비함
  • 12~15번 줄에서는 배열에 있는 요소를 sum에 더함
  • 17번 줄에서는 합계를 배열의 요소 수인 5로 나눠 평균값을 구하고 average 변수에 대입함

 

 

 

>> 정수와 정수의 나눗셈

  • 평균값을 구하는 스크립트에서는 평균값을 정수로 계산했지만(int형의  average 변수를 선언함) 소수점까지 계산해야 할 때도 있음
  • 소수점까지 출력되도록 '코드: 평균값 구하기'의 17번 줄을 다음과 같이 바꿔서 실행해 보자

  • 평균값은 68.4가 정답이지만 68로 줄력됨
  • 이것은 C#에서는 정수끼리 나눗셈을 하면 소수점 이하가 버려져 결과는 정수가 되기 때문임
  • 즉, 10 % 4는 2가 되고, 17 % 3은 5가 됨
  • 소수점까지 출력하고 싶다면 정수끼리 나눗셈을 하는 것이므로 처음에 1.0f를 넣어줌
  • 꼼수처럼 보이지만 이 내용을 모르면 계산 결과를 소수점으로 구할 때 오류가 발생할 수 있으므로 꼭 기억해 두자

 

 

 

>> 오류 코드를 영어로 읽기 싫어!

  • 오류 로그는 'Assets/xxxxx.cs(5:12)...'처럼 복잡한 영문 구조로 되어 있음
  • 복잡해 보이지만 괄호 안에 보이는 숫자를 보면 쉬움
  • '5번 줄의 12번째 글자가 잘못되어 있어요'라고 알려주기 때문임
  • 숫자가 가리키는 줄과 그 부분을 살펴보면 오류를 쉽게 발견할 수 있음
  • 오류를 몇 번 고치다 보면 오류 메시지만 봐도 대략 어떤 오류인지 짐작할 수 있음