1. 파일생성.(Visual studio 2019 기준)
1) 먼저 실행시키면 '새프로젝트 만들기' 클릭.
2) 여기서 검색어에 '.NET Framework' 검색 후 콘솔앱(.NET Framework)클릭.
3) 저장하고 싶은 위치 선택 후에 '만들기' 클릭하면 끝. (위치 기억할 것!)
4) 완료되면 다음과 같이 뜨고 아래와 같은 코드가 적혀있을 것이다.(코드가 조금씩 다를 수 있음)
using System;
namespace ConsoleApplication1
{
internal class MainApp
{
public static void Main(string[] args)
{
}
}
}
5) 위 코드만 실행하면 아무것도 안나오니 아래와 같이 글을 써주고 실행한다.
(실행은 '빌드 - '솔루션 빌드' 클릭하면 됨.')
using System;
using static System.Console;
namespace ConsoleApplication1
{
internal class MainApp
{
public static void Main(string[] args)
{
if (args.Length == 0)
{
Console.WriteLine("사용법: <파일명>.exe <이름>");
return;
}
WriteLine("Hello, {0}", args[0]);
}
}
}
그러면 아래와 같이 결과가 나온다.
사용법: <파일명>.exe <이름> |
그렇다면 일단 한가지는 해결되었다.
Console.WriteLine("'문장'"); 을 쓰면 '문장'이라고 적힌 부분이 출력창에서 확인 가능하다는 것.
6) 이제 위와 같이 만든 파일을 실행시켜보자. (위에서 한거는 콘솔화면으로 돌려본 것 뿐임.)
먼저 바탕화면으로 나가서 '[Windows] + [R]'키를 눌러서 '실행'창을 띄우고 거기에 'cmd'라고 쓰고 실행을 눌러보자.
7) 잠시 여기까지 멈추고 이제는 내가 방금 만든 파일의 위치를 들어가보자. 그리고 난뒤 그 파일에서 bin\Debug 폴더까지 들어가보자. 그러면 내가만든 파일의 '이름'.exe 파일이 있을 것이다.
(나같은 경우: E:\csharp\test\ConsoleApplication1\ConsoleApplication1\bin\Debug)
8) 자 다시 CMD로 돌아와서 저 경로까지 들어가보자.
- 경로 이동 방법: 드라이브 간 이동 명령어 ($ '드라이브명': )
(나같은 경우는 C드라이브에서 E드라이브로 이동해야 되므로 'e:'를 작성하였다.)
- 그리고 난뒤에 아까 본 폴더에서 파일경로 복사하고 ($ cd '파일경로')
(나같은 경우는 'cd E:\csharp\test\ConsoleApplication1\ConsoleApplication1\bin\Debug'를 작성하였다.)
- 마지막으로 경로에 exe파일이 있는지 확인은 ($ dir)
9) CMD창에서 내가 원하는 폴더 까지 왔으면 한번 실행하여 보자.
- 실행방법은 먼저 그냥 파일명 입력하면 된다.
- 그러면 아래와 같이 나온다. 위에서 했던거와 똑같다.
- 헌데 우리는 사용법이라 적힌대로 해보면 되니 사용법에 적힌대로 해보자.
10) 사진처럼 나는 ConsoleApplication1.exe Lineho라고 쓰니... 결과가 달라졌다.
- 결과: Hello, LineHo
2. 구문 분석
그럼 다시 코드 분석을 해보자.
위에서 쓴 코드를 아래에 분석해 보았다. 분석할 때 주석(프로그램이 이해하지 못하고 사용자만 이해하는 글)을 이요하였다. 주석을 표기할 때는 //을 쓰고 뒤에 쓰고 싶은 말을 쓰면 된다. 왜 주석을 쓰냐면 이유는 간단히 말해서 사용자가 이게 무엇인지 표기할 때 주로 많이 쓴다.
using System;
//System을 써줘라... 웬지 시스템을 이용하니 써야될 듯.
using static System.Console;
// static정적으로? System.Console을 써달라. 오 System안에 Console이 있구나.
namespace ConsoleApplication1 //맨처음 파일명 만들었을 때랑 똑같네. 큰 틀이구나.
{
internal class MainApp // Namespace안에는 class라는것이 있구나.
{
public static void Main(string[] args) //메인이구나. string[] args라니 문자열을 받게되군
{
if (args.Length == 0) //만약 문자.길이가 0이면?
{
Console.WriteLine("사용법: <파일명>.exe <이름>"); // 이 글씨를 콘솔에 쓰라.
return; // 돌려줘라.
}
WriteLine("Hello, {0}", args[0]);
//엇 바로위는 Console.writeLine인데 왜 얘는 이렇게 해도 되지? 3번줄 영향 때문인가?
//만약이 없으니 아까 <파일명>.exe <이름>했을 때 나온게 이거구나.
//그럼 {0}에는 내가 쓴 글이 들어가게 되는건데 뒤 args[0]에서 가져온거구나.
//그럼 args[0]은 10번줄에서 정의된 것이구나.
}
}
}
1) using System;
세개로 나누어 따로따로(using, System, ;) 봐보도록 하겠다.
- using: C#의 키워드(Keyword)이다. 키워드란 C#언어의 규격에 미리 정의되어 있는 특별한 단어를 뜻하는 것이다.
즉 우리가 함부로 쓰는 것이 아니라 글을 쓸때 그 용도가 이미 정해져 있다. 언제 쓰는지는 아래와 같이 설명된다.
- The using statement defines a scope at the end of which an object will be disposed.
(즉, using을 쓰면 관련된 구문이 우리가 시작하면 시작하고 안쓰면 알아서 폐기해 준다는 뜻. 편리하다~) - The using directive creates an alias for a namespace or imports types defined in other namespaces.
(Namespace 또는 Namespace에 정의된 각 타입을 가져오거나 참조할 때 쓴다.)
(Namespace나 Class란 뭔가 많이 담은 것들 이라고 쉽게 생각하면 된다.) - The imports the members of a single class.
(single class의 멤버들을 사용 가능) - To create an alias for a namespace or a type. This is called a using alias directive.
(기존의 namespace또는 타입의 이름 바꿔치기 가능) - You can access static members of a type without having to qualify the access with the type name
(정적으로 사용가능)
앞서 살펴본대로 쉽게 보면 어디선가 구현된 Namespace, Type, Class 라는 것을 가져와서 쓸 수 있다고 한다.
- System: System은 결국 클래스인데 엄청나게 많은 것들을 담은 Class이다. 한가지 팁으로 우리가 여기서 System을 사용한다고 하지 않으면 구문에서 Console.WriteLine();라고 쓰면 안되고 System.Console.WriteLine(); 이라고 직접 지목해 줘야한다. 즉 우리는 수고를 덜은 것이다.
- ;(세미콜론): 모든 문장 끝에 들어간 것을 볼 수 있는데 쉽게 이야기하자면 '문장의 끝'을 알리는 기호라고 생각하면 좋을 것 같다. 즉 줄에 상관없이 ;(세미콜론)이 들어가면 그것이 문장의 끝이라는 것이다.
2) using static System.Console;
: 위에서도 언급된 것들이 많은데 static도 위에서 언급하였듯이 using에서 사용가능하다.
그럼 static을 붙이면 의미가 어떻게 달라질까? 그 뜻은 아래와 같다.
'어떤 데이터 형식[예:클래스]의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다고 선언'
즉 우리는 뒤에 선언한 System.Console의 정적멤버[예: write(), writeline(), read(), readline()]를 바로 쓰겠다는 것이다.
그래서 위에 Writeline();만 사용한 것이 그 예이다.
3) namespace '어쩌구 저쩌구'{}
: namespace란 위에서 잠깐 이야기하였지만 결국은 '성격이나 하는 일이 비슷한 클래스, 구조체, 인터페이스, 대리자, 열거 형식 등을 하나의 이름 아래 묶는 역할'을 한다. 즉 그냥 '내 이름 아래 모여!'라는 느낌이다.
예를 들어 line 과 ho 라는 각각의 namespace안에 tistory라는 함수가 있다고 생각해보자. 그럼 그냥 tistory라고 쓰면 누구 것인지 모른다. line 것인지 ho 것인지 모르기 때문에 line.tistory 라고 쓰거나 ho.tistory라고 써줘야 된다. 즉 namespace라는 것은 자기 편을 갈라서 자기 안에 애들을 관리하는 공간이라고 생각하면 된다.
namespace는 끝날때 종료 구문이 따로 있지 않다.
4) class '어쩌구 저쩌구'{}
: C#프로그램을 구성하는 기본 단위이다.
데이터를 데이터를 처리하는 기능(Method,메소드, 어디서는 함수(Function)라고도 한다.)로 구성 되었다.
class는 끝날 때 종료 구문이 따로 있지 않다.
5) static void Main(string[] args){}
: 위에서 언급한 메소드 중에서도 특별한 메소드이다. 왜냐하면 프로그램의 진입점(Entry Point)를 나타내기 때문이다. 프로그램을 시작하면 실행되고 종료하면 같이 종료된다. 프로그램과 같이 다니므로 모든 프로그램은 무조건 반드시 Main이라는 이름을 가진 메소드를 하나 가지고 있어햐 한다.
위에서 보듯이 메소드는 하나의 형태를 가지고 있다.
여기서 특이점은 한정자 static를 들 수 있다. C# 프로그램의 각 구문은 코드가 실행되는 시점이 되야 메모리에 할당되는 반면, static키워드로 수식되는 코드는 프로그램이 처음 구동될 때부터 미리 메모리에 할당된다. 그러므로 추후 프로그램이 실행되어 CLR(Common Language Runtime, 프로그램을 실행시켜주는 환경)은 프로그램을 메모리에 올린 후 프로그램 진입점을 찾는데 이때 Main메소드에 static 키워드가 한정되어있지 않다면 CLR은 진입점을 찾지 못한다고 에러를 남겨버리고 만다. 그러므로 꼭 필요하다.
메소드는 끝날 때 종료 구문이 따로 있지 않다.
6) if(args.Length == 0) {}
: 후에 If 문에 대하여 설명하면 그때 이해될 것이다. 간단히 설명하자면 if문 내부에 args.Length 를 매개 변수로 받게 되는데 args는 위 5번에서 Main 함수의 매개변수명이다. 즉 args의 길이(Length)가 0이면~ 아래의 구문을 사용하라는 것이다. 그리고 난뒤 return 하라는 것이다. 만약 그렇지 않다면 if문을 들어가지 않게 된다.
https://docs.microsoft.com/en-us/dotnet/csharp/
※참고자료: 나무위키, WIKIPEDIA, Microsoft .NET Documents
※본 게시물 속 내용을 통해 직접적으로 상업적인 목적이 없으며 게시물은 개인 공부 목적 및 지식 간단 연구목적으로 사용되었음을 명시함. 책 및 인터넷 검색을 참고자료로 하여 실습 및 학습을 한 내용을 올림. 참고한 책 및 인터넷 검색물의 저작권을 존중하므로 책 및 인터넷 저작물의 일부 또는 전부를 무단 복제 및 무단 전재 및 재배포하지 않음(일부라 함은 30%이하의 내용 중복은 불포함[30%이하는 다른 저작물로 간주]). 또한 책 또는 매체를 구매하지 않고는 정확한 내용을 알 수 없으며 개인이 따로 공부한 내용도 추가 되어 책과는 내용이 매우 상이할 수 있음.즉 본 게시물 작성자는 이 게시물을 읽는 모든 사람들이 책을 구매거나 인터넷 검색을 더하여 지식을 같이 나누었으면 좋겠음.
※저작권법 제 28조: 공표된 저작물은 보도, 비평, 교육, 연구 등을 위하여는 정당한 범위 안에서 공정한 관행에 합치되게 이를 이용할 수 있다.
※저작권법에 의거 본 게시물은 원저작물에 대한 수요를 대체하지 아니하며 일반적인 관념, 수록형태를 모두 준수함.
'Programming > C#' 카테고리의 다른 글
[기초(2)/C#] CLR (Common Language Runtime) 이란? (0) | 2020.04.28 |
---|---|
[어원/C#] C#이란? (0) | 2020.04.09 |