
1. 변수의 개념
변수는 프로그램에서 데이터를 저장하고 참조하기 위한 이름이 붙은 메모리 위치입니다.
변수는 값을 저장하거나 계산 중에 사용되는 임시적인 공간으로서, 프로그램이 실행되는 동안 데이터를 다루는 데 필수적입니다.
2. 변수의 선언과 초기화
C#에서 변수를 사용하려면 먼저 변수를 선언하고 초기화해야 합니다.
// 변수 선언
int age;
// 변수 초기화
age = 25;
또는 선언과 초기화를 한 번에 할 수 있습니다.
// 변수 선언과 초기화
int age = 25;
* 따로 선언 후 초기화 : 초기값이 어떤 조건에 의해 동적으로 결정될 때나 나중에 값이 할당될 때 사용될 수 있습니다.
* 동시에 선언과 초기화 : 초기값이 고정되어 있거나 초기화 지점이 명확할 때, 코드의 간결성을 추구할 때 사용될 수 있습니다.
어떤 방법을 선택할지는 상황과 개발자의 취향에 따라 다르며, 코드의 가독성과 유지보수성을 고려하여 결정하는 것이 중요합니다.
3. 변수의 자료형
변수는 자료형 (Data Type)을 가지며, 이는 변수가 어떤 종류의 데이터를 저장할 수 있는 지를 나타냅니다.
▶ 숫자를 다루는 주요 변수 타입은 정말 다양하지만 , 실무에서는 int, long, double 정도를 많이 사용합니다.
정수형 변수타입 | 설 명 |
sbyte | -128 부터 127까지 담을 수 있는 변수 타입 |
byte | 0부터 255까지 담을 수 있는 변수 타입 |
short | -32,768 부터 32,767까지 담을 수 있는 변수 타입 |
int | -2,147,483,648 부터 2,147,483,647 까지 담을 수 있는 변수 타입 |
long | -9,223,372,036,854,775,808 부터 9,223,372,036,854,775,807 까지 담을 수 있는 변수 타입 |
실수형 변수타입 | 설 명 |
float | 32bit 부동 소수점을 담을 수 있는 변수 타입. 초기 값을 넣기 위해서는 숫자 뒤에 'f'를 붙여서 float타입이라는 것을 명시해야 합니다. |
double | 64bit 부동 소수점을 담을 수 있는 변수 타입 |
decimal | 128bit 부동 수수점을 담을 수 있는 변수 타입 초기 값을 넣기 위해서는 숫자 뒤에 'm'을 붙여서 decimal 타입이라는 것을 명시해야 합니다. |
▶ 문자를 다루는 변수 타입은 char와 string 이 있습니다. char는 한 글자만 담을 수 있고, string 은 문장을 담을 수 있습니다.
▶ 참/거짓을 다루는 변수 타입은 bool입니다. 그리고 참/거짓을 판별하기 위해서는 '비교 연산자'를 사용합니다.
연산자 | 뜻 | 설 명 |
== | 같다 | A == B; // A와 B는 같다. |
&, && | 그리고 | ( A == B ) && ( A == C ) // A는 B와 같고(그리고) A는 C와 같다. |
|, || | 또는 | ( A == B ) || ( A == C ) // A는 B와 같거나(또는) A는 C와 같다. |
>, <, >=, <= | 크다, 작다, 크거나 같다, 작거나 같다. | A > B // A 는 B 보다 크다. A < B // A 는 B 보다 작다. A >= B // A 는 B 보다 크거나 같다. A <= B // A 는 B 보다 작거나 같다. |
▶ 데이터 타입에 상관없이 모든 데이터를 담을 수 있는 변수 타입은 object와 var과 dynamic 이 있습니다.
편의성을 위해서는 object보다는 var과 dynamic을 사용하는 것이 바람직합니다.
object | 데이터형에 관계없이 저장할 수는 있지만, 데이터가 무슨 타입인지 알 수 없다. |
var | 데이터형에 관계없이 저장가능하고, 데이터가 무슨타입인지 알 수 있지만, 데이터가 할당되면 다른 타입으로 변경이 불가능하다. (컴파일될 때 변수 타입을 인식) |
dynamic | 데이터형에 관계없이 저장가능하고, 데이터가 무슨타입인지 알 수 있고, 데이터 할당한 후에도 다른 타입으로 변경이 가능하다. (런타임될 때 변수 타입을 인식) |
▶ 데이터의 형태를 바꾸는 것을 '형 변환'이라고 합니다. 보통 작은 값을 큰 변수 타입으로 바꿀 때는 '암시적인 형 변환'방법을 사용하면 되고, 큰 값을 작은 변수 타입으로 바꿀 때는 '명시적인 형 변환'방법을 사용합니다.
또한 문자열과 같은 데이터 타입을 형 변환하기 위해서는 Convert 혹은 Parse 형태의 함수를 사용해야 합니다.
Parse는 문자열 값이 Null인 경우 프로그램에서 에러가 납니다. 반면 Convert의 경우 문자열 값이 Null 인 경우, 0을 반환해 줍니다.
▶ 여러 개의 함수에서 공통적으로 데이터를 공유하는 변수를 '전역변수(public)'라 하고, 특정 함수에서만 데이터를 사용하는 변수를 '지역변수(private)'라 합니다.
▶ 상수는 절대 변하지 않는 변수이며, const 타입을 붙여주면 됩니다.
const float _PIE_VALUE = 3.14f;
▶ 변수 타입에는 C# Data Type 과 .Net Data Type이 있는데, 편의성을 위해 C# Data Type을 사용하도록 합니다.
C# Data Type | .NET Data Type |
bool | System.Boolean |
byte | System.Byte |
sbyte | System.SByte |
short | System.Int16 |
int | System.Int32 |
long | System.Int64 |
float | System.Single |
double | System.Double |
decimal | System.Decimal |
char | System.Char |
string | System.String |
object | System.Object |
4. 요약
- 변수는 데이터를 저장하고 참조하기 위한 메모리 공간에 붙인 이름입니다.
- 변수는 선언과 초기화를 통해 생성됩니다.
- 자료형은 변수가 어떤 종류의 데이터를 저장할 수 있는지를 정의합니다.
- 변수는 계산에 사용되거나 나중에 필요할 때 값을 참조하는 데 사용됩니다.
- 변수의 범위(scope)는 변수가 어디에서 유효한지를 나타냅니다.
연산자(Operators)는 프로그래밍 언어에서 값들을 조작하고 계산하기 위해 사용되는 기호나 키워드입니다.
C#에서도 다양한 연산자가 제공되며, 이를 통해 산술, 논리, 비교, 할당 등 다양한 연산을 수행할 수 있습니다.
1. 산술 연산자 (Arithmetic Operators)
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
int a = 10;
int b = 3;
int result = a + b; // 13
2. 비교 연산자 (Comparison Operators)
== | 같음 |
!= | 다름 |
< | 작음 |
> | 큼 |
<= | 작거나 같음 |
>= | 크거나 같 |
int x = 5;
int y = 8;
bool isEqual = (x == y); // false
3. 논리 연산자 (Logical Operators)
&& | 논리 (AND) : 모든 조건이 참일 경우 |
|| | 논리 (OR) : 적어도 하나의 조건이 참일 경우 |
! | 논리 (NOT) : 조건을 반대로 뒤집습다. |
^ | 논리 (XOR) : 두 조건 중 정확히 하나가 참인 경우 |
bool condition1 = true;
bool condition2 = false;
bool result = (condition1 && !condition2); // true
[ OR ( 논리 OR ) 과 XOR ( Exclusive OR ) 비교 ]
* OR : 적어도 하나의 조건이 참이면 전체 표현식이 참이 됩니다.
- A OR B : A가 참이거나 B가 참이거나 또는 A와 B 모두 참일 때 참
* XOR : 정확히 하나의 조건이 참일 때만 전체 표현식이 참이 됩니다.
- A XOR B : A와 B 중 하나만 참이거나 A와 B가 모두 거짓일 때 참
조건 A | 조건 B | A OR B | A XOR B |
참 | 참 | 참 | 거짓 |
참 | 거짓 | 참 | 참 |
거짓 | 참 | 참 | 참 |
거짓 | 거짓 | 거짓 | 거짓 |
XOR 은 두 조건이 동시에 참이거나 동시에 거짓이면 거짓이 됩니다. 따라서 정확히 하나만 참일 때에만 전체 표현식이 참이 됩니다. 이와 달리 OR은 두 조건 중 하나라도 참이면 전체 표현식이 참이 됩니다.
bool condition1 = true;
bool condition2 = false;
// OR 연산
bool resultOr = condition1 || condition2; // 참
// XOR 연산
bool resultXor = condition1 ^ condition2; // 참
4. 할당 연산자 (Assignment Operators)
= | 할당 |
+= , -= , *= , /= , %= 등 | 복합 할당 연산자 |
int num = 10;
num += 5; // num은 이제 15
5. 증감 연산자 (Increment / Decrement Operators)
++ | 증가 |
-- | 감소 |
int count = 3;
count++; // count는 이제 4
6. 비트 연산자 (Bitwise Operators)
& | AND |
| | OR |
^ | XOR |
~ | NOT |
<< | 왼쪽 시프트 |
>> | 오른쪽 시프 |
int a = 5; // 이진수 표현: 0101
int b = 3; // 이진수 표현: 0011
int result = a & b; // 비트 AND 연산: 0001 (결과: 1)
* 0101 과 0011 각 자리수 비트를 비교 AND 연산 : 두 비트가 모두 1인 경우에만 1을 반환하므로 0001 의 결과가 나옵니다.
비트 연산자는 데이터의 이진 표현을 이용하여 비트 단위로 연산을 수행하는 연산자입니다.
이진수는 0과 1로 구성되며, 각 비트는 컴퓨터 메모리에 저장된 정보를 나타냅니다.
6.1 비트 AND ( & )
- 두 비트가 모두 1인 경우에만 결과 비트가 1이 됩니다.
- A & B : A 와 B의 각 비트가 모두 1이면 1, 아니면 0
6.2 비트 OR ( | )
- 두 비트 중 하나라도 1이면 결과 비트가 1이 됩니다.
- A | B : A 와 B의 각 비트 중 하나라도 1이면 1, 둘 다 0이면 0
6.3 비트 XOR ( ^ )
- 두 비트가 다를 때만 결과 비트가 1이됩니다.
- A ^ B : A 와 B의 각 비트가 서로 다르면 1, 같으면 0
6.4 비트 NOT ( ~ )
- 각 비트를 반전시킵니다. 0은 1로, 1은 0으로 변환됩니다.
- ~ A : A 의 각 비트를 반전
6.5 왼쪽 시프트 ( << )
- 비트를 왼쪽으로 이동시킵니다. 오른쪽에 새로운 비트는 0으로 채워집니다.
- A << n : A 의 모든 비트를 n 만큼 왼쪽으로 이동.
6.6 오른쪽 시프트 ( >> )
- 비트를 오른쪽으로 이동시킵니다. 왼쪽에 새로운 비트는 원래의 최상위 비트로 채워집니다.
- A >> n : A의 모든 비트를 n 만큼 오른쪽으로 이동
int a = 5; // 이진수로 0101
int b = 3; // 이진수로 0011
int andResult = a & b; // 0001 (1)
int orResult = a | b; // 0111 (7)
int xorResult = a ^ b; // 0110 (6)
int notResult = ~a; // 11111111111111111111111111111010 (-6)
int leftShiftResult = a << 1; // 1010 (10)
int rightShiftResult = a >> 1; // 0010 (2)
비트 연산자는 특히 하드웨어와 밀접한 연관이 있으며, 비트 수준의 조작이 필요한 경우에 사용됩니다.
일반적으로 프로그래밍에서는 논리나 산술 연산이 더 많이 사용되지만, 특정한 상황에서는 비트 연산자를 활용할 수 있습니다.
비트 연산자는 주로 하드웨어를 제어하거나 최적화된 코드를 작성할 때 사용됩니다.
하드웨어 제어의 예로는 다양한 임베디드 시스템, 마이크로컨트롤러, 센서 제어, 통신 프로토콜 등이 있습니다. 이러한 환경에서는 비트 연산이 직접 하드웨어 레지스터를 조작하거나 성능을 향상시키는 데 사용됩니다.
일반적으로 하드웨어 레지스터는 특정 비트 패턴을 사용하여 제어되고 구성됩니다. 비트 연산자를 사용하면 이러한 레지스터의 특정 비트를 설정하거나 클리어하는 등의 조작을 효과적으로 수행할 수 있습니다.
예를 들어, 특정 핀을 제어하는 레지스터에서 비트를 설정하여 LED를 켜거나 끄는 동작을 생각해 볼 수 있습니다.
// 가상의 레지스터를 표현하는 변수
int register = 0;
// 특정 비트를 설정하는 함수
void SetBit(int bitPosition)
{
register |= (1 << bitPosition);
}
// 특정 비트를 클리어하는 함수
void ClearBit(int bitPosition)
{
register &= ~(1 << bitPosition);
}
// 예제에서는 2번 비트를 설정
SetBit(2);
// 예제에서는 2번 비트를 클리어
ClearBit(2);
이 예제에서는 SetBit 함수를 통해 특정 비트를 1로 설정하고, ClearBit 함수를 통해 특정 비트를 0으로 클리어합니다. 이러한 작업을 통해 특정 하드웨어 기능을 활성화 또는 비활성화하거나 상태를 변경할 수 있습니다.
그러나 이러한 접근은 일반적인 응용 프로그램에서는 자주 사용되지 않습니다.
대부분의 경우에는 논리 연산이나 산술 연산이 더 직관적이고 가독성이 높기 때문에, 하드웨어 제어를 위한 비트 연산은 특별한 상황에서 사용됩니다.
C#에서 사용되는 명명 규칙은 주로 Microsoft의 명명 규칙 및 가이드라인을 따릅니다. 이 가이드라인은 코드의 일관성과 가독성을 높이기 위한 것입니다.
- 변수 (Variable):
- 카멜 케이스(Camel Case)를 사용합니다.
- 첫 번째 단어는 소문자로 시작하고, 이후의 각 단어의 첫 글자는 대문자로 표기합니다.
- 예: myVariable, countOfItems, totalAmount
- 메서드 (Method):
- 카멜 케이스(Camel Case)를 사용합니다.
- 메서드의 이름은 동사 또는 동작을 나타내는 단어로 시작하는 것이 관례입니다.
- 예: calculateTotal(), getUserData(), displayMessage()
- 클래스 (Class):
- 파스칼 케이스(Pascal Case)를 사용합니다.
- 각 단어의 첫 글자를 대문자로 표기합니다.
- 예: Person, CustomerData, CarModel
- 인터페이스 (Interface):
- I로 시작하고 파스칼 케이스를 사용합니다.
- 예: IDisposable, IEnumerable
- 속성 (Property):
- 카멜 케이스(Camel Case)를 사용합니다.
- 예: firstName, isCompleted
- 이벤트 (Event):
- EventHandler 형태를 따르고, 파스칼 케이스를 사용합니다.
- 예: Click, TextChanged
- 상수 (Constant):
- 대문자 스네이크 케이스(UPPER_CASE_SNAKE_CASE)를 사용합니다.
- 예: MAX_VALUE, PI
- 네임스페이스 (Namespace):
- 파스칼 케이스(Pascal Case)를 사용합니다.
- 예: MyCompany.ProjectName
이러한 명명 규칙을 따르면 코드가 일관성 있고 가독성이 높아져 협업과 유지보수가 용이해집니다. Microsoft의 가이드라인은 C# 커뮤니티에서 널리 받아들여지고 있으며, 개발자들은 이러한 규칙을 따르기를 권장합니다.
'Programming' 카테고리의 다른 글
객체와 클래스,네임스페이스 : 쉽고 재미있는 C# Programming 의 기본 (0) | 2024.01.15 |
---|---|
상속 : 쉽고 재미있는 C# Programming 의 기본 (0) | 2024.01.13 |
객체지향프로그래밍 (OOP) - 캡슐화 : 쉽고 재미있는 C# Programming 의 기본 (0) | 2024.01.13 |
반복문 : 쉽고 재미있는 C# Programming 의 기본 (2) | 2024.01.13 |
조건문 : 쉽고 재미있는 C# Programming 의 기본 (0) | 2024.01.13 |