예약어

예약어는 식별자로 사용할 수 없는 문자를 뜻한다.

현재 또는 향후 사용될 문자까지 예약어로 등록되기도 한다.

*식별자(identifier)

변수, 함수, 클래스 등의 이름을 지정하는데 사용되는 문자열

 

키워드

컴파일러에게 특별한 의미를 가지고 있는 문자이다. 

키워드가 가지는 특징은 언어마다 다른데 키워드를 식별자로 사용할 수 있는 경우도 있고 그렇지 않은 경우도 있다.

 

두 개념을 명확하게 구분짓는게 애매하다. 

어떤 언어에서는 모든 키워드가 예약어로 되어있어 키워드를 식별자로 사용하는게 불가능하지만 또 일부 언어에서는 키워드를 식별자로 사용하기도 하기 때문에 키워드를 예약어로 단정할 수 없고 예약어 또한 현재 사용중이 아닌 문자도 사용을 못하게 하는 경우가 있기 때문에 모든 예약어가 키워드처럼 의미를 가지고 있지 않을 수 있다.

 

그래서 예약어는 식별자로 사용 못하는 문자 키워드는 특별한 의미를 가지고 있는 문자로 구분하고 각 언어마다 키워드와 예약어를 파악하는게 중요하는게 좋을것같다.

 

💡키워드를 식별자로 사용하는 예 : Fortan ( if then then then = else else else = then)

💡예약어가 키워드로 사용되지 않는 예 : Java  (goto)

 

키워드 종류

키워드는 사용되는 방식과 기능 그리고 문맥에 따라서 종류가 나누어지며 언어마다 각기 다른 특징을 가지고 있기도 하지만 공통되는 부분도 많다.

 

일반적으로 사용되는 키워드를 정리한다.

 

제한자(Modifier)

타입과 멤버를 누가 수정할 수 있는지 특정하여 나타내는 키워드이다. 프로그램의 특정한 부분이 다른 곳에서 수정되는것을 허용하거나 방지하도록한다.

 

접근 제한자(Access Modifier)

클래스, 메서드, 프로퍼티, 필드 등의 멤버를 선언할 때 적용되는 것으로 클래스간의 멤버 접근성을 정의한다.

 

구문(Statement)

구문은 프로그램의 흐름과 연관된 키워드이다.

대표적으로 if, for 등의 키워드가 있다.

 

메서드 매개변수(Method Parameter)

메서드의 매개변수에서만 적용되는 키워드이다.

 

네임스페이스 키워드(Namespace Keywords)

네임스페이스 및 관련 연산자에 적용되는 키워드이다.

using ... 

 

연산자 키워드(Operator Keywords)

기타 작업을 수행하는 키워드이다.

sizeof ...

 

접근 키워드(Access keywords)

객체 또는 클래스에 접근하는데 사용된다.

this ...

 

리터럴 키워드(Literal Keywords)

특정 값으로 평가될 수 있는 키워드이다.

null, false, true 등

 

타입 키워드(Type Keywords)

자료형에 사용되는 키워드이다.

int, char, float ...

 

문맥상 키워드(Contextual Keywords)

특정 문맥상에서만 키워드로 취급된다.

 

 

728x90
반응형

'Program Language' 카테고리의 다른 글

Sync, Async  (0) 2023.01.26
Expression, Statement  (0) 2023.01.20

Expression

표현, 식 등의 뜻을 가지고 있다.

하나 이상의 값으로 표현될 수 있는 코드를 의미한다. 

여기에는 사칙연산의 수식과 같은 것들 뿐만 아니라 함수 콜, 변수 이름, 식별자, 연산자 등까지도 포함된다.

 

요점은 expression은 evaluate가 가능하여 하나의 값으로 나타나는것을 의미한다.

A = 1;
B = 2;
Arr = [1, 2, 3]; 
A + B // 3
Arr[2] = 3;
...

형태는 다르지만 모두 단일 값으로 평가될 수 있는 expression이다. 

Statement

진술, 성명 등의 뜻을 가지고 있다.

프로그래밍에서는 실행 가능한 최소의 독립적인 코드 단위를 말한다.

즉 컴파일러가 이해하고 실행할 수 있는 모든 구문을 Statement라 할 수 있고 문법적으로 적합한 모든 한 줄의 코드나 블록도 Statement라 할 수 있다. 일반적으로 Statement는 하나 이상의 Expression과 키워드를 포함한다.

 

int a = 1;	//expression
int b = 2;	//expression
if (a == b)	// if keyword
{
	return true; //expression
}

정리

Expression은 하나의 값을 표현하는 식이며 하나 이상의 Expression과 키워드로 작성된 구문은 모두 Statement로 볼 수 있다. 따라서 모든 Expression은 Statement라 볼 수 있지만 모든 Statement가 Expression은 아닌 두 관계는 부분집합이 된다.

 

 

 

728x90
반응형

'Program Language' 카테고리의 다른 글

Sync, Async  (0) 2023.01.26
Reserved Word, Keyword  (0) 2023.01.20

메인 함수

C#의 메인함수는 프로그램의 시작점이다. 

프로그램이 실행될 때 가장 먼저 실행되는 함수로 몇가지 조건을 가진다.

- 클래스 또는 구조체 내부에 선언한다.

- 메인함수는 반드시 static으로 선언되어야하며 클래스 또는 구조체가 static일 필요는 없다.

- 접근제한자는 public일 필요는 없다.

- 반환형은 void, int, Task, Task<int> 형을 가질 수 있다. (Task, Task<int> 의 경우 async 한정자 필요)

- 매개변수는 string[]을 가질 수 있다. 이 매개변수에는 명령어 인자가 포함된다.

 

선언

public static void Main() {}
public static int Main() {}
public static void Main(string[] args) {}
public static int Main(string[] args) {}
public static async Task Main() {}
public static async Task<int> Main() {}
public static async Task Main(string[] args) {}
public static async Task<int> Main(string[] args) {}
//( public 접근 제한자는 일반적으로 사용되는 것이며 필요조건은 아니다.)

반환형

메인 함수는 한정자나 매개변수의 상태에 따라 반환형을 선택할 수 있다.

//매개변수, await을 모두 사용하지 않음
static int Main()
static void Main()

//매개변수, awiat 모두 사용
static async Task<int> Main(string[] args)
static void Main(string[] args)

//매개변수를 사용하고 await만 사용하지 않음
static int Main(string[] args)
static aync Task Main()

//매개변수를 사용하지않고 await만 사용
static async Task<int> Main()
static async Task Main(string[] args)

 

메인 함수의 반환값을 통해 프로그램 실행 결과를 확인할 수 있다.

윈도우에서 프로그램이 실행되면 메인 함수에서 반환되는 모든 값이 환경 변수에 저장된다.

저장된 환경 변수는 배치 파일의 ERRORLEVEL 또는 PowerShell의 $LastExitCode를 사용하여 검색할 수 있다.

 

테스트

int 값 반환 확인

실행하면 0을 반환하도록 메인 함수를 만든다.

class MainReturnValTest
{
    static int Main()
    {
        //...
        return 0;
    }
}

해당 스크립트가 위치한 폴더에서 PowerShell을 열어 스크립트를 실행시킨다.

dotnet run
if ($LastExitCode -eq 0) {
	Write-Host "Execution succeeded"
} else
{
	Write-Host "Execution Failed"
}
Write-Host "Return value = " $LastExitCode

비동기 메인 함수

메인 함수를 비동기로 선언하면 컴파일러는 항상 올바른 코드를 실행하는 이점이 있다.

프로그램의 진입점에서 Task 또는 Task<int>를 반환할때 컴파일러는 프로그램 코드에 선언된 진입점 메서드를 호출하는 새로운 진입점을 생성한다.

 

진입점의 이름을 $GeneratedMain이라고 할때 컴파일러는 이 진입점에 대해 다음과 같은 코드를 생성한다.

 

// 결과적으로 동일한 코드를 생성
static Task Main()
static void $GeneratedMain() => Main().GetAwaiter().GetResult();

static Task Main(string[])
private static void $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();

static Task<int> Main()
private static int $GeneratedMain()

static Task<int> Main(string[])
private static int $GeneratedMain(string[] args) => Main(args).GetAwaiter().GetResult();

 

테스트

async 반환값 확인

비동기 함수 호출을 하기 위해서 상용구 코드를 사용하거나 직접 await을 반환하는 메인함수를 만든다.

// boilerplate code
public static void Main()
{
	AsyncConsoleWork().GetAwaiter().GetResult();
}

// or
static async Task<int> Main(string[] args)
{
	return await AsncConsoleWork();
}

// async function return 0
private static async Task<int> AsyncConsoleWork()
{
	return 0;
}

 

코드를 작성한 다음 동일하게 명령어를 입력해보면 결과를 확인할 수 있는데 이번에는 await으로 인한 동작이 추가된걸 확인할 수 있다.

 

 

명령문 인자

다음 방법들로 함수를 정의해서 메인 함수에 인자를 전달할 수 있다.

Main method code Main signature
No return value, no use of await static void Main(string[] args)
Return value, no use of await static int Main(string[] args)
No return value, uses await static async Task Main(string[] args)
Return value, uses await static async Task<int> Main(string[] args)

인자를 사용하지 않는 경우 더 간단하게 함수를 선언할 수 있다.

Main method code Main signature
No return value, no use of await static void Main()
Return value, no use of await static int Main()
No return value, uses await static async Task Main()
Return value, uses await static async TaskMint> Main()
   

또한 Environment.CommandLine 이나 Environment.GetCommandLineArgs를 통해서 콘솔이나 WinForms 응용 프로그램에서 어느 시점에나 인자에 접근할 수 있다. 명령문 인자를 사용할 수 있도록 하기 위해서는 수동으로 메인 함수를 수정해야한다. 

 

💡 메인 함수의 매개변수는 명령문 인자로 문자열 배열이다. 보통은 인자의 존재를 확인할때 문자열 속성인 Lenght 사용한다.

이때 문자열 배열은 null이 올 수 없기 때문에 null 검사하지 않고 Length로만 판단해도 안전하다.

 

문자열 인자는 Convert 클래스나 Parse 함수를 사용해서 숫자 형식으로 변환할 수 있다.

 

long num = Int64.Parse(args[0]);
long num = long.Parse(args[0]);
long num = Convert.ToInt64(s);

 

문자열을 정수로 변환하여 사용하는 예제

인자가 없는 경우 응용 프로그램은 프로그램의 올바른 사용법을 설명하는 메시지를 출력한다.

 

// ---How to using numeric argument---
// Factorial : 정수로 변환된 인자를 팩토리얼 계산후 반환
public class Functions
{
    public static long Factorial(int n)
    {
        if ((n < 0) || (n > 20))
        {
            return -1;
        }

        long tempResult = 1;
        for (int i = 1; i <= n; i++)
        {
            tempResult *= i;
        }
        return tempResult;
    }
}

class Program
{
    static int Main(string[] args)
    {
        if (args.Length == 0)
        {
            Console.WriteLine("Please enter a numeric argument.");
            Console.WriteLine("Usage: Factorial <num>");
            return 1;

        }

        int num;
        bool test = int.TryParse(args[0], out num);
        if (!test)
        {
            Console.WriteLine("Please enter a numeric argument.");
            Console.WriteLine("Usage: Factorial <num>");
            return 1;
        }

        long result = Functions.Factorial(num);

        if (result == -1)
        {
            Console.WriteLine("Input must be >= 0 and <= 20.");
        }
        else
        {
            Console.WriteLine($"The Factorial of {num} is {result}.");
        }

        return 0;
    }
}

예제를 테스트 하기위해서 Developer Command Prompt를 사용한다.

시작 메뉴에서 커맨드 창을 실행시킨다.

(프롬프트창은 굳이 위 프로그램을 사용하지 않아도 된다.)

 

💡Command  명령어 : 경로 이동 cd <path>, 드라이브 변경하는방법 C:\>E:

 

스크립트 파일이 위치한 경로로 이동한 후 다음 명령어를 실행한다,

dotnet build

만약 응용 프로그램이 컴파일 오류가 없다면 해당 스크립트파일의 빌드 파일이 실행된다.

팩토리얼 함수가 잘 동작하는지 확인하기 위해서 인자를 전달해본다.

3의 인자를 전달했을때 3!의 계산 결과인 6이 잘 출력되는걸 확인할 수 있다.

 

728x90
반응형

'Program Language > C#' 카테고리의 다른 글

C# 비동기화 키워드 : async, await  (0) 2023.01.31
C# 클래스 추상화 키워드 : abstract  (0) 2023.01.25
테스트 환경  (0) 2023.01.17
.Net Framework  (0) 2023.01.17
C#  (0) 2023.01.17

+ Recent posts