변수(Variable)란?
- 숫자, 문자와 같은 값들을 저장하는 공간
- 변할 수 있는 값을 의미
선언(Declaration)과 대입(Assignment)
float numl; //변수의 선언
num1 = 128.512f; // 변수의 대입
float num2 = 20.8f; // 변수의 선언과 대입이 동시에 이루어지는 경우
const float PI = 3.14f; // const 변수(즉, 상수)는 항상 선언과 대입이 동시에 이루어짐
- 선언은 변수/상수의 자료형과 이름을 컴퓨터에게 알려줌
- 변수/상수 및 자료형은 곧 다시 다를 예정
- 대입은 변수/상수의 실제 값을 컴퓨터에게 알려줌
- 선언과 대입을 동시에 할 수도 있음
변수는 숫자만 의미하지 않는다
- 'c'와 같은 문자나 "hello" 같은 문자열까지 변수에 포함
- 상수 또한 마찬가지
왜 변수를 사용해야 되나?
- 어딘가에 저장한 값을 다시 재사용하기 위해서
- 그래서 변수를 mutable(변할 수 있는, 잘 변하는) 이라고도 부름
- 그래서 상수는 immutable(변경할 수 없는, 불변의) 이라고도 부름
두 변수의 계산
- 예시 1
using System;
namespace Calculator2
{
class Program
{
static void Main(string[] args)
{
float num1 = 10.0f; //첫 번째 변수
float num2 = 20.of; //두 번째 변수
// 두 숫자 더하기
Console.Write(num1 + "+" + num2 + "=");
Console.WriteLine(num1 + num2);
// 두 숫자 빼기
Console.Write(num1 + "*" + num2 + "=");
Console.WriteLine(num1 + num2);
// 두 숫자 나누기
Console.Write(num1 + "/" + num2 + "=");
Console.WriteLine(num1 / num2);
}
}
}
- 코드 재사용성이 높아짐
- 유지보수 쉬움
- 예시 2
// 매직 넘버를 쓸 경우
using System;
namespace Age1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(17);
}
}
}
// 명확한 이름을 가진 변수를 쓸 경우
using System;
namespace Age1
{
class Program
{
static void Main(string[] args)
{
int age = 17;
Console.WriteLine(age);
}
}
}
- 다른 사람이 볼 때 이 코드가 어떤 거를 의미하는지 명확히 알 수 있음
변수명 짓기 팁, const 키워드
코팅 스탠다드 : 변수명은 명확하게 지을 것
- 명사로 정확하게 어떤 정보를 담는지 알려주는 단어를 사용
- 성적이면: score
- 이름이면: name
- 여러 명사가 들어간다면 두 번째 단어의 첫 글자는 대문자로 (camelCasing)
- 수학 성적이면: mathScore
- 사과 개수면: appleCount
const 키워드
- constant의 줄임말 -> 즉, 상수!
- 한번 값을 대입한 후에 값을 바꾸고 싶지 않을 때 사용
const int appleCount = 17;
appleCount = 100;
- 대입 후, 값을 변경할 경우 컴파일 오류가 발생
코딩 표준: 변수와 상수의 이름
변수 상수
명사를 사용하여 소문자로 작성 예) score,number |
명사를 사용하여 대문자로 작성 예) SCORE,NUMBER |
여러 명사가 들어간다면, 두 번째 단어의 첫 단어는 대문자로 작성 예) mathScore,appleCount |
여러 명사가 들어간다면 명사 사시에 밑줄 기호(_)를 사용 예) MATH_SCORE, APPLE_COUNT |
코딩 표준을 적용한 사과와 오렌지 개수 출력하기
static void Main(string[] args)
{
const int APPLE_COUNT = 17;
cosnt int ORANGE_COUT = 20;
Console.WriteLine(APPLE_COUNT + ORANGE_COUT);
}
기본 자료형(Primitive Types)
- 정수, 실수, 문자 등과 같이 프로그램에서 사용되는 자료(data)의 종류를 의미
- 컴퓨터가 이해할 수 있는 가장 자연스러운 형태의 데이터
- 전부 다 숫자
- 디지털은 0과 1
- 컴퓨터는 디지털
- 0과 1로만 사용해서 표현을 해야 함
- 10진수는 10개의 수(0~9)를 사용함
- 2진수는 2개의 수(0,1)를 사용함
- 10진수와 2진수는 수학 코스에서 다룰 예정
자료의 크기
- 최소 단위는 비트(bit
- 1 혹은 0을 담을 수 있음. 그것도 한 개만
- 8비트가 모이면 바이트(byte)
- 각 비트는 마찬가지로 하나의 1 혹은 0을 담을 수 있음
- 1024 바이트 = 1킬로 바이트(KB)
- 1021 킬로바이트 = 1메가 바이트(MB)
정수형(Integer Types)
- 0,1,2,3과 같은 정수를 담을 수 있는 자료형
- byte, short, int, long
- 프로그래밍 언어마다 담을 수 있는 자료의 크기 차이는 존재
C#에서 각 자료형의 크기
자료형 이름 자료형 크기
byte | 8비트 |
short | 16비트 |
int | 32비트 |
long | 64비트 |
부동소수점형(Floating-Point Types)
- 3.14,0.9와 같은 실수를 담을 수 있는 자료형
- float, double
- 프로그래밍 언어마다 담을 수 있는 자료의 크기 차이는 존재 C#에서 각 자료형의 크기
자료형 이름자료형 크기
float | 32비트 |
double | 64비트 |
문자형(Character Type)
- 하나의 문자를 담는 자료형
- 알파벳(a-z, A-Z), 숫자(0-9), 특수문자(!,@,* 등등)
- 문자를 감쌀 때 작은따옴표(')를 사용
- 예시) 'a' '1' '-'
- char
- C#이 char를 조금 특이하게 다룸
- 이유는 C#에서는 char가 유니코드 이기 때문
C#에서 각 자료형의 크기
자료형 이름 자료형 크기
char | 16비트 |
불리언형(Boolean Type)
- 참(true)과 거짓(false)을 표현하는 자료형
- bool
- C++과 같은 일부 언어에서는 false를 0으로 true를 0이 아닌 값으로 변환이 가능
- C#에서는 불가능
C#에서의 기본 자료형
자료형 이름자료형 크기
byte | 8비트 정수 |
char | 16비트 문자(이 강의에서는 자세하게 다루지 않음) |
short | 16비트 정수 |
int | 32비트 정수 |
long | 64비트 정수 |
float | 비트 실수 |
double | 비트 실수 |
코드 보기 : 기본자료형으로 선언한 변수
- int
- int int1 = 2;
- int int2 = 10;
- float
- float float1 = 10.23f;
- float float2 = 3.4f;
- double
- double double1 = 11.0;
- double double2 = 5.234;
- char
- char char1 = 'x';
- char char2 = '$';
각 자료형마다 비트수가 다른 이유
- 한 개의 비트로는 2개의 수(0,1)를 표현할 수 있음
C# 정수형을 다시 살펴보면
자료형 이름 자료형 크기
byte | 8비트 |
short | 16비트 |
int | 32비트 |
long | 64비트 |
- byte의 경우 2의 8승 = 256개의 숫자를 표현 가능
- short의 경우 2의 16승 = 65,536개의 숫자를 표현 가능
- int의 경우 2의 32승 = 4,294,967,296개의 숫자를 표현 가능
- long의 경우 2의 64승 = 18,446,744,073,709,551,616개의 숫자를 표현 가능
컴퓨터는 음수를 표현할 수 없는가
- 예를 들어 여기 byte(8비트)가 있다고 하면은 총 256개의 숫자를 표현할 수 있음(2의 8승)
- 0부터 시작하면은 [0,255], 1부터 시작하면은 [1,256]
- 기본적으로는 0부터 시작함
- 여기서 어떻게 음수/양수를 배분할까?
- 반반으로 나누면 됨
- 근데 0 빼고 255개 남아서 딱 반이 안되어서 음수가 하나 더 그냥 갖기로 함
- 결론
- [-128,127]
- 양수 : [1,127]
- 0
- 음수 : [-128,-1]
- 127을 이진수로 나타내면
0 1 1 1 1 1 1 1 - 양수
0000 0001 ~ 0111 1111 - 0
0000 0000 - 음수 , 음수는 언제나 앞에 1로 표현
1000 0000 ~ 1111 1111
- [-128,127]
- 최상위 비트를 이용해서 음수/양수를 구분하기로 약속
- 최상위 비트의 값이 0이면 양수
- 최상위 비트의 값이 1이면 음수
부호 있는 자료형(Signed Types), 부호 없는 자료형(Unsigned Types)
부호 있는 자료형
- 음수와 양수를 모두 표현
자료형 이름 자료형 범위
sbyte | -128 ~ 127 |
short | -32,768 ~ 32,767 |
int | -2,147,483,678 ~ 2,147,483,647 |
long | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
부호 없는 자료형
- 양수만 표현
- 보통 부호 있는 자료형 이름 앞에 'u'를 붙임
자료형 이름자료형 범위
byte | 0 ~ 255 |
ushort | 0 ~ 65,535 |
uint | 0 ~ 4,294,967,295 |
ulong | 0 ~ 18,446,744,073,709,551,615 |
- 왜 byte만 부호 없는 쪽이 기본일까?
- 그냥 외우기
확장 아스키(Extended ASCII)
- 기존 128개의 문자 다음에 원하는 문자들을 코드에 추가
- OEM 437(불어/독어 등등), EUC-KR(한국어), EUC-JP(일본어)
- 그래서 문자를 담는 8비트 문자형들은 unsigned가 좀 더 말이 됨
결론
- 그렇기 때문에 C#에서 그냥 byte 하면은 unsigned , sbyte 하면은 음수/양수 모두 담는 signed
자료형을 언제 쓸까?
부호 있는 변수와 없는 변수는 언제 쓰나?
- 부호 있는 변수와 부호 없는 변수는 굉장히 중요
- 프로그래머의 명백한 의도를 보여주기 때문
- 예를 들어서 여기 변수 하나가 있음
int age = 17;
- 위에 처럼 쓰면은 age에 -가 들어갈 수도 있고 +가 들어갈 수도 있기 때문에 헷갈리기 때문에
- 변수형은 int형으로 부호 있는 자료형을 써야 된다.
오버플로우(overflow)
- 연 산의 결과로 자료형보다 큰 수가 나오는 경우를 말함
- 자료형의 크기는 변하지 않기 때문에 넘어가버린 비트는 버림
- 오버플로우가 발생할 경우 원치 않는 값이 나올 수 있음
변수의 자료형을 선택할 때 주의할 점
- 변수의 역할에 알맞은 자료형을 선택할 것
- 오버플로우를 고려해서 자료형을 선택할 것
상수의 접두사와 접미사
- 접두사와 접미사는 상수의 앞이나 뒤에 상수를 꾸미는 기호
상수 접두사
- 상수 앞에 붙는 기호로 진법을 나타냄
- 2진수 (Binary)
- 0b/0B - (일반적으로는 소문자로 씀 0b 이렇게)
int num1 = 0b10; int num2 = 0B10;
- 16진수 (Hexadecimal)
- 0x- / 0X- (일반적으로는 소문자로 씀 0x 이렇게/ 굉장히 많이 쓰는 표현)
int num1 = 0x10; int num2 = 0x10;
- 위의 예시인 0x는 16진수라는 것을 뜻함. 즉 16진수 10 이기 때문에 이거를 10진수로 표현하면은 16이 출력된다. 이해가 안 된다면 밑에 있는 16진수 표를 보자
- 16진수 표
10진수 16진수
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
16 | 10 |
17 | 11 |
18 | 12 |
19 | 13 |
20 | 14 |
21 | 15 |
22 | 16 |
23 | 17 |
24 | 18 |
25 | 19 |
26 | 1A |
27 | 1B |
28 | 1C |
29 | 1D |
30 | 1E |
상수 접미사
- 상수 뒤에 붙는 기호로 상수의 형을 나타냄
- 부호 여부
- -u (Unsigned)
int num1 = 10; uint num2 = 10u; uint num3 = 0x10u;
- long
- -l
int num1 = 1l; //컴파일 오류 long num2 = 10l; long num3 = 10lu; //컴파일 오류 ulong num4 = 10lu;
- float
- -f/-F
float num1 = 10.0f; float num2 = 10.0F; float num3 = 10.0; //컴파일 오류
- double
- 없음 혹은 -d/-D
double num1 = 10.0; double num2 = 10.0d; double num3 = 10.0D;
POCU academy 에서 학습한 내용 입니다.
반응형
'소소한 개발 > C#' 카테고리의 다른 글
출력(Output), 상수(Constant) (0) | 2022.01.28 |
---|---|
프로그래밍 언어의 분류 (0) | 2022.01.26 |