본문 바로가기

Programming

변수와 연산자 : 쉽고 재미있는 C# Programming 의 기본

 

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의 명명 규칙 및 가이드라인을 따릅니다. 이 가이드라인은 코드의 일관성과 가독성을 높이기 위한 것입니다.

  1. 변수 (Variable):
    • 카멜 케이스(Camel Case)를 사용합니다.
    • 첫 번째 단어는 소문자로 시작하고, 이후의 각 단어의 첫 글자는 대문자로 표기합니다.
    • 예: myVariable, countOfItems, totalAmount
  2. 메서드 (Method):
    • 카멜 케이스(Camel Case)를 사용합니다.
    • 메서드의 이름은 동사 또는 동작을 나타내는 단어로 시작하는 것이 관례입니다.
    • 예: calculateTotal(), getUserData(), displayMessage()
  3. 클래스 (Class):
    • 파스칼 케이스(Pascal Case)를 사용합니다.
    • 각 단어의 첫 글자를 대문자로 표기합니다.
    • 예: Person, CustomerData, CarModel
  4. 인터페이스 (Interface):
    • I로 시작하고 파스칼 케이스를 사용합니다.
    • 예: IDisposable, IEnumerable
  5. 속성 (Property):
    • 카멜 케이스(Camel Case)를 사용합니다.
    • 예: firstName, isCompleted
  6. 이벤트 (Event):
    • EventHandler 형태를 따르고, 파스칼 케이스를 사용합니다.
    • 예: Click, TextChanged
  7. 상수 (Constant):
    • 대문자 스네이크 케이스(UPPER_CASE_SNAKE_CASE)를 사용합니다.
    • 예: MAX_VALUE, PI
  8. 네임스페이스 (Namespace):
    • 파스칼 케이스(Pascal Case)를 사용합니다.
    • 예: MyCompany.ProjectName

이러한 명명 규칙을 따르면 코드가 일관성 있고 가독성이 높아져 협업과 유지보수가 용이해집니다. Microsoft의 가이드라인은 C# 커뮤니티에서 널리 받아들여지고 있으며, 개발자들은 이러한 규칙을 따르기를 권장합니다.