[ 목차 ]
오늘은 네임스페이스와 구조체에 대해서 알아보는 시간~!
매일 블로그를 쓰면서
이 내용 저 내용 다룰 때마다
파이팅 하자는 마음다짐의 글을 적고 시작하는데..
사실 이제 뭘 적어야 할지 모르겠어요😢
그러니까!
그냥 파이팅^^!
1. 네임스페이스 (namespace)
네임스페이스란?
클래스, 함수, 변수 이름이 충돌하는 것을 방지하기 위해 사용된다.
그렇다고 다른 네임스페이스에 있는 것은 못 쓰냐?
그건 아니다. 쓸 수 있다.
함수를 구분하는 것처럼 구분하는 느낌이라고 생각하면 될 것 같다.
namespace dev1
{
class MyClass
{
public static void SayHello()
{
//Console.WriteLine("안녕하세요 !MyNamespace의 MyClass입니다.");
}
}
}
namespace _2025_02_27
{
class Program
{
public static void SayHello()
{
Console.WriteLine("HelloSay");
}
static void Main(stirng[] args)
{
_2025_02_27_1.MyClass.SayHello(); // 결과 값 : SayHello
SayHello(); // 결과 값 : HelloSay
}
}
}
람다식
여기서 번외로 람다식이란 게 있다.
람다 식이란?
람다 선언 연산자(=>)를 사용하는 익명 함수이다.
사용할 때의 장점은 메서드를 보다 짧고 직관적으로 정의할 수 있다.
아래의 코드를 보면 중괄호를 생략할 수 있다는 점이다.
중괄호 외에도 return 키워드 생략이 가능하고 후에 배울 LINQ 쿼리에도 나오게 된다.
static int AddArrow(int a, int b) => a + b;
//중괄호 {} return 생략 가능
//일반적인 함수
static void PrintMessage()
{
Console.WriteLine("안녕하세요");
}
static void PrintMessageArrow() => Console.WriteLine("안녕하세요");
static void Main(stirng[] args)
{
//C# 화살표 함수
//C#에서 화살표 함수 => 람다 표현식 이라고도 함
// 간결한 방식으로 함수를 정의 할 수 있다.
Console.WriteLine(Add(3, 5)); // 결과 값 : 8
Console.WriteLine(AddArrow(3, 5)); // 결과 값 : 8
PrintMessage(); // 결과 값 : 안녕하세요
PrintMessageArrow(); // 결과 값 : 안녕하세요
}
Math 클래스
Math 클래스가 무엇이냐?
영어 그대로 수학적 계산이라는 것이다.
파이나 루트 제곱 반올림 등등 수학 관련된 메서드 종류이다.
이것 외에도 더 많은 Math 클래스가 있으니
현재는 간단한 메서드에 대한 예제로 실습하였다.
static void Main(string[] args)
{
//Math클래스 사용
//수학적 계산
Console.WriteLine("Pi : " + Math.PI); //파이
Console.WriteLine("Square root of 25 : " + Math.Sqrt(25)); //루트
Console.WriteLine("Power (2^3) : " + Math.Pow(2, 3)); //제곱
Console.WriteLine("Round (3.75 : " + Math.Round(3.75)); //반올림
}
열거형 (Enumeration)
열거형은 무엇이냐?
간단히 말하면 상수 값의 집합이다.
숫자 값에 이름을 부여하는 자료형이며, 가독성을 높이고 의미 있는 값으로 표현 가능하다.
기본적으로 첫 번째 값은 0부터 시작하며 1씩 증가한다.
보통 enum 키워드를 사용하여 정의한다.
숫자를 일일이 지정해주지 않아도 알아서 값을 순서대로 지정해 준다.
enum DayOfWeek
{
Sunday , // 0
Monday, // 1
Tuesday, // 2
Wednesday, // 3
Thursday, // 4
Friday, // 6
Saturday // 7
}
static void Main(string[] args)
{
DayOfWeek today = DayOfWeek.Wednesday;
Console.WriteLine(today); // 결과 값 : Wednesday
Console.WriteLine((int)today); // 결과 값 : 3
}
혹여나
0부터 시작하는 순서가 마음에 들지 않을 수도 있다.
그럴 때는 enum에 있는 변수에 값을 지정해 주는 것이다.
값을 지정하고 위에 코드처럼 호출할 때 (int)변수명 을 넣어주면 된다.
//2. enum 값 변경 (0부터 시작하고 싶지 않을때)
enum StatusCode
{
Success = 200,
BadRequest = 400,
Unaauthorized = 401,
NotFound = 404
}
static void Main(string[] args)
{
StatusCode code = StatusCode.Success;
Console.WriteLine(code + " : " + (int)code); // 결과 값 : Success : 200
}
열거형 + 함수
열거형과 함수를 통한 실습을 진행하였다.
열거형으로 무기를 늘어놓고 조건문을 통해 선택한 것을 호출한다.
enum Weapontype
{
Sword,
bow,
Staff
}
static void ChooseWeapon(WeaponTypeCode weapon)
{
if(weapon == WeaponTypeCode.Sword)
{
Console.WriteLine("검을 선택했습니다.");
}
else if(weapon == WeaponTypeCode.Bow)
{
Console.WriteLine("활을 선택했습니다.");
}
else if(weapon == WeaponTypeCode.Staff)
{
Console.WriteLine("스태프를 선택했습니다.");
}
}
static void Main(string[] args)
{
ChooseWeapon(Weapontype.Sword);
}
2. 구조체
클래스와 비슷하지만 값 타입(Value Type)이며, 가볍고 빠르다.
주로 간단한 데이터 묶음을 만들 때 사용한다.
보통 구조체를 정의할 때 struck 문을 사용한다.
struck 문은 두 개 이상의 변수가 있는 새로운 데이터 형식을 정의한다.
변수를 정의할 때
public 은 외부에서도 사용 가능하게 하는 권한이다.
private은 나만 사용하려고 만든 키워드이며, 코드를 숨긴다는 느낌이다.
그렇게 만든 구조체는 Main 호출에서
Point (변수명);
구조체 선언을 한다.
구조체는 클래스와 다르게 new 없이 사용 가능하다.
모든 필드를 반드시 초기화해야 한다.
//C# 구조체
//클래스와 비슷하지만, 값 타입(Value Type)이며 가볍고 빠름
//주로 간단한 데이터 묶음을 만들때 사용
struct Point
{
//public : 어디서든 사용가능하게 권한
//private : 나만 사용하려고 하는 키워드
public int X;
public int Y;
//생성자 정의 -> 처음에 생성할 때 동작하는 함수
public Point(int x, int y)
{
X = x;
Y = y;
}
public void Print()
{
Console.WriteLine($"좌표: {X}, {Y}");
}
}
static void Main(string[] args)
{
Point p; //구조체 선언 (초기화 필요)
p.x = 10;
p.y = 10;
p.Print();
}
//struct Point는 X,Y 좌표 값을 저장하는 구조체
//구조체는 클래스와 다르게 new 없이 사용 가능
//struct에도 생성자 사용 가능(매개변수를 통한 초기화 함수)
//모든 필드를 반드시 초기화해야 함
열거형과 람다식을 활용한 실습이다.
struct Rectangle
{
public int width;
public int height;
public int GetArea() => width * height;
}
static void Main(string[] args)
{
var rect = new Rectangle { width = 5, Height = 10 };
Console.WriteLine(rect.GetArea()); // 결과 값 : 50
Rectangle R;
R.width = 10;
R.Height = 20;
Console.WriteLine(R.GetArea()); // 결과 값 : 200
}
구조체 배열
구조체 배열이다.
배열을 선언하고, foreach 반복문을 통해 호출한 실습이다.
struct Points
{
public int X;
public int Y;
}
static void Main(string[] args)
{
Point[] points = new Point[2];
points[0].x = 10;
points[0].y = 10;
points[1].x = 20;
points[1].y = 20;
foreach (var point in points)
{
Console.WriteLine($"Point: ({point.x},{point.y})"); //결과 값 : Point: (10,10)
//결과 값 : Point: (20,20)
}
구조체 실습
구조체를 사용해 3명의 학생 국어, 영어, 수학 점수를 받고 출력하는 실습을 하였다.
/* 3명의 학생 국어, 영어, 수학 점수 받고 출력 */
//이름 국어 영어 수학
//홍길동 100 80 70
//홍길동 100 80 70
//홍길동 100 80 70
struct Student
{
public string name;
public int iKor;
public int iEng;
public int iMath;
//학생 정보를 출력하는 함수
public void Print()
{
//-10은 왼쪽에서부터 10칸을 밀어주겠다 (한글은 2칸으로 간주)
Console.WriteLine($"{name,-5} {iKor,5} {iEng,5} {iMath,5}");
}
}
static void Main(string[] args)
{
//학생 배열 선언
Student[] students = new Student[3];
for(int i=0; i<students.Length; i++)
{
Console.WriteLine("학생성적을 입력하세요.");
Console.Write("학생이름: ");
students[i].name = Console.ReadLine();
Console.Write("국어: ");
students[i].iKor = int.Parse(Console.ReadLine());
Console.Write("영어: ");
students[i].iEng = int.Parse(Console.ReadLine());
Console.Write("수학: ");
students[i].iMath = int.Parse(Console.ReadLine());
}
Console.WriteLine("이름 국어 영어 수학");
foreach(Student std in students)
{
std.Print();
}
}
두 번째 실습으로 인벤토리를 만드는 실습을 진행하였다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace lionstudy30_inventory
{
class Program
{
static void start()
{
Console.WriteLine("[인벤토리]");
Console.WriteLine("[Y: 열기]");
Console.WriteLine("[N: 나가기]");
ConsoleKeyInfo key1 = Console.ReadKey(true);
if(key1.Key == ConsoleKey.Y) // Y키를 체크
{
SnowInventory();
}
}
struct Item
{
public string itemname;
public int itemCount;
public Item(string name, int count)
{
itemname = name;
itemCount = count;
}
}
//최대 아이템 개수 (배열 크기)
const int MAX_ITEMS = 10;
//아이템 배열 (이름 저장)
//static string[] itemNames = new string[MAX_ITEMS];
//static int[] itemCounts = new int[MAX_ITEMS];
static Item[] items = new Item[MAX_ITEMS];
//아이템 추가 함수
static void AddItem(string name, int count)
{
for(int i =0; i<MAX_ITEMS; i++)
{
if (items[i].itemname == name) //이미 있는 아이템이면 개수 증가
{
items[i].itemCount += count;
return;
}
}
//빈 슬롯에 새로운 아이템 추가
for (int i = 0; i < MAX_ITEMS; i++)
{
if (items[i].itemname == null)
{
items[i].itemname = name;
items[i].itemCount = count;
return;
}
}
Console.WriteLine("인벤토리가 가득 찼습니다.");
}
static void RemoveItem(string name, int count)
{
for(int i=0; i<MAX_ITEMS; i++)
{
if (items[i].itemname == name) //이름하고 같은지
{
if (items[i].itemCount >= count) //개수가 충분하면 차감
{
items[i].itemCount -= count;
if (items[i].itemCount == 0) //개수가 0이면 삭제
{
items[i].itemname = null;
}
return;
}
else
{
Console.WriteLine("아이템 개수가 부족합니다!");
return;
}
}
}
Console.WriteLine("아이템을 찾을 수 없습니다!");
}
//인벤토리 출력 함수
static void SnowInventory()
{
Console.WriteLine("[현재 인벤토리]");
bool isEmpty = true;
for(int i = 0; i<MAX_ITEMS; i++)
{
if (items[i].itemname !=null)
{
Console.WriteLine($"{items[i].itemname} (x{items[i].itemCount})");
isEmpty = false;
}
}
if(isEmpty)
{
Console.WriteLine("인벤토리가 비어 있습니다.");
}
}
static void Main(string[] args)
{
start();
Console.Clear();
//테스트: 아이템 추가
AddItem("포션", 5);
AddItem("칼", 1);
AddItem("포션", 3); //포션 개수 추가
SnowInventory();
//아이템 사용
Console.WriteLine("포션 2개 사용");
RemoveItem("포션", 2);
SnowInventory();
//테스트: 없는 아이템 제거
Console.WriteLine("방패 1개 제거 시도");
RemoveItem("방패", 1);
SnowInventory();
//테스트: 모든 포션 제거
Console.WriteLine("포션 6개 사용");
RemoveItem("포션", 6);
SnowInventory();
}
}
}
지금까지 네임스페이스, 열거형, 구조체를 알아보았다.
아직도 공부하면서 헷갈리는 점은 많지만,,
요즘 코딩테스트 Lv.0 시작해 봤는데
가장 기초 중에 기초도 헷갈리는 나에겐..
아직 갈 길이 멀었나 보다.. ^,^..
나 개자이너 할 수 있나요 . . . 😫
'Development > 멋쟁이사자처럼 게임개발 부트캠프' 카테고리의 다른 글
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 8일차 - Environment & Stopwatch & 클래스 & 값 형식과 참조 형식 & 문자열 다루기 & 예외 처리 & List & Null (0) | 2025.03.11 |
---|---|
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 7일차 - 클래스 & this 키워드 (4) | 2025.03.09 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 5일차 & 6일차 - 함수 (0) | 2025.03.07 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 5일차 (1) - 배열 & foreach (0) | 2025.03.06 |
[멋쟁이사자처럼 Unity 게임 부트캠프 4기] 4일차 (2) - 반복문 (0) | 2025.03.05 |