10. C# 문법 종합반 1주차

이규성·2023년 11월 6일
0

TIL

목록 보기
14/106

11/06 C#문법에 대해 본격적으로 배워보자

C#언어의 이해

C#언어의 특징

  • 마이크로소프트에서 만든 객체 지향 프로그래밍 언어이며, 안전하고 형식이 분명하다.
  • 강력한 형식 시스템과 가비지 컬렉션 기능을 제공한다.
  • “다양한 플랫폼”에서 사용 가능하며, .NET 프레임워크에서 실행된다.
  • C, C++, Java 등 다른 언어들과 문법 및 구조적으로 유사하다.

강력한 형식 시스템은 변수나 객체의 자료형이 미리 정의되어 있어 데이터 타입에 대한 안전성과 정확성을 보장하는 시스템이다.

가비지 컬렉션 기능은 동적 할당된 메모리를 자동으로 회수해주는 기능이다. C#에서는 개발자가 메모리를 직접 할당하고 해제하는 대신, .NET 프레임워크에서 가비지 수집기가 자동으로 메모리를 해제해준다.

NET 프레임워크

.NET 프레임워크는 Microsoft에서 개발한 프로그래밍 플랫폼으로, 다양한 프로그래밍 언어를 지원하며, 개발자가 손쉽게 애플리케이션을 개발할 수 있도록 도와준다.

기본 자료형

자료형.NET 데이타 타입크기 (바이트)범위
sbyteSystem.SByte1-128 ~ 127
byteSystem.Byte10 ~ 255
shortSystem.Int162-32,768 ~ 32,767
ushortSystem.UInt1620 ~ 65,535
intSystem.Int324-2,147,483,648 ~ 2,147,483,647
uintSystem.UInt3240 ~ 4,294,967,295
longSystem.Int648-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulongSystem.UInt6480 ~ 18,446,744,073,709,551,615
floatSystem.Single4±1.5 × 10^-45 ~ ±3.4 × 10^38
doubleSystem.Double8±5.0 × 10^-324 ~ ±1.7 × 10^308
decimalSystem.Decimal16±1.0 × 10^-28 ~ ±7.9 × 10^28
charSystem.Char2유니코드 문자
stringSystem.String유니코드 문자열
boolSystem.Boolean1true 또는 false

변수를 세분화 해서 사용하는 이유

  • 메모리의 효율적인 사용
    세분화된 자료형을 사용하면, 해당 자료형이 필요한 크기만큼의 메모리를 할당하여 메모리의 효율적인 사용을 가능하다.
  • 정확한 데이터 표현
    세분화된 자료형을 사용하면, 데이터의 특성에 따라 정확한 표현이 가능하다. 예를 들어, 부동소수점 자료형인 float과 double은 소수점 이하 자릿수가 다르며, 각각의 자료형은 다른 범위의 값까지 표현이 가능하다.
  • 타입 안정성
    세분화된 자료형을 사용하면, 코드의 타입 안정성을 유지할 수 있다. 예를 들어, 정수형 자료형으로 byte를 사용하면, 해당 자료형이 가질 수 있는 값의 범위를 벗어날 경우 오류가 발생하므로, 코드의 안정성을 보장할 수 있다.

리터럴(literal)

리터럴의 개념과 역할
프로그램에서 직접 사용되는 상수 값으로, 소스 코드에 직접 기록되어 있는 값
C#에서 리터럴은 컴파일러에 의해 상수 값으로 처리되며, 변수나 상수에 할당되거나 연산에 사용
리터럴의 종류와 예시
C#에서는 다양한 종류의 리터럴을 지원
각각의 리터럴은 다른 형식으로 표현되며, 다양한 값의 범위를 가지고 있습니다.

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)
    • "문자열 내 "따옴표" 사용하기"
    • @"문자열 내 개행 문자 사용하기"

코드 컨벤션

코드 컨벤션(Code convention)은 개발자들 사이에서 약속된 코드 작성 규칙으로, 코드의 가독성을 높이고 유지 보수를 쉽게 하기 위해 사용됩니다. 코드 컨벤션은 프로그래밍 언어마다 다를 수 있으며, 우리는 다음의 규칙을 따를 예정입니다.

  • 식별자 표기법
    • PascalCase: 클래스, 메서드, 프로퍼티 이름 등에 사용됩니다. 단어의 첫 글자는 대문자로 시작하며, 이후 단어의 첫 글자도 대문자로 표기합니다. 예를 들어, ClassName, MethodName, PropertyName과 같은 형태입니다.
    • camelCase: 변수, 매개변수, 로컬 변수 이름 등에 사용됩니다. 단어의 첫 글자는 소문자로 시작하며, 이후 단어의 첫 글자는 대문자로 표기합니다. 예를 들어, variableName, parameterName, localVariableName과 같은 형태입니다.
    • 대문자 약어: 예외적으로 전체 글자가 모두 대문자인 식별자도 있습니다. 대표적으로 ID, HTTP, FTP 등이 있습니다.
  • 들여쓰기
    • 탭(tab) 또는 스페이스(space) 4칸을 사용하여 코드 블록을 들여씁니다.
  • 중괄호 위치
    • 중괄호({})는 항상 새로운 줄에서 시작합니다.
  • 빈 줄 사용
    • 관련 없는 코드 사이에는 빈 줄을 사용하여 구분합니다.
    • 메서드, 클래스 등의 블록 사이에는 두 줄을 띄어씁니다.
  • 주석
    • // 한 줄 주석을 사용합니다.
    • /* / 여러 줄 주석을 사용할 때는 / 를 다음 줄에서 시작하고, */ 를 새로운 줄에서 끝내도록 합니다.

산술, 관계 논리 연산자

산술 연산자

연산자설명
+덧셈
-뺄셈
*곱셈
/나눗셈
%나머지
  • 기본적인 개념이 수학과 같다.
  • %의 계산은 5/2 = 2.5가 아닌 5-2-2=1 나누고 난 뒤 남는 값을 의미한다. "1"

관계 연산자

연산자설명
==같음
!=다름
>
<작음
>=크거나 같음
<=작거나 같음
  • =기호는 오른쪽에 위치한다.

논리 연산자

연산자설명
&&논리곱 And
||논리합 Or
!논리부정 Not
  • true, false의 값을 가진다.
  • 수학에서의 집합과 비슷하다.

비트 연산자

데이터의 bit 단위로 연산을 수행하는 연산자.

연산자설명
&두 비트 값이 1일 때 1을 반환
|두 비트 값 중 하나라도 1일 때 1을 반환
^두 비트 값이 서로 다를 때 1을 반환
~비트 값의 보수(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)

bit가 너무 생소한 개념이어서 이해하기가 어렵다.. 따로 추가적인 공부의 필요성을 느낀다.

복합 대입 연산자와 증감 연산자

복합 대입 연산자

연산자예시설명
+=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감소
  • 변수의 값을 1씩 변화시키는 연산자.

정말 많이 사용했던 연산자들이다. 활용하기에 따라 정말 강력한 기능을 수행한다.

문자열 처리 기능 및 메서드

문자열 생성

string str1 = "Hello, World!"; // 리터럴 문자열 사용
string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성

연결

string str1 = "Hello";
string str2 = "World";
string str3 = str1 + " " + str2;
  • 데이터가 무거워지니 그닥 추천하시지 않았다.

분할

string str = "Hello, World!";
string[] words = str.Split(',');
Console.WriteLine(words[0]);
Console.WriteLine(words[1]);
  • 쉼표를 기준으로 문자열을 분할한다.

검색

string str = "Hello, World!";
int index = str.IndexOf("World");
Console.WriteLine(index); // 7 출력
  • Hello, 까지 0~6이고 7번부터 W가 시작.

대체

string str = "Hello, World";
string newStr = str.Replace("World", "Universe");
Console.WriteLine(newStr); // Hello, Universe 출력
Console.WriteLine(str);   // Hello, World 출력
  • str의 값을 변경하는 것이 아닌 값을 가져와서 새로운 문자열을 생성한다.

변환

string str = "123";
int num = int.Parse(str); // 문자열을 숫자형으로 변환
num += 10; // 숫자형이 되었기 때운에 가능하다.
Console.WriteLine(num.ToString()); // 문자형인 133 출력

비교

string str1 = "Hello";
string str2 = "World";
bool isEqual = str1 == str2;
Console.WriteLine(isEqual); // false 출력
string str1 = "Apple";
string str2 = "Banana";
int compare = string.Compare(str1, str2);
Console.WriteLine(compare); // -1 출력
  • str1 > str2 = 1
  • str1 < str2 = -1
  • str1 == str2 = 0

포맷팅

문자열 형식화

string name = "John";
int age = 30;
string message = string.Format("My name is {0} and I'm {1} years old.", name, age);
  • name, age 변수를 {0}, {1}에 순서대로 삽입한다.

문자열 보간

string name = "John";
int age = 30;
string message = $"My name is {name} and I'm {age} years old.";
  • $를 이용하면 바로 변수를 사용할 수 있다.

예제 연습

이름과 나이를 임력 받고 출력하는 코드

// 내가 작성한 코드
Console.Write("이름을 입력하세요: ");
string name = Console.ReadLine();

Console.Write("나이를 임력하세요: ");
string age = Console.ReadLine();

Console.WriteLine("안녕하세요, {0}! 당신은 {1} 세 이군요.", name, age);
// 풀이 코드
Console.Write("이름을 입력하세요: ");
string userName = Console.ReadLine();

Console.Write("나이를 입력하세요: ");
string userAge = Console.ReadLine();

Console.WriteLine("안녕하세요, " + userName + "! 당신은 " + userAge + " 세 이군요.");

출력하는 방식의 차이가 있었다.

사칙연산 계산기 만들기

// 내가 작성한 코드
 Console.Write("첫 번째 수를 입력하세요: ");
 string strNum1 = Console.ReadLine();
 
 Console.Write("두 번째 수를 입력하세요: ");
 string strNum2 = Console.ReadLine();

 float num1 = float.Parse(strNum1);
 float num2 = float.Parse(strNum2);

 Console.WriteLine("더하기: " + (num1 + num2));
 Console.WriteLine("빼기: " + (num1 - num2));
 Console.WriteLine("곱하기: " + (num1 * num2));
 Console.WriteLine("나누기: " + (num1 / num2));
// 풀이 코드
Console.Write("첫번째 수를 입력하세요: ");
int num1 = int.Parse(Console.ReadLine());

Console.Write("두번째 수를 입력하세요: ");
int num2 = int.Parse(Console.ReadLine());

Console.WriteLine("더하기: " + (num1 + num2));
Console.WriteLine("빼기: " + (num1 - num2));
Console.WriteLine("곱하기: " + (num1 * num2));
Console.WriteLine("나누기: " + ((float)num1 / num2));

자료형의 변환을 콘솔에 입력하면서 할 수 있었다는 것을 알게 되었다.

온도 변환기 만들기

// 내가 작성한 코드
Console.Write("섭씨 온도를 입력하세요: ");
string strCel = Console.ReadLine();

int cel = int.Parse(strCel);
int fah = (cel * 9 / 5) + 32;

Console.Write("변환된 화씨 온도: " + fah);
// 풀이 코드
Console.Write("섭씨 온도를 입력하세요: ");
float celsius = float.Parse(Console.ReadLine());

float fahrenheit = (celsius * 9 / 5) + 32;
Console.WriteLine("변환된 화씨 온도: " + fahrenheit);

float형식으로 변수를 저장했어야 했는데 간과했다.

BMI 계산기

// 내가 작성한 코드
Console.Write("키를 입력하세요(m): ");
string strHei = Console.ReadLine();

Console.Write("몸무게를 입력하세요(kg): ");
string strWei = Console.ReadLine();

float Hei = float.Parse(strHei);
float Wei = float.Parse(strWei);

float bmi = Wei / (Hei * Hei);

Console.WriteLine("당신의 BMI는: " + bmi);

키 입력에서 cm로 입력을 했다가 결과값이 이상해서 약간 헤메었지만 단위를 적어주어 해결하였다.

Feedback

사전캠프에서 익혔던 내용들의 구체적인 개념들을 배울 수 있는 시간이었다. 강사님이 중간중간 개발 과정에서의 팁들을 자주 알려주셔서 놓치는 부분 없이 집중해야함을 느꼈다.

0개의 댓글