공부/인프런 - Rookiss

Part 1-1-2. 데이터 : 형변환, 스트링 포맷, 산술 연산, 비교 연산, 논리 연산

셩잇님 2023. 7. 27. 17:06
반응형

 

 

캐스팅(=형변환)

 

[바구니 크기가 다른 경우]

int a = 1000;
long l = a; // 가능

 

 8 byte 바구니인 long 자료형에서 4 byte 바구니인 int 자료형을 넣는 것은 데이터가 손실 될 일이 없으므로 데이터를 옮기는 것이 가능하다. 즉. 큰 바구니에서 작은 바구니로 물건을 넣는 것은 문제가 없다.

 

int a = 1000;
short s1 = a // ❌ 에러
short s2 = (short)a; // 넣을래!

 

 4 byte 바구니인 int 자료형 a에서 2 byte 바구니인 s1에 데이터를 담으려고 하니 에러가 발생한다. 왜냐하면 작은 바구니에 큰 물건을 넣으려고 하기 때문이다. 그래서 아래와 같이 강제적으로 형변환을 해주면 문제가 발생하지 않는다. 단, 데이터를 옮겨 담을 때 데이터가 손실될 수 있다. 

 


 

스트링 포맷

 

[바구니 자체가 다르다! 😲]

string > int

int a = 100;
string b = (string)a; // ❌ 에러

 

 4 byte 바구니인 int 자료형 a에서 string 자료형 b로 캐스팅하는 것은 불가능하다. 위 예제에서 long 바구니와 int 형 바구니는 둘 다 '숫자'를 나타나는 종류의 바구니여서 가능했지만, string 바구니는 애초에 '숫자'가 아닌 '문자열'을 나타내는 바구니로써 캐스팅 하는 것이 불가능하다.  그렇다면 이 때에는 어떻게 해야할까?

 

Parse라는 메서드를 사용해서 문자열을 정수로 바꿔줘야 한다!

string input = Console.ReadLine(); // 문자열(string) 입력

int number = int.Parse(input) // input 변수를 Parse 메서드를 통해 int 형식으로 형변환

Console.WriteLine(number) // 형변환 된 number 출력

 

 위와 같은 방법을 사용하여 예를 들면 문자열로 입력한 100이 숫자 100으로 변환되어 출력되는 것이다. 단, 이 때 문자열을 입력할 때 숫자가 아닌 문자열(abcdefg..) 등으로 입력하게 되면 Parse 메서드가 정상작동하지 않으며 에러가 일어나는 것을 유의해야 한다.

 

int > string

int hp = 100;

// 체력을 메시지로 띄워준다고 할 경우
string message = "당신의 HP는 ??입니다.";
Console.WriteLine(message);

 

 위와같이 체력을 100으로 설정하고 현재 체력을 메시지로 나타내려고 할 때 ??에는 어떤 값을 넣어줘야 할까? 만약 hp에 있는 값인 100을 그대로 입력할 경우 hp가 감소, 증가하게 될 경우 매 번 값을 수정해야 하는 문제가 생긴다. 따라서 2가지의 방법으로 이를 해결할 수 있다.

 

1. 스트링 포맷 기능 문법

int hp = 100;
int maxHp = 100;

// 체력을 메시지로 띄워준다고 할 경우
string message = string.Format("당신의 HP는 {0}/{1} 입니다." hp, maxHp);
Console.WriteLine(message);

 

 스트링 포맷 기능은 고전적인 기능으로써 예전부터 사용되왔던 기능이다. 그러나 이 기능은 메시지를 출력할 때 다양한 매게 변수(hp, maxHP)들이 늘어날 경우, {0}/{1} 뒤에 계속 숫자를 적어주고, 또 그에 대응하는 값을 작성하는데 이 때 대응하는 값을 깜빡하고 작성하지 못하는 등 다양한 문제가 생기기도 한다.

 

2. 문자열 보간 기능 문법

int hp = 100;
int maxHp = 100;

// 체력을 메시지로 띄워준다고 할 경우
string message = $"당신의 HP는 {hp}/{maxHp} 입니다.";
Console.WriteLine(message);

 

 문자열 보간 기능 문법을 사용할 경우 소괄호 ( )는 지운 채 문자열 앞에 달러 표시 ($)를 작성한 후 기존에 {0}. {1}로 표시된 부분에 변수 명을 입력하는 방법이다. 이 방법을 사용할 경우 앞서 사용한 스트링 포맷 기능 문법보다 훨씬 직관적으로 사용 할 수 있는 장점이 있다.

 


 

산술 연산 ⅰ

 

 산술 연산은 크게 어려운 것이 없다. 우리가 초등학교 때에 배운 사칙연산을 사용하면 된다. (+, -, *, /) 이 때, C#을 포함한 다양한 언어에서는 %와 같이 나머지 연산도 존재한다.

 

int hp = 100; // 단순히 값을 선언 및 초기화
int mp = (3 + 2) * 10; // 산술 연산을 진행한 값 선언 및 초기화

Console.WriteLine(hp);

// 산술 연산
// + - * / %

 

  그렇다면 현재 체력의 5라는 데미지를 주려고 할 때 어떻게 할 수 있을까? 단순하게 생각한다면 100 - 5를 빼면 된다. 그러나 그렇게 진행할 경우 항상 현재 체력(hp)의 값을 갱신하는 것이 아닌 '100'이라는 수에서 데미지 5를 빼는 것이기 때문에 정상적으로 작동할 수 없다.

 

int hp = 100;

// 변수의 기본기
// 1) 할당 > int hp;
// 2) 쓰기 > hp = 100;
// 3) 호출 > hp

// 이 때 - 5도 하드코딩이 될 수 있으므로 value 변수를 생성해서 진행한다.
// hp = hp - 5;

int value = 5;
hp = hp - value;

Console.WriteLine(hp);

 

 따라서 이전 시간에 배웠던 변수의 기본기를 활용하여 작업을 진행하면 된다. hp = hp - 5는 오른쪽부터(hp - 5) 부터 시작하여 왼쪽(hp)으로 대입된다. 따라서 현재 체력에 5를 깎는 작업은 성공한 것이다. 그렇지만 이 때, 체력이 5가 깎이는 것이 아니라, 회복이 될 수도 있고 더 많은 데미지를 입을 수 있기 때문에 이를 value 라는 변수를 생성하여 값을 제어한다.

 

[몫과 나머지]

 

int a = 10 / 3;
int b = 10 % 3;
Console.WriteLine(a); // 3 출력
Console.WriteLine(b); // 1 출력

 /와 % 연산자는 몫과 나머지를 구하는 연산자이다. 일반적으로 사람이 10을 3으로 나누려고 하면 3.3333…와 같이 나뉘어지지만 int형 자료 연산자를 사용하는 바람에 소수점은 삭제되고 a는 3이되고 b는 1이 된다. 따라서 /와 % 연산자를 사용할 때에는 자료형에 따라 값이 잘릴 수 있으며, 이로 인해 사용시 주의해야 한다.

 


 

산술 연산 ⅱ

 

 이전에 우리는 사칙연산을 통해 자기 자신 혹은 다른 변수에게 값을 대입하는 방법을 공부했다. 오늘 공부할 것은 자기 자신에게 사칙연산을 진행할 때 기존에 있는 문법보다 짧게 사용할 수 있는 문법이다.

 

int a = 10;
a = a + 1; // 기존
a += 1; // 더 짧은 방식
a -= 1; // 물론 다른 사칙연산도 사용 가능하다.
a *= 2;
a /= 2;

 

 위와 같이 a = a + 1의 문법을 조금 더 짧게 작성할 수 있는 방법이 a += 1, a -=1 등과 같은 방법이다. 초보 프로그래머의 경우 a = a + 1이 사용하기 편할 수 있지만, 점점 더 적응되고 익숙해 질 경우 a += 1와 같이 사용하게 된다. 그렇지만 항상 1씩 더하거나 감소시킨다고 하면 어떤 방법을 쓸 수 있을까? 당장 생각나는 방법은 아래와 같다;

 

a -= 1; // a의 값을 1 감소시킨다.
a--; // 새로운 문법

a++; // 모두 다 사용할 수 있따.
++a;
a--;
--a;

 

 위 코드를 보면 여태까지 학습한 방법은 a -= 1을 이용하여 a의 값을 1 감소시키는 코드였다. 하지만 a--는 새로운 문법으로 증산, 증감 연산자라고 볼 수 있다. 부호의 위치에 따라 전위/후위로 나뉘어 부른다.

 

 그렇지만 전위 증감 연산자와 후위 증감 연산자의 값이 같은 것은 아니다. 전위 증감 연산자는 ++a 를 사용 후 출력한다면 값이 바로 증가하여 11이 출력 되지만,  후위 증감 연산자는 a++ 를 사용 후 출력한다면 값이 바로 증가하는 것이 아닌 해당 행이 끝나고 난 뒤 값이 증가하기 때문에 10이 출력된다.

 


 

비교 연산

 

 비교 연산은 우리가 어렸을 적에 크다, 작다, 크거나 같다, 작거나 같다 등 이미 실 생활에서 사용하는 것으로 <, <=, >, >=, ==, !=와 같다. 

 

int hp = 100; // hp를 100으로 설정
bool isAlive = (hp > 0); // 살아있음의 여부를 hp가 0보다 큰가?로 판단한다.

 

 위 코드를 보면 체력(hp)를 100으로 설정하고, 불리언 값 isAlive를 hp가 0보다 크면 살아있다로 체크 하는 예제이다. 이렇게 비교 연산은 우리 일상에서 사용하는 수학과 다를 것이 없다. 

 


 

논리 연산

 

 논리 연산은 여러가지 조건을 동시에 만족하거나 혼합할 때 주로 사용한다. 

 

bool isTall = true; // 똑똑한가?
bool isSmart = false; // 키가 큰가?

 

 위 코드에서 예로 들면 소개팅을 한다고 가정한다. 여자 A가 남자 A를 볼 때 똑똑하고, 키가 큰가?의 값에 따라 소개팅 할 상대 남성을 조건에 따라 선택할 수 있다.

 

// AND   OR   NOT
// &&    ||   !

// 키가 크면서 AND 똑똑하다 > 두 개의 조건을 모두 만족해야한다.
bool result = (isTall && isSmart);

// 키가 크거나 OR 똑똑하다 > 둘 중 하나의 조건만 만족해도 상관없다.
bool result = (isTall || isSmart);

// 키가 작은가? // 조건의 반대 값을 이용하여 확인한다.
bool isSmall = !isTall;

 

 따라서 AND, OR, NOT 등 다양한 연산자를 통해 소개팅 조건을 설정할 수 있고, 이를 게임으로 예시를 든다면 길드 가입 조건을 설정하거나, 던전 입장 가능 여부 조건을 확인하는 등 다양한 방법에서 많이 사용할 수 있다.

 


 

데이터 마무리

 

 변수는 바구니라고 설명했으며, 변수를 선언, 가공, 연산(비교, 논리 등)을 활용하여 게임을 제작할 수 있다.

 또한 int, float, string, bool 등 대표적인 4가지 데이터 형식이 있다. 그렇지만 설명하지 않았던 내용 중 var 라는 데이터 타입이 있다. var는 컴파일러가 프로그램을 실행할 때 데이터 형식을 판단하여 적재 적소로 설정해주는 기능이다. 그렇다면 모든 데이터 형식을 var로 설정하면 되지 않을까?

 

 그렇지 않다. 데이터 형식을 지정해주면 현재 변수가 어떤 데이터 형식을 사용하고 있는지 직관성이 좋아지므로 사용자가 보다 편리하다는 장점이 있다. 😎

 

 

 

반응형