C# 기본문법

Hjin·2024년 7월 24일

C#

목록 보기
2/3

C#의 기본문법은 앞서 살펴봤듯이 타 언어와 비슷한 부분이 매우 많기 때문에 내가 완전히 알고 있지는 못한, C#에서 더 알게 된 부분들을 위주로 간단하게만 정리를 해보았다.

C#은 기본적으로 컴파일 언어이므로 소스코드를 모두 작성한 뒤에 컴파일이 진행된다.

가장 먼저, 기본적인 코드를 작성해보도록 하자

실행은 앞서 말했듯이, VSCode에서 실행을 해볼건데

처음이니까 첫 세팅부터 다시 적어보겠다.

가장 먼저 바탕화면이든 어디든 마음에 드는 위치에 폴더를 하나 생성한다.

그 다음 터미널을 열어서 해당 위치로 이동한다.

📎 `cd 파일명` : 해당 파일 위치로 이동 (하위폴더로 이동) `..cd` : 상위 폴더로 이동 (이전위치로 이동) `mkdir` : 폴더 생성 `ls` : 현재 폴더에 있는 모든 파일 확인

원하는 위치에 도달하고 나면 아래의 명령어를 작성해본다.

dotnet new console

이렇게 실행하고나면 파일 구조가 생성되며

vsCode에는 아래와 같은 파일 구조가 만들어지게 된다.

우리는 이제 Program.cs에 코드를 작성하면 된다.

using System;
using static System.Console;

namespace myFirstCode
{
    class MainApp
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Hello World!");
                return;
            }
        }
    }
}

한번 실행을 시켜보자. 터미널을 열어서 아래의 명령어를 입력하면 프로그램이 실행되며,

dotnet run

결과는 ‘Hello World!’가 나오게 될 것이다!

이제 저 위의 코드를 하나하나 뜯어보도록 하자.

using System;
using static System.Console;

namespace myFirstCode
{
    class MainApp
    {
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Hello World!");
                return;
            }
        }
    }
}
  • using : 네임스페이스 전체를 이용하겠다는 의미.

  • using static : 어떤 데이터 형식 (ex. class)의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언하는 기능.

  • namespace : 성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식 등을 하나의 이름 아래 묶는 것.

    • 다른 네임스페이스에서 이 메인앱이라는 클래스를 쓰고싶다면 myFirstCode.MainApp 이렇게 참조해야 함.
  • C#의 주석은 C 계열과 마찬가지로 //

  • static void Main(string[] args){}

    • 이 메소드는 프로그램의 진입점 (entry point)으로서 프로그램을 시작하면 실행되고, 이 메소드가 종료되면 프로그램은 종료됨.
    • 따라서 모든 프로그램은 반드시 Main이라는 메소드를 하나 가지고 있어야 함.

CLR

: Common Language Runtime

→ java 가상머신과 비슷한 역할 / C#뿐 아니라 다른 언어도 지원하도록 설계됨. ⇒ 서로다른 언어가 만나는 지점이 IL!!
⇒ 플랫폼에 최적화된 코드를 만들어 냄 !!!!!!!

: .NET 라이브러리와 함꼐 OS 위에 설치됨.

⇒ C# 컴파일러가 C# 소스코드를 컴파일해서 IL(intermediate language)이라는 중간 언어로 작성된 실행 파일을 만들어내면, 사용자가 이 파일을 실행시키면 CLR이 중간 코드를 읽어들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일후 실행함 == JIT (just in time) 컴파일 {실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행함}


데이터 형식

데이터 형식

  • 기본 데이터 형식(Primitive Type) :

  • 복합 데이터 타입(Complex Data Type) : 구조체, 클래스, 배열 등

스택과 힙

  • 스택은 “{”괄호가 시작된 후 값을 스택에 쌓은 후 괄호 “}”를 만나면 스택에 있는 데이터들이 LIFO 순서대로 걷혀나감. ⇒ 코드블록 안에서 생성된 모든 값 형식의 변수들은 프로그램 실행이 중괄호를 만나면 메모리에서 제거됨.

  • 힙 : CLR의 가비지 컬렉터로 저장된 데이터를 제거함.

    • 가비지 컬렉터는 프로그램 뒤에 숨어 동작하면서 힙에서 더 이상 사용하지 않는 객체가 있으면 그 객체를 쓰레기로 간주하고 수거하는 기능을 함.
  • 참조 형식 : 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장된 힙 메모리의 주소를 저장함. ⇒ 데이터를 직접 저장하는 대신 실제 데이터가 저장된 메모리의 주소를 “참조”한다고 해서 참조 형식!


기본 데이터 형식

  • C#이 제공하는 기본 데이터 형식은 총 15가지 (숫자 형식, 논리 형식, 문자열 형식, 오브젝트 형식)
    • 15가지 중 12가지가 숫자 데이터 형식… (정수 계열, 부동 소수 계열, 소수 계열..)

데이터 오버플로 (Overflow) / 언더플로 (Underflow)

표현할 수 있는 값보다 많이 표현하거나 적게 표현할 수 없다.

  • Object :객체 ⇒ 어떤 물건(데이터)이든지 다룰 수 있는 데이터 형식
    • Object 형식이 모든 데이터 형식의 조상 !!

박싱과 언박싱

object a = 20;
int b = (int)a;

열거 형식

enum 열거 형식명 : 기반 자료형 {상수1, 상수2, 상수3, ...} // => 0, 1, 2, ... 값을 갖게 됨

Nullable 형식

0이 아닌 비어있는 변수, 즉 null 상태인 변수는 변수에게 할당된 메모리 공간을 비워둘 수 있는 Nullable 형식을 용하면 됨.

데이터 형식**?** 변수이름;

Var

C#은 변수나 상수에 대해 깐깐하게 형식 검사를 하는 강력한 형식의 언어(Strong Type Language)인데, 강력한 형식 검사는 프로그래머의 실수를 줄여주고 의도치 않은 형식의 데이터를 읽거나 할당하는 일을 막아준다. 그러나 약한 형식 검사도 단점만 있는 것은 아니다. 코드를 작성하는 단계에서는 약한 형식 검사가 더 편리하다. 일단 변수를 선언해서 데이터를 할당하면, 컴파일러나 인터프리터가 해당 변수에 담는 데이터를 보고 자동으로 형식을 지정해준다.

C#은 var 이라는 키워드를 통해 약한 형식 검사를 하는 언어의 편리함도 지원한다.

단, 이것은 지역변수로만 사용할 수 있다 !!


연산자

null 조건부 연산자

?. : 객체의 멤버에 접근하기 전에 해당 객체가 null인지 검사하여 그 결과가 참이면 그 결과로 null을 반환하고, 그렇지 않은 경우에는 . 뒤의 지정된 멤버를 반환함.


흐름 제어

switch 문

switch (조건식)
{
	case 상수1:
		break
	case 상수2: // when f >= 0 : d와 같이 if문과 유사하게 when을 붙여 조건을 함께 작성 가능..ㅋ
		break
	....
	default:
		break;
}

foreach

foreach(데이터형식 변수명 in 배열_또는_컬렉션){}

함수

참조에 의한 전달

: ref


static void Swap(ref int a, ref int b)
{
	int temp = b;
	b = a;
	a = temp;
{

반환값을 참조하는 경우?

class SomeClass
{
	int SomeValue = 10;
	public ref int SomeMethod()
	{
		return ref SomeValue;
	}
}

출력 전용 매개변수

void Divide(int a, int b, out int quotient, out int remainder)
{
	quotient = a/b;
	remainder = a%b;
}

int a=20;
int b=3;
int c;
int d;

Divide(a,b,out c, out d);
Console.WriteLine("Quotient : {0}, Remainder {1}", c, d);

가변 개수의 매개변수

int Sum (params int[] args)
{
	int sum = 0;
	for (int i=0; i<args.Length; i++)
	{
		sum+=args[i];
	}
	return sum;
}

로컬 함수

메소드 안에서 선언되고, 선언된 메소드 안에서만 사용되는 특별한 함수.

클래스의 멤버가 아니기 때문에 메소드가 아니라 함수라고 부름!!



다음은 객체지향의 C# 문법을 정리해보려 한다 :)
profile
HYU Information System

0개의 댓글