본문 바로가기
Development/Unity

Unity 프로그래밍의 기초 골자

by gyu fx 2024. 5. 6.

TOC

  1. IDE로서 VS
  2. Compile
  3. bit
  4. OOP
  5. namespace
  6. MonoBehaviour, Event Function
  7. Unity scripts lifecycle
  8. Function & Method
  9. Variable, Constant
  10. Data type
  11. Stack & Heap
  12. Value type, Reference type
  13. Loops and Conditionals
  14. Parameter & Argument
  15. GameObject & Component

IDE

통합 개발 환경(IDE, integrated Development Environment)

소프트웨어 개발을 지원해 주는 포괄적인 기능을 제공하는 App
코드 작성 및 변경, 디버깅, 프로파일링 등 다양한 기능

대표적으로 MS의 Visual Studio가 있다.


Compile

사람이 작성한 코드를 실행 가능한 코드로 변환하는 과정

C#코드는 컴파일러를 통해 IL(Intermediate Language)로 컴파일된다. 이는 컴퓨가 실행할 수 있는 코드가 아니다.
IL코드는 Runtime에 JIT(Just In Time, 적시) 컴파일러를 통해 컴퓨터가 실행할 수 있는 코드로 컴파일된다.
C# 코드는 총 2번 컴파일된다.

 

Compilation Process in C# - Scaler Topics

This Scaler article provides a comprehensive understanding of C# program execution and the role of Common Language Runtime (CLR). Explore from Source Code to Intermediate Language (IL) and delve into Just-in-Time (JIT) Compilation. Discover how Compiled C#

www.scaler.com

 

Unity - Manual: C# compiler

Referencing additional class library assemblies C# compiler To compile C# source code in a Unity Project, the Unity Editor uses a C# compiler. C# compiler C# language version Roslyn C# 9.0 The Editor passes a default set of options to the C# compiler. To p

docs.unity3d.com


Bit

컴퓨터를 가장 보편적으로 설명하면 '정보를 처리하는 장치'라고 할 수 있다.
여기에 사용된 '정보'는 "불확실성에 대한 정량적인 재현"이고 이를 표현하는 단위는 "있다 vs 없다", "참 vs 거짓" 등의 두 가지 경우의 쌍이다.
즉, 0과 1로 구성된 'Bit'가 "정보의 최소 단위"라고 할 수 있겠다.

전기 신호에서도 이와 비슷하게 사용하는데 전류를 0과 1로 컨트롤 하는 개념이다.

참(True)과 거짓(False)의 변수인 'Boolean'은 8Bit(=1byte)이다. 이는 1byte가 "메모리가 저장되는 최소 단위"이기 때문이다.


객체 지향 프로그래밍(OOP)

협력하는 자율적인 객체들의 공동체

  • 객체(object) : 상태(state)와 행동(behavior)을 가진 실체
  • Message : 객체지향의 유일한 의사소통 수단(요청)
  • Method : 객체가 요청을 처리하는 구체적인 방법
  • Type : 0과 1로만 이루어진 메모리상의 정보를 분류하는 개념(concept)
  • Class : 타입을 구현하기 위해 각 언어가 제공하는 개념
  • Instance : 특정 타입이 적용되는 해당 타입의 객체
  • Instantiation : 특정 타입이 적용되는 객체를 메모리상에 생성하는 것
  • Inheritance : 하나의 클래스가 다른 클래스를 부모로 삼아 자식으로서 그 동작을 이어받는 것. 부모는 자식을 일반화(generalization) 한 것이고 자식은 부모를 특수화(specialization) 한 것이다.

 Namespace

중복되는 이름을 피해 관련 있는 이름들을 묶은 것

'using'이라는 전처리기 지시어(Preprocessor directive)를 통해 이름 공간을 일일이 지정하지 않고도 특정 이름을 가리키도록 도와준다.
'전처리기 지시어'란 컴파일 직전에 컴파일러가 특정 동작을 미리 수행하도록 지시하는 명령어.

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

public class MyProgram : UnityEngine.MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

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

이렇게 되면 UnityEngine의 MonoBehaviour를 빌려오는 것이기 때문에 반드시 using을 사용하여 UnityEngine을 명명해줘야 한다.


MonoBehaviour & Unity Event Function

MonoBehaviour : 모든 유니티 스크립트의 부모가 되는 클래스
Event Function : 유니티에 의해 순서대로 호출되는 특별한 함수

MonoBehaviour는 유니티 엔진이 전역으로 뿌리는 메시지를 받아 처리하는 것이 주목적. Start(), Update() 등 일부 이벤트 함수들이 하나라도 구현되어 있으면 인스펙터에 MonoBehaviour on/off 체크 박스가 표시된다.

Start() : 주로 초기화에 쓰이는 함수. MonoBehaviour가 위치한 씬에서 Update() 전에 단 한 번 호출
Update() : 매 프레임 처리를 하는 함수
Awake() : Start()에서 호출되는 초기화보다 더 빠른 초기화 구간에 사용. MonoBehaviour가 꺼져있어도 호출

private void Awake()
{
    Debug.Log("Awake() function has been called.");
}

// Start is called before the first frame update
void Start()
{
    Debug.Log("Start() function has been called.");
}

// Update is called once per frame
void Update()
{
    Debug.Log("Update() function being called.");
}

Function & Method : 함수의 두 가지 이름

명령형 프로그래밍(Imperative Programming) : Statement를 통해 프로그램의 상태를 바꾸는 소프트웨어 패러다임

Function은 명령형 언어에서 "특정 명령을 수행하는 절차(procedure)에 붙은 label에 지나지 않는다. 즉, 함수는 '명령을 수행하는 절차'로서의 코드의 묶음에 붙인 이름표에 불과하다.

Method는 객체지향 프로그래밍에서 "객체가 수신된 메시지를 처리하는 구체적인 방법"으로서 함수를 가리키는 함수의 또 다른 이름

함수(수학)는 선언적(declarative)이고, 함수(컴퓨터 공학)는 명령적(imperative)이다.
x2 - y = a라는 수식을 수학에서는 a에 집중하고, 컴퓨터 공학에서는 a를 구하는 과정에 집중한다.
수학은 'What is'
컴퓨터 공학은 'How to'

 

오카와 노리유키 - 예스24

YOUR EVERY STORY 문화 콘텐츠 플랫폼, 예스24

m.yes24.com


변수와 상수

아주 간단히 변하는 값과 변하지 않는 값

public class MyProgram : MonoBehaviour
{
    float radius;
    const float PI = 3.14f;
    float round;

    // Start is called before the first frame update
    void Start()
    {
        radius = 5;

        round = radius * radius * PI;

        Debug.Log(round);
    }
}

const로 PI를 사실상 상수로 만들어 놓고 값을 가지고 놀 수 있겠다.


Data Type

컴퓨터 연산을 위해 분류해놓은 데이터의 종류

메모리에서 모든 데이터는 0과 1로 이루어져 있다. 데이터의 종류를 구분하지 않으면 각 데이터를 필요에 따라 계산 불가. 이를 위해 'Type System'의 'Data Type'을 지원한다.

대표적으로 int, float, string 등이 있다.

Type Casting : 컴퓨터에서 연산은 같은 타입끼리 할 수 있다. 프로그래머가 필요에 따라 다른 타입으로 변환하는 것을 'Casting'이라 한다. "(int)float"같이 직접 변환하거나, 수학 관련 라이브러리, 클래스의 경우 "as"연산자를 통해 캐스팅 된다.


Stack & Heap

  • Stack : LIFO(후입선출, Last In First Out). 접근 비용이 낮음
  • Heap : 접근 비용이 높다. Garbage Collection 때문에 성능상의 병목이 된다.

스택과 힙의 도식화

 

Stack vs Heap Memory - What are the differences?

In modern programming languages such as C# or Java, we tend to take memory management for granted. Gone are the days when we need to call…

www.alexhyett.com


값 형식(value type)과 참조 형식(reference type) : 구조체와 클래스

값 형식의 스택에 할당되며 해당 코드 영역을 벗어나면 자동으로 메모리에서 해제되는 타입들을 말한다. 대표적으로 int, float, char, struct 등이 있다.

참조 형식은 힙에 할당되며 유니티 엔진의 가비지 컬렉션 호출에 의해 자동으로 메모리에서 해제되는 타입들이다. 대표적으로 object, interface, string, class

구조체(structure) : 값 타입의 대표적인 타입. struct라는 키워드로 선언된다. 흔히 최적화의 목적으로 heap 메모리에 생성되는 클래스 대신 사용

클래스(class) : 참조 형식의 대표적인 타입. class라는 키워드로 선언된다. 모든 MonoBehaviour를 비롯한 유니티 내부의 객체 타입들이며 MonoBehaviour를 상속받지 않는 식으로 프로그래머의 필요에 따라 정의되고 생성된다.


조건문과 반복문

가히 프로그래밍의 핵심

조건문(conditional statement) : 특정 조건에 따라 프로그램 실행 절차의 흐름(flow)를 바꾸는 문장. if, else, else if, switch등. branching등으로 분기를 가를 수 있다.
비교 연산자를 분기 조건으로 사용한다. (부등호, 등호 등)

반복문(repetitive statement) : 특정 조건에 따라 특정 프로그램 실행 절차를 반복하는 문장. for, foreach, do, while 등을 사용한다.
for은 C, C++에서 시작한 관습적으로 쓰이는 대표적인 문법.