~ 강력한 형식 시스템은 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입에 대한 안전성과 정확성을 보장하는 시스템이다.
~ 가비지 컬렉션 기능은 동적 할당된 메모리를 자동으로 회수해주는 기능이다. C#에서는 개발자가 메모리를 직접 할당하고 해제하는 대신, .NET프레임워크에서 가비지 수집기가 자동으로 메모리를 해제해준다.
.NET프레임워크
.NET프레임워크는 Microsoft에서 개발한 프로그래밍 플랫폼으로, 다양한 프로그래밍 언어를 지원하며, 개발자가 손쉽게 애플리케이션을 개발할 수 있도록 도와준다.
각각의 언어를 가지고 컴파일(compile)을 진행하는데, 그러면 쉽게말해서 중간언어(Common InterMediate Language (CIL))가 생성이 되는데 그걸 맥,윈도우,Ios등 각각의 플랫폼들 에서 자기한테 맞는 방식으로 또다시 변환을 해서 사용을 하는 거라고 생각을 하면 .NET프레임워크는 이해가 될 것이다.
출처 - https://dotnet.microsoft.com/ko-kr/learn/dotnet/what-is-dotnet-framework
-빌드하기-
Visual Studio의 메뉴에서 Build > Build Solution을 선택하거나, 키보드 단축키(F6)를 눌러 빌드한다.
빌드가 성공적으로 완료되면, Output창에서 빌드 메세지를 확인할 수 있다.
-디버그-
디버그 메뉴에서 Start Without Debugging을 선택하거나, 키보드 단축키(Ctrl + F5)를 눌러 프로그램을 실행한다.
콘솔 애플리케이션인 경우, 콘솔 창이 열리고 프로그램이 실행된다.
윈도우 애플리케이션인 경우, 애플리케이션 창이 열리고 프로그램이 실행된다.
"Hello World"코드 구조
using System;
namespace HelloWorld
{
class program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
usuing System;은 C#에서 기본적으로 제공하는 네임스페이스(System 네임스페이스)를 사용하기 위한 코드이다. Console클래스를 사용하기 위해 필요하다.
namespace는 코드를 구성하는 데 사용되며 클래스 및 기타 네임스페이스의 컨테이너이다.
class Program는 C#클래스를 정의하는 키워드이다. 클래스 이름은 Program으로 지정한다.
static void Main()은 C#의 진입점(entry point)이다. Main메서드는 프로그램이 시작할때 자동으로 호출되는 메서드이다. Main메서드는 프로그램 실행에 필수적이다.
Console.WriteLine("Hello World!");은 콘솔에 출력할 내용을 지정하는 코드이다.
WriteLine메서드는 새 줄을 시작하고 출력할 문자열을 인자로 받는다.
{}는 코드 블록의 시작과 끝을 나타내는 중괄호이다.
모든 C#문은 세미콜론으로 끝난다. ;
C#에서 콘솔 출력을 할 때는 Console.WriteLine메소드를 사용한다. WriteLine메소드는 인수로 전달된 값을 출력하고 줄 바꿈(new line)문자열을 추가한다. 즉, 출력한 후에는 다음 줄로 커서가 이동한다.
Console.WriteLine 메소드는 다음과 같은 형식으로 사용할 수 있다.
Console.WriteLine(value);
value는 출력할 값이다. value는 문자열,숫자,변수,연산식 등 어떤 값이든 사용할 수 있다.
Console.Write메소드는 Console.WriteLine메소드와 유사하지만, 줄 바꿈 문자열을 추가하지 않는다. 즉, 출력한 후에는 다음 출력이 이어서 출력된다.
예를 들어, 다음과 같이 Console.Write메소드와 Console.WriteLine메소드를 사용하여 값을 출력할 수 있다.
Console.Write("Hello! ");
Console.Write("We are Learning ");
Console.Wirte("at TeamSparta");
// 출력 => Hello! We are Learning at TeamSparta
문자열 내에 특수한 문자를 포함시키기 위해 사용되는 특별한 문자 조합이다.
이스케이프 시퀀스 | 설명 |
---|---|
\' | 작은따옴표(') 삽입 |
\" | 큰따옴표(") 삽입 |
\ | 역슬래시() 삽입 |
\n | 새 줄(줄바꿈) 삽입 |
\r | 현재 줄 맨 앞으로 이동 |
\t | 탭 삽입 |
\b | 백스페이스 삽입 |
자료형 | .NET 데이터 타입 | 크기(바이트) | 범위 |
---|---|---|---|
sbyte | Sysyem.SByte | 1 | -128 ~ 127 |
byte | Sysyem.Byte | 1 | 0 ~ 255 |
short | System.Int16 | 2 | -32,768 ~ 32,767 |
ushort | System.UInt16 | 2 | 0 ~ 65,535 |
int | System.Int32 | 4 | -2,147,483,648 ~ 2,147,483,647 |
uint | System.UInt32 | 4 | 0 ~ 4,294,967,295 |
long | System.Int64 | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong | System.UInt64 | 8 | 0 ~ 18,446,744,073,709,551,615 |
float | System.Single | 4 | ±1.5 × 10^-45 ~ ±3.4 × 10^38 |
double | System.Double | 8 | ±5.0 × 10^-324 ~ ±1.7 × 10^308 |
decimal | System.Decimal | 16 | ±1.0 × 10^-28 ~ ±7.9 × 10^28 |
char | System.Char | 2 | 유니코드 문자 |
string | System.String | 유니코드 문자열 | |
bool | System.Boolean | 1 | true 또는 false |
리터럴의 개념과 역할
프로그램에서 직접 사용되는 상수 값으로, 소스 코드에 직접 기록되어 있는 값
C#에서 리터럴은 컴파일러에 의해 상수 값으로 처리되며, 변수나 상수에 할당되거나 연산에 사용
리터럴의 종류와 예시
~정수형 리터럴
10(int)
0x10 (16진수 int)
0b10 (2진수 int)
10L (long)
10UL (unsigned long)
~부동소수점형 리터럴
3.14 (double)
3.14f (float)
3.14m (decimal)
~문자형 리터럴
'A' (char)
'\n' (개행 문자)
'\u0022' (유니코드 문자)
~문자열 리터럴
"Hello, World!" (string)
"문자열 내 "따옴표" 사용하기"
@"문자열 내 개행 문자 사용하기"
int num = 10;
float f = 3.14f;
char c = 'A';
string str = "Hello, World!";
int num1 = 0x10;
int num2 = 0b1010;
long num3 = 100000000000000L;
데이터(숫자, 문자 등) 를 저장하고 사용하기 위한 할당받은 공간
필요에 따라 데이터를 저장하거나 수정 가능
예를 들어 게임을 제작할때 플레이어의 재화나 공격력, HP 같은 정보를 저장하기 위해 사용
코드 컨벤션(Code convention)은 개발자들 사이에서 약속된 코드 작성 규칙으로, 코드의 가독성을 높이고 유지보수를 쉽게 하기 위해 사용된다. 코드 컨벤션은 프로그래밍 언어마다 다를 수 있다.
식별자 표기법
- PascalCase : 클래스, 메서드, 프로퍼티 이름 등에 사용된다. 단어의 첫 글자는 대문자로 시작하며, 이후 단어의 첫 글자도 대문자로 표기한다. 예를 들어, ClassName, MethodName, PropertyName과 같은 형태이다.
- camelCase : 변수, 매개변수, 로컬 변수 이름등에 사용된다. 단어의 첫 글자는 소문자로 시작하며, 이후 단어의 첫 글자는 대문자로 표기한다. 예를들어, variableName, parameterName, localVariableName과 같은 형태이다.
- 대문자 약어 : 예외적으로 전체 글자가 모두 대문자인 식별자도 있다. 대표적으로 ID, HTTP, FTP 등이 있다.
C#에서는 자료형이 다른 변수 간에 값을 할당하거나 연산을 수행할 수 있다. 이때, 자료형이 다른 변수 간에 값을 할당하거나 연산을 수행하려면 명시적 형변환(explicit casting) 또는 암시적 형변환(implicit casting)을 해주어야 한다.
int num1 = 10;
long num2 = (long)num1; // int를 long으로 명시적 형변환
01. 작은 데이터 타입에서 더 큰 데이터 타입으로 대입하는 경우
byte, short, char 등 작은 데이터 타입에서 int, long, float 등 더 큰 데이터 타입으로 대입할 때 암시적 형변환이 발생한다.
byte num1 = 10;
int num2 = num1; // byte형에서 int형으로 암시적 형변환
02. 리터럴 값이 대입되는 경우
C# 컴파일러는 리터럴 값의 데이터 타입을 판별하여 변수에 암시적으로 형변환한다.
float result = 1; // 1은 int형 리터럴 값이지만 float형으로 암시적 형변환
03. 정수형과 부동소수점형 간의 연산을 수행하는 경우
정수형과 부동소수점형의 연산 결과는 부동소수점형으로 변환된다.
int num1 = 10;
float num2 = 3.14f;
float result = num1 + num2; // int형과 float형의 덧셈에서 float형으로 암시적 형변환
암시적 형변환은 프로그래머가 직접 형변환 코드를 작성하지 않아도 되므로 코드가 간결하게 작성할 수 있지만 데이터 타입을 신중하게 고려하여 코드를 작성해야한다.
C#에서 콘솔 입력을 받을 때는 Console.ReadLine 메소드를 사용한다. ReadLine 메소드는 사용자가 입력한 값을 문자열로 반환한다.
Console.Write("Enter your name: ");
string name = Console.ReadLine();
Console.WriteLine("Hello, {0}!", name);
[출력]
Enter your name: Kero
Hello, Kero!
- name은 사용자가 입력한 값을 저장하는 변수. Console.ReadLine메소드를 호출하면 사용자가 입력한 값이 문자열로 반환되어 name변수에 저장
- Console.ReadLine메서드는 사용자가 입력한 값을 문자열로 반환하므로, 숫자나 논리값을 입력받을 때에는 적절한 형변환을 해주어야 한다.
사용자로부터 여러 개의 값을 한 줄에 입력받고 싶을 때에는 Console.ReadLine 메소드를 사용하여 입력받은 값을 문자열로 받은 후, string.Split 메소드를 사용하여 문자열을 나누어서 처리할 수 있다.
Console.Write("Enter two numbers: ");
string input = Console.ReadLine(); // "10 20"과 같은 문자열을 입력받음
string[] numbers = input.Split(' '); // 문자열을 공백으로 구분하여 배열로 만듦
int num1 = int.Parse(numbers[0]); // 첫 번째 값을 정수로 변환하여 저장
int num2 = int.Parse(numbers[1]); // 두 번째 값을 정수로 변환하여 저장
int sum = num1 + num2; // 두 수를 더하여 결과를 계산
Console.WriteLine("The sum of {0} and {1} is {2}.", num1, num2, sum);
[출력]
Enter two numbers: 10 20
The sum of 10 and 20 is 30.
형변환은 데이터 타입을 변경하는 것이고, Parse메서드는 문자열을 다른 데이터 타입으로 변환하는 것이다.
var num = 10; // int 자료형으로 결정됨
var name = "kero"; // string 자료형으로 결정됨
var pi = 3.141592; // double 자료형으로 결정됨
var 키워드를 사용하여 변수를 선언할 때에는 초기화하는 값의 자료형에 따라 변수의 자료형이 결정되므로, 변수를 선언하는 시점에서 변수의 자료형을 정확히 알 수 없는 경우에 유용하게 사용할 수 있다.
연산자 | 설명 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
% | 나머지 |
연산자 | 설명 |
---|---|
== | 같음 |
!= | 다름 |
> | 큼 |
< | 작음 |
>= | 크거나 같음 |
<= | 작거나 같음 |
연산자 | 설명 |
---|---|
&& | 논리곱(AND) |
! | 논리부정(NOT) |
연산자 | 설명 |
---|---|
& (AND) | 두 비트 값이 모두 1일 때 1을 반환 |
(OR) | 두 비트 값 중 하나라도 1일 때 1을 반환 |
^ (XOR) | 두 비트 값이 서로 다를 때 1을 반환 |
~ (NOT) | 비트 값의 보수(complement)를 반환 |
<< (왼쪽 시프트) | 비트를 왼쪽으로 이동 |
>> (오른쪽 시프트) | 비트를 오른쪽으로 이동 |
int a = 0b1100; // 12 (2진수)
int b = 0b1010; // 10 (2진수)
int and = a & b; // 0b1000 (8)
int or = a | b; // 0b1110 (14)
int xor = a ^ b; // 0b0110 (6)
int c = 0b1011; // 11 (2진수)
int leftShift = c << 2; // 0b101100 (44)
int rightShift = c >> 1; // 0b0101 (5)
int d = 0b1100; // 12 (2진수)
int bit3 = (d >> 2) & 0b1; // 0 (3번째 비트)
d |= 0b1000; // 0b1100 | 0b1000 = 0b1100 (12)
연산자 | 예시 | 설명 |
---|---|---|
+= | x += y; | x = x + y; |
-= | x -= y; | x = x - y; |
*= | x *= y; | x = x * y; |
/= | x /= y; | x = x / y; |
%= | x %= y; | x = x % y; |
연산자 | 설명 |
---|---|
++ | 1 증가 |
-- | 1 감소 |
연산자들은 다양한 우선순위를 가지고 있으며, 높은 우선순위의 연산자가 먼저 수행된다.
아래는 C#에서 주로 사용되는 연산자들의 우선순위를 나열한 것이다.
string str1 = "Hello, World!"; // 리터럴 문자열 사용
string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성
string str1 = "Hello";
string str2 = "World";
string str3 = str1 + " " + str2;
str1 문자열과 str2 문자열을 공백으로 구분하여 연결한 새로운 문자열 str3을 생성한다.
string str = "Hello, World!";
string[] words = str.Split(',');
str 문자열을 쉼표(,)로 구분하여 분할한 문자열 배열 words를 생성한다.
string str = "Hello, World!";
int index = str.IndexOf("World");
str 문자열에서 "World" 문자열의 첫 번째 인덱스를 찾아 index 변수에 저장한다.
string str = "Hello, World!";
string newStr = str.Replace("World", "Universe");
str 문자열에서 "World" 문자열을 "Universe" 문자열로 대체한 새로운 문자열 newStr을 생성한다.
문자열을 숫자로 변환
string str = "123";
int num = int.Parse(str);
문자열 str을 정수형 숫자로 변환한 후, num 변수에 저장한다.
숫자를 문자열로 변환
int num = 123;
string str = num.ToString();
정수형 숫자 num을 문자열로 변환한 후, str변수에 저장한다.
문자열 값 비교
string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2;
str1 문자열과 str2 문자열을 비교한 후, isEqual 변수에 결과를 저장한다.
문자열 대소 비교
string str1 = "Apple";
string str2 = "Banana";
int compare = string.Compare(str1, str2);
str1 문자열과 str2 문자열을 대소 비교한 후, compare 변수에 그 결과를 저장한다. compare 변수는 0보다 작으면 str1이 str2보다 작고, 0이면 str1과 str2가 같으며, 0보다 크면 str1이 str2보다 크다.
문자열 형식화
string name = "John";
int age = 30;
string message = string.Format("My name is {0} and I'm {1} years old.", name, age);
문자열 형식 문자열을 사용하여 name 변수와 age 변수의 값을 문자열 message에 삽입한다.
문자열 보간
string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";
문자열 보간 기능을 사용하여 name변수와 age변수의 값을 문자열 message에 삽입한다.
internal class Program
{
static void Main()
{
Console.Write("이름을 입력하시오 : ");
string name = Console.ReadLine();
Console.Write("\n나이를 입력하시오 : ");
string age = Console.ReadLine();
Console.WriteLine("이름 : {0} 나이 : {1}", name, age);
}
}
internal class Program
{
static void Main()
{
Console.Write("두 수를 입력하시오 : ");
string input = Console.ReadLine();
string[] numbers = input.Split(' ');
int num1 = int.Parse(numbers[0]);
int num2 = int.Parse(numbers[1]);
int sum = num1 + num2;
int subtraction = num1 - num2;
int multiplication = num1 * num2;
float division = (float)num1 / (float)num2;
Console.WriteLine("{0} + {1} = {2}", num1, num2, sum);
Console.WriteLine("{0} - {1} = {2}", num1, num2, subtraction);
Console.WriteLine("{0} * {1} = {2}", num1, num2, multiplication);
Console.WriteLine("{0} / {1} = {2}", num1, num2, division);
}
}
internal class Program
{
static void Main()
{
Console.Write("화씨 온도로 변환할 섭씨 온도를 입력하시오 : ");
string input = Console.ReadLine();
float temperature = float.Parse(input);
temperature = temperature * 1.8f + 32;
Console.WriteLine("섭씨로 변환 : {0}", temperature);
}
}
internal class Program
{
static void Main()
{
Console.Write("체중(kg), 키(cm)를 입력하시오 : ");
string input = Console.ReadLine();
string[] number = input.Split(' ');
float kg = float.Parse(number[0]);
float m = float.Parse(number[1]) / 100;
float add = kg / m / m;
string bmi = add.ToString("N2");
Console.WriteLine("당신의 BMI : {0}", bmi);
}
}