공부/C#

[C#] 변수와 오류, 형식, 메모리 패딩, 입력, 포맷 등 기본 개념에 대하여

굴러다니다니 2023. 3. 13. 16:55
728x90

변수란?

(수학적 관점) 수식에 따라 변하는 값이다.

vs

(프로그래밍적 관점) 데이터를 담는 공간이다.

 

관점에 따라 차이가 있는 만큼, 코드를 볼 때 우리가 원래 배웠던 수학적인 측면에서 보면 안된다.

 

1+1 = 2 로 봤을때 =는 좌우의 값이 같다를 의미하지만, 코드에서는 할당식에 해당된다.

실제로 코드에 1+1 = 2를 쓰면 할당식의 왼쪽은 변수, 속성, 인덱서여야 된다며 오류가 뜬다.

따라서 이를 number = 2로 써주면 현재 컨텍스트에 없다는 또다른 오류가 뜬다.

이는 컴퓨터에서는 number가 변수인지 모르는 상황으로

선언을 해 이를 컴퓨터에게 알려주어야 한다.

이를 위해 데이터 종류를 알려주는데

int number라고 써보겠다.

int는 부호가 있는 32비트 정수를 의미하며, 즉 4byte를 차지하는 종류이다. 

number는 변수의 이름을 뜻한다.

 

변수 이름 규칙
            1. 변수의 첫 글자는 반드시 문자로 지정 ex) int 1 (X)
            2. 공백이 올 수 없음
            3. C#에서 제공하는 예약어 / 키워드 / 메소드 이름들은 변수의 이름으로 사용 불가 ex) int int (x)


아래는 보통의 규칙이다.
            @. 대소문자 구분, int number != int Number
            @. 변수는 일반적으로 소문자로 시작
            @. 변수 이름 한글도 되긴 하지만 협업등 호환을 위해 한글 쓰지말고 영어로 짓는것을 지향하자
            @. 변수 이름을 지을때는 이름만 봐도 어떤 데이터를 나타내는지 알아볼 수 있게 짓자 (a, b, c / num1, num2 X)


다음으로 변수나 함수의 표기법이다
            1. 카멜 표기법: 단어가 여러개가 붙을 때 맨 앞을 제외한 단어의 첫 글자를 대문자로 표기 (낙타 등같이 오르락 내리락) => playerNumber
            2. 파스칼 표기법: 모든 단어의 첫 글자를 대문자로 (변수일때는 잘 안씀) - 클래스, 함수 etc
            3. 스네이크 표기법: 단어 사이에 _ (underscore) 붙이기, player_Number (뱀같이 보인다나 모라나) 
            4. 헝가리안 표기법: 예약어의 단어 하나를 맨 앞에 붙이기, int number => int inumber 식으로 (요즘은 안쓰는 추세


 

int number;

※ 오류

    => 변수 선언만 한 상태, (변수 값을 할당할 때 변수 이름 모름, 저장된 주소를 불러와서 가져옴)

int number;

 

※ 오류 

     => 같은 이름은 중복선언이 불가.

Console.WriteLine(number);

※ 오류 

     => 초기화(어떠한 값 최초 할당)가 안 된 상태라 오류 발생 

int number1; => 선언
number1 = 10; => 데이터 할당
Console.WriteLine(number1); => number1에 할당되어 있는 값 출력

 

int number2 = 50; => 선언과 동시에 할당도 가능
Console.WriteLine(number2);
int a, b, c; => 같은 데이터 타입 변수 동시에 선언 가능, 이름이 길고 많다면 잘 안씀
int d = 3, e = 4; => 선언과 동시에 초기화를 한번에 여러 개 하는 것도 가능

숫자 데이터 형식
            - C#에서는 숫자 형식의 데이터를 다룰 때 사용하는 int 키워드를 포함하여 여러가지 키워드를 제공함.
              숫자 데이터 형식은 크게 정수형과 실수형.
              다시 부호가 있는 숫자와 없는 숫자로 나눔.
            - 정수 데이터는 음의 정수, 0, 양의 정수가 전부임.
            - 프로그래머가 코드에 사용될 데이터가 얼마냐를 가늠하고 데이터 형식을 선택함으로써 메모리를 효율적으로 사용하기 위해 다양한 종류를 제공. 2byte쓰는데 int쓰면 2byte 낭비니깐.

데이터 형식 크기 (byte)
byte 1
sbyte (short byte) 1
short 2
ushort (unsigned: 부호 없고 양수만 존재) 2
int 4        -> 컴퓨터가 주로 세는 크기
uint 4
long 8
ulong 8
더보기

메모리 패딩

int a, short b, int c => 4 byte 2byte 4byte로 크기가 10byte일 것 같지만

실제로 크기를 출력해보면 12byte가 나온다.

이유는 4byte로 끊어서 생각하는 컴퓨터가 short를 세고 남은 2byte를 건너 뛴 다음 int를 세기 때문.

이를 방지하기 위해 int a, int b, short c 순서로 써준다면 무사히 10byte가 나온다.


부동 소수점 형식 (실수형이라고 생각)
            - 정수뿐만 아니라 유리수를 포함하는 실수 영역에서 데이터를 다룬다. (정수 타입보다 느리다.)
            - 정수 형식을 대체하지 못한다.
            
            float(4byte)   : 단일 정밀도 부동 소수점 형식 (7자릿수만 다룰 수 있음)
            double(8byte)  : 복수 정밀도 부동 소수점 형식 
            decimal(16byte

float pi = 3.1415_9265_3589_7932_3846f; //구분자로 사용하는 _, 반올림해서 데이터가 잘린다. 3.141593
double pi_2 = 3.1415_9265_3589_7932_3846; //실수 데이터는 오차 발생이 불가피함, 데이터 잘림
decimal pi_3 = 3.1415_9265_3589_7932_3846M; //데이터 범위 넓은 걸 쓰면 정밀도 면에서 좀 나아짐
Console.WriteLine(pi);
Console.WriteLine(pi_2);
Console.WriteLine(pi_3);

단일 문자

char a = '안'; //"안" 은 안됨 ""는 문자열, char는 단일 문자라 안됨.
char b = '녕';
char c = '하';
char d = '세';
char e = '야';
//int tntwk = 'A'; //출력시 아스키코드로 65 나옴
Console.Write(a);
Console.Write(b);
Console.Write(c);
Console.Write(d);
Console.WriteLine(e);

코드대로 실행한다면 안녕하세야

까지 잘 나올 것이다. 

정수라고 선언했지만 문자를 넣을 경우, 문자가 저장되어 있던 숫자의 아스키코드값이 나온다.


문자열

string str = "배고프다"; 
string str1 = "많이 배고프다";
Console.WriteLine(str);
Console.WriteLine(str1);

"배고프다"

"많이 배고프다" 

로 출력된다.

Console.Write은 문자열, 변수 출력이 가능하다.


논리형식

            참과 거짓을 표현 (true, false), 어떤 작업이 성공했는지, 비교 데이터가 일치하는지 판단할 때 사용

bool isDamage = true;
bool isCheck = false; 
Console.WriteLine(isDamage);
Console.WriteLine(isCheck);


bool은 0을 false로, 0을 제외한 나머지 값을 true로 인식한다.


입력 받기

//Console.ReadLine(); 읽는게 string type, 입력받기 전까지 여기서 대기
string inputStr; //문자열 타입의 변수 선언
inputStr = Console.ReadLine(); //입력받은 데이터를 문자열 변수에 할당
Console.WriteLine(inputStr); //저장한 데이터 출력
int inputNum;
//inputNum = Console.ReadLine(); 숫자를 받고싶은데 타입이 안맞아 불가
inputNum = int.Parse(Console.ReadLine()); //=> int.parse는 string type을 매개변수로 받아 int로 바꿔줌
Console.Write("입력한 숫자 : "); Console.WriteLine(inputNum);

ReadLine 함수가 나왔다.

WriteLine 함수의 반대이며 입력용 함수로 사용된다.

입력받을 때 까지 아래의 코드가 진행되지 않는다.

WriteLine은 String을 받는 것을 기본으로 하기 때문에 string 타입을 선언해 저장이 가능하다.

혹시 정수형 타입으로 받고 싶다면 int.Parse()로 이를 씌워 사용해 주면 가능해진다.


포맷

format이라는 method, 중괄호를 이용해 코드에서 사용하는 변수나 서식을 넣어주는 방법

중괄호 내부에 넣는 숫자를 첨자라고 하고, 첨자의 시작은 0부터 시작

문자열이 끝나고 콤마 뒤에 순서에 맞게 넣을 데이터를 입력

Console.WriteLine("뭐시기 : {0}, {1}", "하하", 1234);

=> 출력 결과로 

뭐시기 : 하하, 1234 가 나온다


+ 문자열 보간을 이용한 방법 (C# 6.0부터 지원)

"" 앞에 $표기를 해주면 중괄호 안에 변수를 넣을 수 있다

int a = 10;
int b = 30;
Console.WriteLine($"테스트 : {a} + {b} = {a+b}");

출력 결과로 

테스트 : 10 + 30 = 40

이 나온다.

728x90