늘 컴퓨터 관련 서적을 산적은 많아도 막상 그 책의 마지막 페이지까지 끈기있게 진행해본적은 거의 없었던것같다..
그렇기에 이번엔 위 책을 마지막 페이지가 끝날때까지 끈기있게 공부하며
새로 배운 내용들을 공부일기처럼 이 블로그에 정리해두려고 한다
-----------------------------------
기계어 : 0과 1의 비트로 구성된 언어. 컴퓨터가 이해할 수 있는 언어이다
어셈블리어 : 복잡한 기계어를 사람이 이해할 수 있는 기호나 언어로 바꿔 만든것
컴파일 : 어셈블리어를 일종의 번역 과정을 거쳐 컴퓨터가 이해하는 기계어 코드로 변환하는것
컴파일러 : 프로그래머가 어셈블리어로 코드를 작성한 후에 실행파일을 만들어주는 소프트웨어
프로그램 : 컴파일러가 만들어낸 실행파일
프로그래밍 언어 : 프로그램을 작성하기 위해 만들어진 인공 언어 체계
C# : C++에서 '++'을 한번 더 붙인것으로 C++을 계승하는 의미에서 붙여졌지만
전혀 다른 사람이 만들었고, 실제 C나 C++로 작성된 소스 코드는 C#에서 컴파일되지 않는다
C#의 확장명은 cs이다.
이름이 Hello.cs인 소스파일을 컴파일러에게 넘겨주면 Hello.exe 실행파일을 만든다
프로젝트 파일의 확장면은 csproj 이다
<객체지향 프로그래밍>
객체 지향 프로그래밍(OOP, Object-Oriented Programming)은 "객체" 라는 개념을 중심으로 프로그래밍하는 방식.
쉽게 말해, 현실 세계의 사물을 코드로 표현하고 다루는 방법이라고 보면 된다
햄버거 가게를 만든다고 가정해보자.
1️⃣ 객체(Object)란?
객체는 현실 세계의 사물(개념) 하나하나를 코드로 표현
예를 들어, 햄버거 가게에는 햄버거, 직원, 손님, 주문 같은 객체들이 있다.
2️⃣ 클래스(Class)란?
클래스는 객체를 만들기 위한 설계도.
예를 들어, "햄버거"라는 클래스를 만든다면, 거기에는 재료, 가격, 크기 같은 정보(속성)와 굽기, 포장하기 같은 행동(메서드)이 포함될 수 있다
class Hamburger {
public string name;
public int price;
public void Cook() {
Console.WriteLine(name + "를(을) 만들고 있어요!");
}
}
이제 이 클래스를 바탕으로 실제 햄버거를 만들 수 있다
Hamburger cheeseBurger = new Hamburger();
cheeseBurger.name = "치즈버거";
cheeseBurger.price = 5000;
cheeseBurger.Cook(); // "치즈버거를(을) 만들고 있어요!"
여기서 cheeseBurger는 "햄버거" 클래스의 객체(인스턴스) 다.
객체 지향 프로그래밍에는 4가지의 핵심 개념이 있다
- 캡슐화(Encapsulation)
- 객체의 속성과 동작을 감추고, 필요한 것만 공개
- (예: 햄버거의 레시피는 가게 내부에서만 알지만, 손님은 "치즈버거 주세요!"라고만 요청하면 됨)
- 상속(Inheritance)
- 기존 클래스를 확장해서 새로운 클래스를 만들 수 있음
- (예: Hamburger 클래스를 상속받아 CheeseBurger 클래스를 만들 수 있음.)
- 다형성(Polymorphism)
- 같은 기능을 하는 여러 객체가 서로 다르게 동작할 수 있음
- (예: Cook() 메서드는 Hamburger와 VeggieBurger에서 다르게 구현될 수 있음.)
- 추상화(Abstraction)
- 복잡한 내용을 감추고, 핵심적인 기능만 노출
- (예: 손님은 "햄버거 주세요!"라고만 말하면 되고, 내부적으로 어떻게 만드는지는 몰라도 됨.)
난 이걸보고 든 생각이 프로그래밍 다 이렇게 하지 않나...? 였다
그래서 더 찾아보니 절차지향, 함수형, 선언형, 이벤트 기반 등등 다양한 프로그래밍 방식들이 있었다
예를들어 대표적인 선언형 프로그래밍은 "어떻게" 보다 "무엇을"할지에 집중하는 방식으로
주로 SQL, HTML, CSS에서 사용한다고 한다
SELECT * FROM users WHERE age > 18;
또 예를들어 이벤트 기반 프로그래밍은 실제 유니티에서도 자주 사용하는 방식으로
using UnityEngine;
using UnityEngine.UI;
public class ButtonClickExample : MonoBehaviour {
public Button myButton;
void Start() {
myButton.onClick.AddListener(OnButtonClick);
}
void OnButtonClick() {
Debug.Log("버튼이 클릭됨!");
}
}
사용자의 행동(이벤트)에 따라 프로그램이 반응하도록 만들기도 한다
그렇다고 뭐 하나를 만들때 무조건 하나만 선택하여 만드는게 아니라 필요한대로 조합한다고 한다
예를들어 게임개발은 객체지향 + 이벤트 기반을 조합하여 주로 사용한다고 한다
<.NET>
부끄럽지만 c#을 사용하면서 .Net이 정확히 어떤 의미인지도 모르고 있었다
쉽게 말해서 .NET은 마이크로소프트가 만든 개발 플랫폼으로 "앱을 만들 수 있는 도구 세트"이다
단순한 프로그래밍 언어가 아니라 "앱을 개발할 수 있는 환경(플랫폼)" 이다
예를 들면
- C# 같은 언어를 이용해서
- 윈도우, 웹, 모바일, 게임 등 다양한 프로그램을 만들 수 있다
특히 .NET 하나로
윈도우 프로그램 (WPF, WinForms)
웹사이트 & 웹앱 (ASP.NET, Blazor)
모바일 앱 (Xamarin, MAUI)
게임 (Unity에서 C# 사용 - 사실상 .NET 기반!)
클라우드, 서버, AI 개발 등
하나의 기술로 여러 플랫폼을 개발할 수 있다는게 장점이다
그럼 내가 왜 .NET을 알아야 하느냐.
유니티는 C#을 사용하고 C#은 .NET기반이다.
즉 C#을 쓴다?" = "자동으로 .NET을 쓰고 있다
우선은 이 정도만 알고 넘어가자.
----------------------------------------
-----------------------------------
자 드디어 비쥬얼 스튜디오도 열었겠다
남은건 직접 코드를 짜보는일이다
using System;
using static System.Console;
namespace Hello
{
class MainApp
{
static void Main(string[] args)
{
if(args.Length == 0)
{
Console.WriteLine("사용법 : Hello.exe <상은>");
return;
}
WriteLine("Hello, {0}!", args[0]);
}
}
}
정말 기초가 되는 코드. 이걸 몰라서 적는게 아니다.
이제부터 하나하나씩 코드들을 뜯어보며 기본부터 제대로 알아가보겠다
using System;
말그대로 System을 사용하겠다는것
여기서 System이란? C# 코드가 기본적으로 필요로 하는 클래스를 담고 있는 네임 스페이스이다
만약 저 코드가 없었다면
Console.WriteLine > System.Console.WriteLine 이었을것이다
즉 일일이 기능 앞에 System을 붙여줘야하는 수고를 덜어준것
using static System.Console;
Console.WriteLine > WriteLine으로 줄여주도록 해준다
그래서 풀코드를 보면 Console.WriteLine, WriteLine 이 두가지의 케이스가 전부 작동하는것을 볼 수 있다
namespace Hello
{
class MainApp
{
static void Main(string[] args)
{
if(args.Length == 0)
{
Console.WriteLine("사용법 : Hello.exe <상은>");
return;
}
WriteLine("Hello, {0}!", args[0]);
}
}
}
네임 스페이스란 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자 등을 하나의 이름 아래 묶는 역할이다
.NET 클래스 라이브러리에 1만개가 넘어가는 클래스가 있어도 프로그래머들이 헷갈려하지 않는 이유이다
대형마트에 수만가지 상품이 있어도 쉽게 내가 찾는 물건을 고를수 있는것과 같은 이치이다
위에 보이는것처럼 namespace 키워드를 사용하며 뒤에는 이름을 넣어주면 된다
그리고 괄호 사이에는 이 네임스페이스에 소속되는 클래스 등이 들어간다
namespace Animals
{
class Dog
{
public void Bark()
{
Console.WriteLine("Woof!");
}
}
}
namespace Vehicles
{
class Car
{
public void Drive()
{
Console.WriteLine("Vroom!");
}
}
}
class Program
{
static void Main(string[] args)
{
// 두 개의 다른 네임스페이스에서 동일한 이름을 가진 클래스를 사용할 수 있음
Animals.Dog dog = new Animals.Dog();
dog.Bark();
Vehicles.Car car = new Vehicles.Car();
car.Drive();
}
}
좀 더 네임스페이스를 이해하기 쉽게 풀어쓴 코드이다
namespace Hello
{
class MainApp
{
// 본격적인 프로그램 시작
static void Main(string[] args)
{
if(args.Length == 0)
{
Console.WriteLine("사용법 : Hello.exe <상은>");
return;
}
WriteLine("Hello, {0}!", args[0]);
}
}
}
그 다음은 이름이 MainApp이라는 클래스를 만들어주었다
#2 유니티 엔진 동작 원리 (클래스,메서드,상속,컴포넌트, 브로드캐스팅, MonoBehavior)
이번글에서는 유니티에서 엔진이 동작하는, 정확히는 게임 속 모든 오브젝트들이 움직이는원리에 대해서 알아보려고 한다 그전에, 이미 다른글에도 정리되어 있지만 가장 기본이며 가장 많이
sangeun00.tistory.com
클래스는 이 글에서도 다뤘지만 C# 프로그램을 구성하는 기본단위로 데이터,변수와 메서드로 이루어져 있다
그리고 이 밑에 Main 메서드가 들어가있고 여기서부터 본격적으로 프로그램이 시작된다고 보면 된다
namespace Hello
{
class MainApp
{
// 본격적인 프로그램 시작
static void Main(string[] args)
{
if(args.Length == 0)
{
Console.WriteLine("사용법 : Hello.exe <상은>");
return;
}
WriteLine("Hello, {0}!", args[0]);
}
}
}
그냥 보기엔 단순히 Main이라는 이름을 가진 메서드처럼 보이지만 이 메서드는 프로그램의 진입점으로
프로그램이 시작되면 이 메서드가 시작되고,
이 메서드가 종료되면 프로그램이 종료된다. 따라서 모든 프로그램은 Main 메서드를 가지고 있어야....하지만
이건 어디까지나 .NET 5 기준이며 .NET 8은 메인 메서드가 필요없어졌다.
하지만 왜 굳이 구버전 기준으로 공부하느냐! 왜냐면 아직도 현재 게임회사들은 보수가 용이한 구버전을 주로 사용하기 때문. 실제로 유니티에서는 신버전들을 제대로 지원해주기까지 시간이 굉장히 오래 걸린다
그러니 기왕이면 구버전으로 배우는게 취업에도 더 용이할것이다
메서드는 함수라고 불리기도 한다. 말 그대로 어떠한 값을 집어넣으면 어떠한 값이 나오도록 하는 함수
static void Main(string[] args)
좀 더 하나씩 보면서 파보도록 하자
가장 먼저 static은 한정자로써 메서드나 변수등을 수식한다
보통 C# 프로그램의 각 요소들은 코드가 실행되는 시점에야 비로소 메모리에 할당되지만
static 키워드로 수식되면 프로그램이 처음 구동될때부터 진작에 메모리에 할당이 된다는 차이가 있다
만약 Main() 메서드에 static 키워드로 수식되어 있지 않다면 진입점을 찾지 못하고 프로그램에 에러가 나버린다
(아 이래서 static을 쓰는구나....처음 알았다)
void는 메소드 반환 형식. 반환하는게 없다면 아무런 결과도 돌려주지 않는다(void : 비어있는)
Main은 메서드 이름. 그리고 그 뒤에 있는 (string[] args)는 메소드에 입력되는 매개변수이다.
이런 경우에는 프로그램을 실행할때 입력하는 매개변수가 입력된다
'C# > 1. 데이터 보관과 가공 & 코드의 흐름제어' 카테고리의 다른 글
연산자(증가/감소연산자, 조건연산자), 반복문, 점프문 (3) | 2025.03.12 |
---|---|
상수와 열거형식, Nullable, var, 문자열 다루기 (0) | 2025.03.11 |
CLR, 변수, 스택과 힙, 데이터 형식, 박싱&언박싱, 형식 변환 (1) | 2025.03.04 |