2024. 4. 11. 15:05ㆍ나의 개발자 기록/C#
1. 변수
1) 변수의 기본
변수란? 변수는 데이터가 안전하게 살 수 있는 집
변수의 기본 형식 : 데이터 형식 + 변수이름 + 세미콜론
int year; <- 숫자를 보관할 수 있는 변수 / int(데이터형식) age(변수이름);(세미콜론)
string game; <- 문자열을 보관할 수 있는 변수 / string(데이터형식) name(변수이름);(세미콜론)
위처럼 변수를 처음 만드는 것을 "선언한다"라고 한다.
2) 변수의 데이터 저장과 활용 및 수정
변수라는 집을 만들었으면 그 집 안에다가 데이터를 저장할 수 있고, 데이터를 저장했으면 변수라는 집을 활용할 수 있으며 수정도 할 수 있다.
변수의 데이터 저장 및 생성
int year = 2024;
string game = "CSGO"
위와 같이 변수를 만들고 데이터를 넣어주는 것을 "할당"한다고 한다.
그리고 처음 할당하는 것을 "초기화"한다고 한다.
변수의 활용
Console.WriteLine(year); // 결과 : 2024
Console.WriteLine(game); // 결과 : CSGO
변수의 수정
game = "LOL"
Console.WriteLine(game); // 결과 : LOL
2. 자료형
1) 문자열(string)과 문자(char)
문자열은 각각의 문자가 합쳐진 데이터이고 string 이라는 데이터 형식을 사용한다.
문자는 각각의 하나하나의 데이터를 말하는 것이고, char (character)라는 데이터 형식을 사용한다.
char = "공" <- 문자
char = "부" <- 문자
string = "공부" <- 문자열
2) 숫자 : 정수형(int)과 실수형(float, double)
숫자의 데이터 형식에는 정수형과 실수형이 있다.
정수형은 소수점이 없는 숫자를 뜻하고, int 라는 데이터 형식을 사용한다.
실수형은 소수점이 있는 숫자를 뜻하고, float와 double이라는 데이터 형식을 사용한다.
int = 7; <- 정수형 데이터 형식
float = 1.5f; <- 실수형 데이터 형식,
float는 소수점 7자리까지 표시 가능하다.
float는 숫자 뒤에 float의 약자인 f를 붙여야 한다.
double = 1.55d; <- 실수형 데이터 형식
double은 소수점 15~16자리까지 표시 가능하다.
double은 시스템상 숫자 뒤에 아무것도 표시가 없으면 d로 인식하기 때문에 생략 가능하다.
float보다 double의 용량이 크기 때문에 float를 주로 사용한다.
3) 자료형 - Bool
bool (boolean)은 단 두가지의 값을 가지는 자료형이다. 보통 논리 연산의 결과로 얻게 되고, 주로 어떤 계산이 맞았는지 아닌지 확인할 때 사용한다.
true와 false의 값만 가지는 bool
진실과 거짓
참과 거짓
int age = 25;
bool isAdult = age > 19;
결과 : true
4) 다른 자료형
3. 형변환(Casting)
1) 숫자에서 숫자로
숫자를 다를 숫자의 형태로 바꾸는 방법은 사용하고 싶은 변수 앞에 변경하고 싶은 자료형을 소괄호로 명시하면 된다.
숫자에서 숫자로 형변환하는 예
int x = 10;
float y = 10.0f;
int w = x + (int)y;
float m = (float)x + y;
사용하고 싶은 변수 앞에 변경하고 싶은 자료형을 소괄호로 명시
2) 다른 자료형에서 문자로
숫자나 bool 을 문자로 바꾸는 방법은 ToString()을 붙이면 변환할 수 있다.
int x = 10;
string xStr = x.ToString(); // "10"
float y = 10.5f;
string yStr = y.ToString(); // "10.5"
bool myBool = true;
string boolStr = myBool.ToString(); // "true"
3) 문자에서 다른 자료형으로
문자를 다른 자료형으로 바꾸는 방식은 조금 복잡하고 다양한데, 대표적으로 3가지 방법이 존재한다.
Convert()를 이용하는 방법
Convert()를 이용하는 방법
string iStr = "10";
int x;
x = Convert.ToInt32(iStr); // x : 10
string bStr = "true";
bool b;
b = Convert.ToBoolean(bStr); // b : true
Parse() 함수를 이용하는 방법
Parse() 함수 사용
string iStr = "10";
int x;
x = int.Parse(iStr); // x : 10
string bStr = "true";
bool b;
b = bool.Parse(bStr); // b : true
TryParse() 함수를 이용하는 방법, out이라는 어려운 개념이 들어가기 때문에 하단 예시문 참조
TryParse() 함수 사용
string iStr = "10";
int x;
int.TryParse(iStr, out x); // x : 10
string bStr = "true";
bool b;
bool.TryParse(bStr, out b); // b : true
out 키워드는 함수 선언과 호출에 모두 붙여서 사용해야 한다. (한 곳에만 붙일 경우 컴파일 에러가 난다.)
out으로 보내는 변수는 초기화를 생략할 수 있으며, 함수 내부에서는 쓰기만 가능하며 강제됩니다.
4. 연산자
1) 산술 연산
산술 연산은 말이 어려워 보이지만, 그냥 사칙 연산이라고 생각하면 편하다.
산술 연산에는 일반적으로 숫자를 더하고 빼는 등의 계산을 하지만 문자도 계산할 수 있다.
+ 더하기
- 빼기
* 곱하기
/ 나누기
% 나머지
증감연산
++ 증가
-- 감소
x++; 후위 연산
++x; 전위 연산
int year = 2023;
string result = year + "년 입니다.";
Console.WriteLine(result);
실행 결과
2023년 입니다.
2) 논리 연산
논리 연산이란 숫자를 더하거나 빼는 것이 아니라 논리적으로 판단하는 연산자이고, 두 값이 같은지, 다른지, 큰지, 작은지 를 체크하는 것이다.
3) 비트 연산
비트 연산은 어려운 연산을 최적화 할때 사용한다.
5. 제어문
1) 조건문 : if, else if, else, switch case
if문은 조건을 체크해서 만족하면 중괄호 {} 안에 있는 내용을 실행 시키고, 조건을 만족하지 않으면 실행하지 않는다.
조건이라 함은 논리 연산으로 계산된게 맞는지 확인하는 내용이다.
if(3 > 1) <- 3은 1보다 크므로 밑에 내용이 실행됨
{
Console.WriteLine("3은 1보다 크다!");
}
else if는 if문 밑에 따라서 붙고, if문을 만족하지 못했을 때 다시 조건을 체크한다.
int x = 8;
x는 10보다 작기 때문에 if문은 실행하지 않음.
if(x > 10)
{
Console.WriteLine("x는 10보다 크다!");
}
else if(x > 5) <- X는 5보다 크기 때문에 else if 문을 실행한다.
{
Console.WriteLine("x는 10 보다는 작지만 5보다는 크다");
}
else는 if문 밑에 따라서 붙고, if문을 만족하지 못했을때 실행하며, if 와 else 가 있을 때 둘 중 하나만 실행된다.
0은 1보다 작기 때문에 밑의 if문은 실행하지 않음.
if(0 > 1)
{
Console.WriteLine("0은 1보다 크다!");
}
else <- 위의 if문이 틀렸기 때문에 자동적으로 else문이 실행됨.
{
Console.WriteLine("틀렸습니다!!");
}
switch case는 변수 한개를 가지고 그 변수가 무엇인지 확인하는 조건문이고, if ~ else if 로 완벽하게 대체 할 수 있지만 한가지 조건을 더 정교하게 체크할 수 있다.
int x = 5;
switch(x)
{
case 1:
Console.WriteLine("치킨을 주문하자.");
break;
case 2:
Console.WriteLine("피자를 주문하자.");
break;
default:
Console.WriteLine("마라탕을 주문하자.");
break;
}
- case 에 들어가는 조건은 고정된 상수여야 한다.
- 1, 2, 3 : 고정된 값 O
- x > 10 : 변할수 있는 값 X
- int a 등 새로운 변수 활용 X
- case 에 들어가는 조건은 중복되면 안된다.
2) 반복문 : for, while, do while
for은 어떤일을 한번이 아닌 여러번 계속 실행할때 사용하는 기능이고, for문은 식 자체에 초기화, 조건, 변화이 다 있기 때문에 가장 기본적인 사용방법이다. 특수한 경우가 아니면 for문을 사용하는게 편하다.
1부터 세기 시작 ; 10까지 셀것 ; +1 씩 샙니다
for ( int i = 1 ; i <= 10 ; i++ )
{
Console.WriteLine(i); <- 조건을 만족하는한 계속 반복됩니다.
}
실행결과
1
2
3
4
5
6
7
8
9
10
while은 for문에 비해서 생긴것은 더 간단하고, 조건만 체크하면 계속 반복한다. 초기화가 필요하면 while 문과 별도로 해주고, 변화가 필요하면 내부나 외부에서 할 수 있다. 이러한 특징 때문에 외부의 조건에 의해 영향 받을때 사용한다.
1부터 세기 시작
int i = 1;
10까지 셀것
while(i <= 10)
{
Console.WriteLine(i);
i++; <- +1 씩 증가
}
실행결과
1
2
3
4
5
6
7
8
9
10
do while은 조건과 상관없이 일단 내용을 한번 실행하고, 이후 조건에 따라 반복한다. 즉, 조건이 안 맞더라도 한번은 무조건 실행하고 조건에 따라서 반복하기 때문에, 그 이후는 while문과 같다.
int i = 11;
do
{
Console.WriteLine(i);
i++;
}
while(i <= 10)
원래는 11이 10보다 크기 때문에 실행되면 안된다.
하지만 do while 에서는 무조건 한번은 실행된다.
11을 한번 출력하고 종료된다.
3) 조건 제어 : break, continue
break는 실행되고 있는 구문들이 즉시 종료되고, for문과 switch case문에서 사용된다.
switch case의 break 예
int x = 5;
switch(x)
{
case 1:
Console.WriteLine("치킨을 주문하자.");
break; <- 각 구문을 종료할 때 break 를 넣어서 사용한다.
}
for문의 break 예
for(int i = 0 ; i < 5 ; i++)
{
if(i == 3)
{
break;
}
Console.WriteLine(i + "번째 반복입니다.");
}
실행결과
0 번째 반복입니다.
1 번째 반복입니다.
2 번째 반복입니다.
// 3 번째 반복입니다. 출력 X <- 3 에서 break 가 걸려 for문이 종료됩니다.
// 4 번째 반복입니다. 출력 X
continue는 반복문에서 해당 반복을 넘기고 다음 반복으로 넘어갈때 사용한다.
for(int i = 0 ; i < 5 ; i++)
{
if(i == 3)
{
continue;
}
Debug.Log(i + "번째 반복입니다.");
}
"0 번째 반복입니다."
"1 번째 반복입니다."
"2 번째 반복입니다."
"4 번째 반복입니다."
3 에서 continue 로 인해 해당 반복의 내용은 실행 안하고 다음으로 넘어갔음
6. 배열
1) 배열의 기본과 활용
배열은 여러 데이터를 한가지 변수에 저장하는 기능이다. 자세한 내용은 코드블럭 참조
배열의 기본과 생성
데이터 형식[] 배열 이름 = new 데이터 형식[]
예) string[] game = new string[3]
- 인덱스의 숫자만큼 배열의 방 갯수가 정해진다.
- 3일 경우 0호실, 1호실, 2호실까지 생성된다.
배열의 저장
game[0] = "LOL"
game[1] = "CSGO"
game[2] = "Genshin"
배열의 활용
Console.WriteLine(game[0]); 결과 : LOL
배열의 생략
string[] game = new string[3] {"LOL", "CSGO", "Genshin"};
위의 형식으로 배열을 저장 가능, 그러나 방의 갯수만큼 데이터가 들어가 있지 않는다면 에러가 뜸.
string[] game = new string[] {"LOL", "CSGO", "Genshin"};
숫자를 입력하지 않고 사용하면 에러를 방지할 수 있음.
string[] game = {"LOL", "CSGO", "Genshin"};
최종적으로 new 배열[ ]을 생략하고 만들 수 있음.
2) 배열의 반복 처리
배열을 사용하다보면 반복적으로 숫자가 하나씩 증가하는 것을 볼 수 있기 때문에 for문과 if문을 사용하여 반복 처리를 통해 저장과 활용이 가능하다.
배열 반복 처리의 저장과 활용
int[] number = new int[10]
for(int i = 0 ; i < 10 ; i++)
{
number[i] = i;
Console.WriteLine(number[i]);
}
3) foreach
foreach는 조건식을 쓰지 않고 해당 배열을 처음부터 끝까지 반복할때 사용한다.
string[] games = new string[3] {"LOL", "CSGO", "Genshin"}
foreach(string game in games)
{
// 0번째 반복시 game : LOL
// 1번째 반복시 game : CSGO
// 2번째 반복시 game : Genshin
Console.WriteLine(game);
}
실행결과
LOL
CSGO
Genshin
7. 함수
1) 함수의 기본과 만들기 및 활용
함수는 C#에서 준비해준 기능들도 있지만, 없는 경우가 많기 때문에 직접 만들어서 쓴다.
함수의 기본
반환형식 함수이름(매개변수)
{
함수의 영역
}
예)
void gaming()
{
Console.WriteLine("게임하고 싶다");
}
함수의 활용
gaming(); <- 함수 실행
2) 함수의 return
함수를 특정한 상황에서 멈추고 싶을 때 return을 사용한다. 또한 함수의 결과를 변수에 저장하고 싶다면 return 값이 필요하고, return을 사용할 때 함수의 반환 형식이 같아야 한다.
return의 활용
int hp = 5;
Attack(); // 데미지 : 1 현재체력 : 4
Attack(); // 데미지 : 1 현재체력 : 3
Attack(); // 데미지 : 1 현재체력 : 2
Attack(); // 데미지 : 1 현재체력 : 1
Attack(); // 데미지 : 1 현재체력 : 0
Attack(); // Console X
...
void Attack()
{
if(hp < 1)
{
return; <-
}
--hp;
Console.Write("데미지 : 1 현재체력 : " + hp);
}
return을 이용한 변수 저장
int point = GetPoint();
int GetPoint();
{
Console.Write("보상으로 100포인트를 획득합니다");
return 100;
}
결과 point = 100
void 는 함수의 결과를 사용하지 않겠다는 뜻이다.
함수의 반환 타입과 return 결과물의 타입이 같아야 하며,
반환타입을 지정했다면 반드시 return 으로 반환값을 줘야한다.
3) 매개변수
매개변수는 함수에 다양한 값이 필요할 때 사용한다. 자세한 내용은 코드블럭 참조
void Attack(int damage)
{
if(hp < 1)
{
return;
}
hp -= damage; <- 데미지 적용
Console.Write("데미지 : " + damage + " 현재체력 : " + hp);
}
Attack(3); <- 매개변수로 인해 3데미지가 적용
Attack(5); <- 매개변수로 인해 5데미지가 적용
8. 클래스와 객체
1) OOP에 대해서
C#은 객체 지향 프로그래밍 (Object Oriented Programming, OOP) 언어이다. 객체라 하면 좀 어려워 보이는데, 모든 것이 다 객체이다. 컴퓨터, 노트북, 스마트폰 등 물건들도 객체이며 나, 친구들, 가족 등 사람들도 객체이다. 쉽게 말하면 개발하면서 필요한것들이 생기면서 만드는 것들이 다 객체이고, 객체 지향 프로그래밍이란 이렇게 만들어진 객체들을 유기적으로 연결해서 개발해 나가는 방식이다.
2) class에 대해서
어떠한 캐릭터를 만들때 1~3개면 괜찮지만, 100개가 넘어간다면 코드가 많이 길어지기 때문에, 이를 방지하기 위한 것이 class이다.
이 클래스의 영역안에서는 변수를 만들거나 함수를 만들 수 있고, 함수의 호출이나 계산 등 의 동작은 할 수 없다. 이러한 경우 함수를 하나 만들어서 그 안에서 필요한 내용을 작성하면 된다.
3) 객체에 대해서
클래스를 만들어 준다고 동작은 하지 않기 때문에, 사용을 하기 위해서는 객체를 생성해야 된다. 자세한 내용은 코드 블럭 참조.
Character myCharacter = new Character(); <- 객체 생성
myCharacter.userName = "chad" ; <- 객체 활용
myCharacter.job = "전사"; <- 객체 활용
myCharacter.level = 20; <- 객체 활용
myCharacter.IntroduceCharacter(); <- 클래스 내에 있는 함수 활용
class Character
{
string userName;
string job;
string level;
public void IntroduceCharacter()
{
Console.WriteLine("제 이름은 " + userName + "입니다");
}
}