맨 처음 입력 값을 받을 때에는 단순히 텍스트 길이로 계산을 해서 문자 상관없이 무조건 입력 값 하나당 길이가 1이었다. 하지만 보통 한글은 2byte, 영어/공백/특수문자는 1byte로 계산을 하기 때문에 이를 맞춰주기 위해 로직을 다시 작성했다. [ Encoding.Defalut ]int userNameByteCnt = Encoding.Defalut.GetByteCount(inputUserName.text);int farmNameByteCnt = Encoding.Defalut.GetByteCount(inputFarmName.text);Defalut로 했을 때에는 한글은 3byte, 영어는 1byte로 계산이 돼서 한글을 6글자로 제한하면 영어는 18글자까지 입력 가능해서 원하는 대로 동작하지 않았다...
[ 절차 지향 VS 객체 지향 ]이전에는 순서대로 코드를 실행하는 방식인 절차 지향 프로그래밍으로 개발을 했다. 그러나 복잡한 시스템에서는 코드를 관리하고 오류를 추적하는 것이 어려우며, 한 부분에서 문제가 발생하면 이후의 모든 절차에 영향을 줄 수 있다는 단점이 있었다. 이러한 문제를 보완하기 위해 등장한 방식이 객체 지향 프로그래밍이다. 데이터와 함수를 객체 단위로 묶어서 각 객체가 독립적으로 동작할 수 있게 하여 재사용성을 높이고 유지보수가 편리해졌다. [ 특징 ]객체 지향 프로그래밍의 가장 큰 특징은 아래 4가지가 있다.① 추상화: 공통적인 속성과 기능을 추출하여 정의한다② 상속: 기존 코드를 확장하여 새로운 기능을 만들 수 있다③ 다형성: 같은 메서드와 클래스를 다른 방식으로 구현할 수 있다④ ..
[ 제네릭 ]제네릭은 데이터 타입을 일반화해서 다양한 자료형에 대응할 수 있게 한다. 를 사용해서 특정 자료형 없이 선언한 뒤, 이를 사용할 때 원하는 자료형을 입력한다. 제네릭을 사용하면 코드를 재사용성을 높이고, 컴파일 오류를 줄여 타입 안전성을 제공한다. public class Inventory{ private T content; public void Put(T item) { content = item; } public T Get() { return content; }}제네릭 타입 를 사용해서 특정 자료형을 미리 정의하지 않고 아이템을 저장하거나 꺼낼 수 있는 코드를 작성했다. public class Program{ public s..
[ 로직 설계하기 ]노션에 구현할 기능에 대한 요소들을 정리한 뒤, 이를 바탕으로 코드를 짰다.먼저 콘솔 창에 보이길 원하는 화면을 적는다. 화면의 내용들이 보이기 위해서 필요한 코드들을 구현해 나가는 방식으로 진행하면, 일이 훨씬 수월하게 진행된다.저 기능을 어디에 구현해야 할지 위치를 파악하기 위해서 어떤 시점에서 해당 기능이 구현되는지도 정리했다. 이름 입력 메서드 마지막에 직업 선택 메서드를 불러오고, 직업 선택이 끝나면 메인 메뉴 메서드를 불러오면 된다.이외에도 직업에 관련된 정보들을 미리 정리해 놓고, 클래스나 코드를 미리 구현해서 실행시켜 보기도 했다.최종적으로 완성된 코드는 처음과는 매우 달랐지만, 노션을 통해 내 생각을 정리함으로서 빠르게 시작할 수 있었고 어떤 순서로 진행해야 할지도 감..
[ 추상 클래스 ]구조public abstract class Character{ public int Health { get; set; } public abstract void Move(); public void TakeDamage(int damage) { Health -= damage; }}추상 클래스는 접근제한자 뒤에 abstract 키워드를 넣어서 만들 수 있다. 클래스 내에는 abstract 키워드가 있는 추상 메서드와 넣지 않은 일반 메서드가 포함된다. 추상 메서드는 구체적인 구현을 포함하지 않고 선언만 한다. public class Player : Character{ public override void Move() { Deb..
[ 클래스 ]클래스 변수 사용//옳은 예class Program{}class StartGarme{}//틀린 예class Program{ class StartGame { }}클래스는 클래스를 변수로 사용할 수 있다. 이 말은 하나의 파일에 여러 개의 클래스가 들어갈 수 있다는 것이고, 이중클래스의 의미는 아니다. 메모리 구조메모리의 구조는 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 있다.코드 영역은 사용자가 실제로 작성한 코드가 실행되는 곳이다.데이터 영역은 대표적으로 static을 사용한 코드가 있다. static은 프로젝트 전반에 필요하고 공유되어야 하는 데이터에 사용한다. int num; 처럼 변수를 선언했을 때에는 스택 영역에 들어간다. 그리고 num 변수에 값 1을 할당..
다중 상속은 이름이 같은 멤버가 있을 때 어떤 부모 클래스의 것을 사용해야 하는지 모호해지고, 이렇게 이름이 충돌했을 때 이를 명확히 해주어야 하기 때문에 코드가 복잡해진다. 따라서 단일 상속을 통해서 관계를 명확하고 단순하게 해서 코드의 가독성과 이해도를 높인다. 하지만 경우에 따라서 다중 상속이 필요할 때도 있다. 이럴 때는 인터페이스라는 개념을 사용한다. [ 인터페이스 ]public interface IItemPickable{ void PickUp();}public interface IUseable{ void Use();}public class Item : IItemPickable, IUseable{ public string Name { get; set; } public voi..
[ 배열 VS 리스트 ]배열(Array)은 크기가 1로 고정되지 않고, 확장성을 가지고 있어 크기를 그 이상으로 설정할 수 있다. 하지만 한 번 크기를 설정하고 난 이후에는 크기를 바꿀 수 없는 정적 배열이다. 만약 크기를 바꾸고 싶다면 새로운 배열을 선언해야 한다. 게임에서는 스킬들을 배치하는 스킬 단축키에서 쓰일 수 있다. 메모리에 데이터가 연속적으로 저장되어 있고, 메모리 내에 데이터들이 정리가 되어 있기 때문에 새로운 데이터를 추가할 수가 없다. 따라서 원래 배열에서 새로운 데이터를 추가하고 싶다면, 기존의 배열을 바탕으로 새로 생성해서 자리를 만들어야 한다. 하지만 자리가 고정되어 있기 때문에 접근하는 것이 용이하다. 선언한 크기를 모두 사용하면 리스트보다 메모리를 효율적으로 사용할 수 있지만,..
[ 멤버 ]멤버는 클래스와 구조체에서 객체의 데이터와 동작을 나타낸다. 대표적으로 다음과 같은 요소들이 있다. 이외 다른 요소들은 하단의 링크에서 확인할 수 있다.필드객체의 데이터를 저장하는 변수메서드객체가 수행할 수 있는 행동생성자객체를 처음 생성할 때 초기화하는 메서드이벤트다른 객체에게 특정 액션에 따른 알림 제공 ▼ 참고 자료https://learn.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/members [ 클래스 상속 ]public virtual string클래스를 상속할 때 사용되는 키워드는 virtual과 override이다.상속을 하는 부모 클래스에서 virtual 키워드가 있는 멤버는 파생 클래스에서 재..
오늘은 C#으로 던전을 떠나기 전 마을에서 무기를 구하는 콘셉트의 Txt 게임을 만들었다. [ 변수 참조하기 ]문제점public static void State(){ int gold = 1500; Console.WriteLine($"Gold: {gold} G\n");} public static void Store(){ Console.WriteLine("[보유 골드]"); Console.WriteLine("{gold} G\n"); //에러}Store 메서드에서 State 메서드에 있는 gold를 참조하고 싶은데, 계속해서 에러가 났다. 시도한 것public static void Store(){ int state = State();}객체를 생성해서 참조하려고 했지만, State 메..
[ 연산자 ]산술 연산자+, -, *, /, %간단히 말해 사칙연산을 하는 연산자이다. /, %는 자료형에 따라 쓰임새가 다른데, int에서 /는 소수점 없이 몫이 나오고 %는 나머지 값이 나온다.정수형끼리 연산을 할 때 결과값을 소수점을 포함한 실수형으로 나오게 하고 싶다면, 둘 중 하나는 실수형으로 바꿔주어야 한다. 할당 연산자+=, -=, *=, /=, %=변수에 값을 할당함과 동시에 연산을 하는 연산자이다. 단항 연산자x++: 변수값 사용 후 1을 더해줌x- -: 변수값 사용 후 1을 빼줌++x: 변수값 사용 전 1을 더해줌- -x: 변수값 사용 전 1을 빼줌 비교 연산자==, !=, >, =, 두 값이 동일한지 비교하거나, 크기를 비교한다. 논리 연산자&&: 그리고(AND)x × y*참은 1, ..
[ 문자열 처리 메서드 ]문자열 생성string str = new string('s', 7);Console.WriteLine(str);//출력결과sssssssnew 키워드를 사용해서 char 문자와 개수를 지정하면 생성할 수 있다. 분할string str = "Hello, World!";string[] split = str.Split(", ");Console.WriteLine(split[0]);Console.WriteLine(split[1]);//출력결과HelloWorld!Split()은 괄호 안의 값을 기준으로 나누는 것이다. ※ 주의할 점ⓛ 나눈 값을 할당할 변수는 대괄호를 붙여서 배열로 생성해야 한다.② 출력할 때 나눈 값들을 보고 싶다면 인덱싱을 이용해야 한다.③ 나누는 기준이 되는 문자가 1개라..
[ C# 기초 ]개념Unity에서는 C#을 사용하므로, C#에 대해 보다 정확하고 기본적인 개념을 알고 가야 한다. C#은 마이크로소프트에서 개발한 객체 지향 프로그래밍 언어이다. 자바와 구조가 비슷하고 C++의 기능을 혼합했기 때문에, 두 가지 언어를 배웠다면 C#을 좀 더 수월하게 공부할 수 있다.객체 지향 프로그램이란 프로그램을 만들 때, 데이터와 메서드를 하나의 단위로 묶은 객체들의 모임으로 구현하는 것이다. 프로그램 제작에 사용될 객체들을 만들어 놓고, 필요할 때마다 이를 가져가 조립하는 방식이다.객체 지향 프로그래밍은 이미 개발된 코드들을 재사용할 수 있어서, 개발에 드는 시간과 비용을 줄일 수 있다. 또한 수정이 필요할 때 객체 단위로 수정이 가능해 유지보수가 간편하고, 상속 기능을 이용해서..
[ 배열 생성 ] string food = "치킨"; food = "피자";//데이터 대체 → 출력결과: 피자 string food = "떡볶이";//중복 변수명 → 오류 food 변수를 생성하고 치킨을 저장했다. 여기에 추가로 데이터를 저장하고 싶어서 피자를 입력했다. 하지만 food 변수에는 치킨과 피자 둘 다 저장되는 것이 아니라, 피자가 기존의 치킨 데이터를 대체하여 피자만 저장된다. 또한 떡볶이를 추가로 저장하고 싶어서 food라는 동일한 변수명으로 변수를 새로 생성하게 되면 오류가 발생하게 된다. 이처럼 한 변수에 다양한 데이터를 저장하고 싶을 때는 배열이라는 기능을 사용한다. string[] name;//string 배열 int[] age;//int 배열 배열을 사용하려면 데이터 형식 뒤에 ..
[ 연습문제 ] Practice 6 1번: 구구단 2단 만들기 반복문을 활용하여 구구단 2단 출력 답안 더보기 for (int i = 2; i
[ for문 ] for (초기화; 조건; 변화) { 실행 내용 } 어떤 일을 여러 번 실행할 때 사용한다. 초기화는 맨 처음에 주어지는 값이고, 조건은 언제까지 for문을 작동할지 알려주는 값이고, 변화는 얼마만큼 데이터를 변화시킬지 알려주는 값이다. for문이 작동되면 초기화 값에서부터 조건을 만족하는한 계속 반복하며 데이터를 변화시킨다. for (int i = 1; i
[ 연습 문제 ] Practice 3 프로그램 실행 중에 데이터를 입력받을 수 있는 Console.ReadLine();이라는 함수를 이용하여 풀이를 진행한다. string input = Console.ReadLine(); //데이터를 입력하고 Enter를 누르면 다음으로 넘어간다 Console.WriteLine("입력받은 데이터는 " + input + " 입니다."); 캐스팅의 TryParse를 활용한다. 1번: 입력받은 데이터가 숫자인지 문자열인지 판단 입력받은 데이터가 숫자라면 숫자입니다. 메시지 출력 숫자가 아니라면 문자열입니다. 메시지 출력 답안 더보기 string input = Console.ReadLine(); int num; bool isInt = int.TryParse(input, out ..
[ if문 ] if (조건) { 실행 코드 } 조건에 일치하면 중괄호 내의 코드를 실행한다. 조건을 만족하지 않으면 실행하지 않고, 출력값도 없다. 여기에서의 조건은 계산이 맞는지를 확인하는 논리 연산(같음, 비교 등)이다. int i = 10; if (i > 5) { Console.WriteLine("i는 5보다 큽니다."); }//i는 5보다 큽니다. 위 코드에서의 i는 10으로, 5보다 크기 때문에 조건을 만족하여 i는 5보다 큽니다라는 문장을 출력했다. [ else if문 ] if (조건) { 실행 코드 } else if (조건) { 실행 코드 } if문 아래에 위치하며, 앞에서 조건을 만족하지 못했을 때 다음으로 조건을 확인한다. if문과 마찬가지로 조건을 만족하면 코드를 실행한다. if문에서 ..
[ 산술 연산 ] 사칙연산 산술 연산은 +, -, ×, ÷ 등의 연산자를 이용해 숫자들을 계산하는 것이다. + 더하기 - 빼기 * 곱하기 / 나누기 % 나머지 ++ 증가 -- 감소 더하기(+) int x = 10; int result; result = x + 5;//result = 15 빼기(-) int x = 10; int result; result = x - 5;//result = 5 곱하기(*) int x = 10; int result; result = x * 5;//result = 50 나누기(/) int x = 10; int result; result = x / 5;//result = 2 / 연산보다 * 연산이 더 빠르게 처리되므로, * 연산 사용이 더 권장된다. 나머지 int x = 10; i..
[ 자료형 ] 숫자 숫자는 크게 정수와 실수 두 가지로 나뉜다. int age = 22; int amount = 7; int level = 100; 정수는 소수점이 없는 숫자를 의미한다. 부호 상관없이 소수점이 없다면 -3, 0, 5와 같은 형태 모두 정수이다. 정수는 int 타입을 사용한다. (integer) float exp = 2053.234f; float speed = 15.5f; double length = 60.12345d; 실수는 소수점이 있는 숫자를 의미한다. 마찬가지로 부호 상관없이 소수점이 있기만 하다면 모두 실수이다. 실수는 float 타입과 double 타입을 사용한다. float 타입은 소수점 7자리까지 표현할 수 있고, double 타입은 소수점 15~16자리까지 표현할 수 있다..
[ 새 프로젝트 추가 ] 하나의 솔루션 안에서 다양한 프로젝트를 관리할 수 있다. 솔루션 탐색기에서 솔루션 'FirstProgram'에 대고 오른쪽 클릭을 하거나, 선택 후 솔루션 탐색기 창 내에서 오른쪽 클릭을 한다. 그중 추가 → 새 프로젝트를 클릭한다. 만약 다른 프로젝트가 선택되어 있다면 다른 창이 보이고, 새 프로젝트 추가 버튼을 볼 수 없다. 이후 방법은 처음 프로젝트를 만들 때와 동일하다. 콘솔 앱을 선택하고 다음을 누른다. 원하는 프로젝트 명을 입력하고 다음을 누른다. 처음 프로젝트를 만들 때와 다른 점은 솔루션의 이름을 입력하는 칸이 없다. FirstProgram 솔루션 안에 새 프로젝트를 생성하는 것이기 때문에, 파일 경로가 WorkSpace에서 끝나는 것이 아니고 FirstProgra..
[ 환경설정 ] Unity에서 지원하는 언어는 C#이므로, 먼저 C#에 대해 알아야 한다. C#을 배우기 위한 프로그램으로 Visual Studio Tools를 사용하며, 아래 사이트에서 설치할 수 있다. https://visualstudio.microsoft.com/ko/downloads/ Visual Studio Tools 다운로드 - Windows, Mac, Linux용 무료 설치 Visual Studio IDE 또는 VS Code를 무료로 다운로드하세요. Windows 또는 Mac에서 Visual Studio Professional 또는 Enterprise Edition을 사용해 보세요. visualstudio.microsoft.com 주의할 점은 Visual Studio Code(왼)가 아니라 ..