유니티에서 C# 스크립트를 생성하면 자동으로 상속되는 MonoBehaviour 클래스에 대해서 알아보자!

MonoBehaviour 클래스는 유니티의 기본 클래스로, 게임 오브젝트에 스크립트를 연결할 수 있는 프레임워크를 제공할 뿐만 아니라, 시작과 업데이트 등의 이벤트에 대한 연결을 제공한다.

-MonoBehaviour 클래스의 주요 이벤트-

Start - 게임 오브젝트가 존재하기 시작할 때 호출됩니다(씬이 로드될 때 또는 게임 오브젝트가 인스턴스화될 때 호출).

Update - 프레임마다 호출됩니다. -> 일정한 간격이 아닐수도 있다

FixedUpdate - 물리 타임스텝마다 호출됩니다. -> 그냥 update보다 일정한 간격

OnBecameVisible 및 OnBecameInvisible - 게임 오브젝트의 렌더러가 카메라의 뷰에 들어오거나 나갈 때 호출됩니다.

OnCollisionEnter 및 OnTriggerEnter - 물리 충돌 또는 트리거가 발생할 때 호출됩니다.

OnDestroy - 게임 오브젝트가 파괴될 때 호출됩니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Background : MonoBehaviour
{
    public float speed = 3;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }
}

public으로 선언한 변수는 유니티 Inspector 창에서 수정해 실행하는 것이 가능하다.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Background : MonoBehaviour
{
    public float speed = 3;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        transform.Translate(new Vector3(-1, 0, 0) * speed * Time.deltaTime);
    }
}

 

Time.deltaTime은 update와 update 사이의 텀이다.

Transform.Translate 는 게임오브젝트를 이동시키기 위한 함수이고 좌표값만큼 개체가 이동한다.

 

 

https://docs.unity3d.com/kr/2021.1/Manual/class-MonoBehaviour.html

 

중요 클래스 - MonoBehaviour - Unity 매뉴얼

MonoBehaviour 클래스는 기본적으로 모든 Unity 스크립트가 파생되는 기본 클래스입니다. Unity의 프로젝트 창에서 C# 스크립트를 생성하면 MonoBehaviour에서 자동으로 상속되며, 템플릿 스크립트를 제공

docs.unity3d.com

 

 

'🍀 Unity' 카테고리의 다른 글

[Unity] 유니티 시작하기  (0) 2025.06.06
[C#] 다형성과 추상  (0) 2025.06.01
[C#] 상속과 유효범위(scope)  (0) 2025.06.01
[C#] 클래스 class  (0) 2025.06.01
[C#] 구조체 struct  (0) 2025.06.01

 

다형성

 

오버로딩

과적

매개변수 타입과 개수에 따라 같은 이름이어도 다른 함수가 실행된다.

public class Box
{
    public void Dump(int z)
    {
        Debug.Log(z + "개 버립니다");
    }
    public void Dump(string obj)
    {
        Debug.Log(obj + "버립니다");
    }

    public void Dump(string who, string obj)
    {
        Debug.Log(who + "가 " + obj + "를 버립니다");
    }
}
public class HelloWorld : MonoBehaviour
{
    void Start()
    {
        Box aBox = new Box();
        aBox.Dump("쓰레기");
        aBox.Dump(3);
        aBox.Dump("원영이", "종이");
    }
}

 

오버라이드

덮어쓰기

상속관계에서 자식클래스의 메소드가 부모클래스의 메소드를 덮어쓰기 하는 것

 

오버로드와 달리 override 하기 위해서는 override 키워드가 필요하며 부모 클래스의 메소드에 virtual 키워드가 있어야한다.

public class Box
{
    public void Dump(int z)
    {
        Debug.Log(z + "개 버립니다");
    }
    public virtual void Dump(string obj)
    {
        Debug.Log(obj + "버립니다");
    }

    public void Dump(string who, string obj)
    {
        Debug.Log(who + "가 " + obj + "를 버립니다");
    }
}

public class TrashCan : Box
{
    public override void Dump(string obj)
    {
        Debug.Log(obj + "를 쓰레기통에 버립니다");
    }
}
public class HelloWorld : MonoBehaviour
{

    void Start()
    {
        Box aBox = new Box();
        aBox.Dump("쓰레기");
        aBox.Dump(3);
        aBox.Dump("원영이", "종이");

        TrashCan aCan = new TrashCan();
        aCan.Dump("쓰레기");
        aCan.Dump(3);
        aCan.Dump("원영이", "종이");

        Box aCanBox = new TrashCan();
        aCanBox.Dump("쓰레기");
        aCanBox.Dump(3);
        aCanBox.Dump("원영이", "종이");
    }

}

base.함수명()을 실행하면 override하기 전 부모클래스의 함수를 실행한다.

public class TrashCan : Box
{
    public override void Dump(string obj)
    {
        base.Dump(obj);
        Debug.Log(obj + "를 쓰레기통에 버립니다");
    }


public class HelloWorld : MonoBehaviour
{

    void Start()
    {
        Box aBox = new Box();
        aBox.Dump("쓰레기");
        aBox.Dump(3);
        aBox.Dump("원영이", "종이");

        TrashCan aCan = new TrashCan();
        aCan.Dump("쓰레기");
        aCan.Dump(3);
        aCan.Dump("원영이", "종이");

    }

}

 

추상 abstract 메소드

 

이름만 존재하고 기능 구현이 되지 않은 메소드

기능 구현은 자식클래스에서 함

 

추상 클래스: 추상 메소드가 존재하는 클래스

추상 메소드가 구현되지 않으면 인스턴스화 시킬 수 없음

 

코드 가독성을 위한 기능

 

public abstract class Animal
{
    public abstract void Fly();
}

 

추상메소드가 있으면 클래스도 추상클래스여야한다

 

추상클래스는 그대로 인스턴스화 시킬 수 없다.

 

public class Bug : Animal
{
    public override void Fly()
    {
        Debug.Log("부웅부웅");
    }
}

 

public class Bird : Animal
{
    public override void Fly()
    {
        Debug.Log("퍼덕퍼덕");
    }
}

 

public class HelloWorld : MonoBehaviour
{
    void Start()
    {
        Animal animal = new Bird();
        animal.Fly();

        Bug bug = new Bug();
        bug.Fly();
    }
}

 

추상클래스를 이용하면 공통조상을 만들 수 있다.

bug와 bird의 공통 조상 animal에서 추상 함수(메소드) fly 를 각각 오버라이드 해서 같은 함수를 다르게 구현할 수 있다.

 

인터페이스 interface

 

어떤 메소드가 여기 존재하기로 했다는 약속을 클래스와 비슷한 형태로 정리한 것

 

public interface ITurnOnable
{
    public void TurnOn();
    public void TurnOff();
}

 

인터페이스의 이름은 I를 맨 처음에 붙인다 (명명규칙)

 

인터페이스에 정의된 함수들이 없으면 빨간줄뜸

 

public class Car : ITurnOnable
{
    public void TurnOff()
    {
        Debug.Log("시동끄기");
    }

    public void TurnOn()
    {
        Debug.Log("시동켜기");
    }
}
public class HelloWorld : MonoBehaviour
{

    void Start()
    {
       Car car = new Car(); 
        car.TurnOn();
        car.TurnOff();

        ITurnOnable turnOnable = car;
        turnOnable.TurnOn();
        turnOnable.TurnOff();

    }

}

인터페이스 형에 대입하기가 가능함

 

'🍀 Unity' 카테고리의 다른 글

[Unity] MonoBehaviour 클래스, 유니티 스크립트  (0) 2025.06.07
[Unity] 유니티 시작하기  (0) 2025.06.06
[C#] 상속과 유효범위(scope)  (0) 2025.06.01
[C#] 클래스 class  (0) 2025.06.01
[C#] 구조체 struct  (0) 2025.06.01

상속


기존 클래스의 기능을 이어받아 확장하는 개념

코드 재사용성을 좋게 하기 위함

 

부모 클래스를 상속받아 자식 클래스를 만든다.

부모 클래스보다 자식 클래스의 기능이 더 많음

 

 

부모클래스 Character  
public class Character
{
    public string name;
    public int hp;

    public void Heal (int healHP)
    {
       ...
    }

    public void Hit(int damage)
    {
        ...
    }

    public bool isAlive()
    {
        ...
    }
}
public class Wizard
{

    // Character 와 중복되는 부분
    public string name;
    public int hp;

    public void Heal (int healHP)
    {
       ...
    }

    public void Hit(int damage)
    {
        ...
    }

    public bool isAlive()
    {
        ...
    }

    // 중복되지 않는 부분
    public float mp;

    public void UseMagic()
    {
        ...
    }
}
 

Character를 상속받은 자식클래스 Wizard
  public class Wizard : Character
{
    public float mp;

    public void UseMagic()
    {
        ...
    }
}

 

Wizard 타입의 변수에는 Character를 대입할 수 있지만 반대는 불가능

 

 Wizard aWizard = new Wizard();

 Character aMan = aWizard; // 가능

 Character aCharacter = new Character();

 Wizard aWizard2 = aCharacter; // 에러

Wizard aWizard2 = (Wizard)aCharacter;

억지로 타입캐스팅을 해서 코드상으로는 에러가 없지만 실행하면 잘못된 형변환 에러가 발생

 

 

가시성 유효범위 scope

 

{ }로 코드 블록을 나눌 수 있다.

 

중괄호 바깥에서 선언된 변수를 중괄호 안에서 다시 선언하면 에러가 발생함

    void Start()
    {
        for(int i = 0; i < 10; i++)
        {
            int x = 0;
            Debug.Log(x);
        }

        int x = 1;
        Debug.Log(x);
    }

 

 

public class HelloWorld : MonoBehaviour
{
    int x = 1;
    void Start()
    {
        for(int i = 0; i < 10; i++)
        {
            int x = 0;

            Debug.Log(x);
            Debug.Log(this.x);
        }

  
    }

}

 

this.x는 HelloWorld라는 클래스 자체의 x를 의미함 (클래스의 인스턴스)

for문 안에서 x는 함수 안에서 선언된 x를 의미함

 

public, private

밖에서 볼 필요 없는 내용을 감춤 (캡슐화)

 

public은 어디서나 사용할 수 있는 변수

private는 해당 객체 안에서만 접근할 수 있는 변수

 

변수 선언시 기본값은 private

 

protected는 public과 private사이의 속성

관계된 객체(부모-자식 클래스)에서만 접근 가능

'🍀 Unity' 카테고리의 다른 글

[Unity] 유니티 시작하기  (0) 2025.06.06
[C#] 다형성과 추상  (0) 2025.06.01
[C#] 클래스 class  (0) 2025.06.01
[C#] 구조체 struct  (0) 2025.06.01
[C#] 열거형 enum  (0) 2025.06.01

 

열거형 enum

  • 무언가를 나열할 때 사용
  • 내부적으로는 숫자(0,1,2)로 저장하지만 코드에서는 단어로 지정
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloWorld : MonoBehaviour
{
    enum Weapon
    {
        Sword,
        Gun,
        Bat
    }
   
    void Start()
    {
        Weapon myWeapon = Weapon.Sword;
        Debug.Log(myWeapon);
    }
}

내부적으로는 Sword = 0, Gun = 1, Bat = 2로저장되지만 코딩시에는 Weapon.Sword, Weapon.Gun, Weapon.Bat로 표기한다.

 

기본적으로 enum에 지정되는 상수값은 int이며, 0으로 시작하고 정의 텍스트 순서에 따라 1씩 증가한다.

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

Spring:=0, Summer=1, Autumn=2, Winter=3으로 지정됨

 

: byte 같은 형식으로 enum의 숫자 자료형을 지정할 수 있다.

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

위와 같이 연결된 상수 값을 명시적으로 지정할 수도 있다.

ushort(부호 없는 16비트 숫자 자료형)을 사용해 메모리를 절약할 수 있다.

 

 

enum 캐스팅

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");
        // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);
        // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);
        // output: 4
    }
}

 

열거형 값을 내부 형식으로 캐스팅하면 ( var b = (Season)1;) 결과는 열거형 멤버의 연결된 정수 값(Summer)이다.

반대로 int로도 변환 가능 (Season a = Season.Autumn; (int)a;) -> 2

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");
        // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);
        // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);
        // output: 4
    }
}

 

switch case 문에도 enum을 사용할 수 있다.

enum Level 
{
  Low,
  Medium,
  High
}

static void Main(string[] args) 
{
  Level myVar = Level.Medium;
  switch(myVar) 
  {
    case Level.Low:
      Console.WriteLine("Low level");
      break;
    case Level.Medium:
       Console.WriteLine("Medium level");
      break;
    case Level.High:
      Console.WriteLine("High level");
      break;
  }
}

 

결과는

Medium level

 

 


참고 자료

 

https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/enum

 

열거형 형식 - C# reference

선택 항목 또는 선택 항목의 조합을 나타내는 C# 열거형 형식에 대해 알아봅니다.

learn.microsoft.com

https://www.w3schools.com/cs/cs_enums.php

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

'🍀 Unity' 카테고리의 다른 글

[C#] 클래스 class  (0) 2025.06.01
[C#] 구조체 struct  (0) 2025.06.01
[C#] 함수  (0) 2025.06.01
[C#] 컬렉션 (List, Dictionary)  (0) 2025.06.01
[C#] 배열  (0) 2025.05.30

함수를 사용하는 이유

  • 모듈화
    • 읽기 쉬움
    • 재사용 가능

C# 함수는 대문자로 시작

클래스와 구조체의 이름은 파스칼 표기법을 따른다.

https://docs.popekim.com/ko/coding-standards/csharp

 

C# 코딩 표준 | 포프의 문서창고

컴퓨터처럼 사고하기 | 실무자에게 배우는 C | 고오급 C개발 공부 수백명에게 5.0 만점 리뷰를 받은 초특급 C 언어 인강! POCU 아카데미에서 C 언어를 마스터하세요!

docs.popekim.com

 

int Square(int x)
{
    return x * x;
}

void Start()
{
    int a = Square(5);
    Debug.Log(a);
}

 

int Square(int x)
{
    return x * x;
}

void Like(int a)
{
    Debug.Log("좋아요" + a + "만큼~~");
}

void Start()
{
    int a = Square(5);
    Like(a);

}

 

int Square : int형의 결과를 반환하는 Square라는 이름의 함수

void Like : 아무것도 반환하지 않는 Like라는 이름의 함수

 

 

    void Like()
    {
        Debug.Log("좋아요~~");
    }

    // Start is called before the first frame update
    void Start()
    {
        Like();
    }

-> 좋아요~~ 출력

 

    void Like(int a = 5)
    {
        Debug.Log("좋아요~~"+a);
    }

    // Start is called before the first frame update
    void Start()
    {
        Like();

    }

-> 좋아요~~5 출력

 

void Like(int a = 5) 이렇게 해놓으면 전달된 인수가 없을 때 기본값 5를 자동으로 넣게 됨

 

 

'🍀 Unity' 카테고리의 다른 글

[C#] 구조체 struct  (0) 2025.06.01
[C#] 열거형 enum  (0) 2025.06.01
[C#] 컬렉션 (List, Dictionary)  (0) 2025.06.01
[C#] 배열  (0) 2025.05.30
[C#] 제어문 (while, do-while, for)  (0) 2025.05.30

컬렉션은 여러 개의 데이터를 저장하는 자료구조이다.

배열과 달리 중간에 데이터를 삽입하거나 삭제할 수 있다.

 

 

1. 리스트

 

List<타입> 리스트이름 = new List<타입>();

List<string> names = new List<string>();

names.Add("1민지");
names.Add("2하니");

foreach (string name in names)
{
    Debug.Log(name);
}

names.RemoveAt(1);

for (int i = 0; i < names.Count; i++)
{
    Debug.Log(names[i]);
}

name은 foreach문에서만 사용되는 지역변수이다.

리스트이름.Add로 데이터 추가

리스트이름.RemoveAt(0)으로 0번 데이터 제거

리스트이름.Remove("이름")으로 "이름"데이터를 지울 수 있음

 

c#은 대소문자 구분이 중요

 

 

Debug.Log(names.Contains("민지")); "민지"라는 데이터가 들어있는지 boolean값출력

 

리스트이름.Clear(); 로 리스트의 내용을 비울 수 있다

 

리스트이름.IndexOf(""); 리스트에서 특정 데이터가 어디있는지 출력

 

Debug.Log(names.IndexOf("민지")); ⤵️

 

2. 딕셔너리

 

key와 value가 한세트

key는 숫자일수도 문자열일수도

value는 데이터

Dictionary<string,string> keyValuePairs = new Dictionary<string,string>();

keyValuePairs.Add("사랑", "사랑은어떤것");
keyValuePairs.Add("게임", "게임은어떤것");

 

int값으로 사용해도 되지만 key 값은 일반적으로 string을 사용한다.

 

Dictionary<string,string> keyValuePairs = new Dictionary<string,string>();

keyValuePairs.Add("사랑", "사랑은어떤것");
keyValuePairs.Add("게임", "게임은어떤것");

Debug.Log(keyValuePairs.ContainsKey("사랑"));
keyValuePairs.Remove("사랑");
Debug.Log(keyValuePairs.ContainsKey("사랑"));

 

Dictionary<string,string> pairs = new Dictionary<string,string>();

pairs.Add("사랑", "사랑은어떤것");
pairs.Add("게임", "게임은어떤것");

foreach(KeyValuePair<string,string> kvp in pairs)
{
    Debug.Log(kvp.Key+": "+kvp.Value);
}

kvp는 foreach문에서만 사용되는 지역변수이다.

 Dictionary<string,string> dict = new Dictionary<string,string>();

 dict.Add("사랑", "사랑은어떤것");
 dict.Add("게임", "게임은어떤것");

 foreach(string key in dict.Keys)
 {
     Debug.Log(key+": " + dict[key]);
 }

dict.Keys는 dict라는 딕셔너리의 모든 key가 모여있는 객체를 리턴한다. The keys() method returns a view object.

 

 

'🍀 Unity' 카테고리의 다른 글

[C#] 열거형 enum  (0) 2025.06.01
[C#] 함수  (0) 2025.06.01
[C#] 배열  (0) 2025.05.30
[C#] 제어문 (while, do-while, for)  (0) 2025.05.30
[C#] 조건문  (0) 2025.05.30

while (조건)
{
	조건이 맞을 동안 실행할 문장
}

 

 

문자와 숫자 출력은 +로 연결

 

do
{
	무조건 한 번은 실행되는 문장
} while(조건){ 조건이 맞을 동안 실행 }

 

continue: 뒷 문장을 무시하고 조건문 검사로 건너뜀

break: 반복문에서 나감

 

 

for (초기화 ; 반복 조건 ; 증감) {
	반복할 문장
}

 

'🍀 Unity' 카테고리의 다른 글

[C#] 컬렉션 (List, Dictionary)  (0) 2025.06.01
[C#] 배열  (0) 2025.05.30
[C#] 조건문  (0) 2025.05.30
[C#] 연산자  (0) 2025.05.29
[Unity] VS가 잘 연결되어 있는데도 debug.log가 안 뜨는 이유  (0) 2025.05.23

int score = 300;

if (score > 200)
{
	Debug.Log("good");
}

 

들여쓰기: indent

파이썬의 들여쓰기는 문법의 일부이지만 C#에선 가독성의 문제

 

if (조건1)
{
	조건1에 맞을 때	
}
else if (조건2)
{
	조건2에 맞을 때
}
else {
	조건1, 2에 둘 다 맞지 않을 때
}

 

switch(number)
{
	case 1:
    	number가 1일 때
       	break;
    case 2:
    	number가 2일 때
        break;
    case 3:
    	number가 3일 때
       	break;
    case 4:
    	number가 4일 때
        break;
    default:
    	전부 다 아닐 때
        break;
}

 

break가 있어야 다음 문장을 실행하지 않고 switch를 빠져나간다

숫자 말고 문자열 ("+", "-", ..)등으로도 가능

 

 

'🍀 Unity' 카테고리의 다른 글

[C#] 배열  (0) 2025.05.30
[C#] 제어문 (while, do-while, for)  (0) 2025.05.30
[C#] 연산자  (0) 2025.05.29
[Unity] VS가 잘 연결되어 있는데도 debug.log가 안 뜨는 이유  (0) 2025.05.23
[C#] 변수  (0) 2025.05.23

+ Recent posts