본문 바로가기

Software Engineering/Computer Science

[C++, C#] C#과 다른 컴퓨터 언어의 차이점들1~2

내가 기존에 알고 있던 C++언어 중에 몰랐던 것을 기술하는 글이다. VS Community의 '콘솔앱' 템플릿 차이 는 일부 생략한다.

 

목   차

     


    1. 시작하기

    첫 프로그램 만들기

    <최상위문> 

    using System;
    
            class Program
            {
                static void Main(string[] args)
                {
                    Console.WriteLine("Hello, world!");
                }
            }

     

    1. 원래 cpp에서도 using이 있긴 했지만, 주 #include를 통해 각종 기능을 추가했었다. 이 기능이 C#으로 오면서 using으로 바뀐듯 하다. 원래 cpp에서도 using이 있긴 했지만, 나는 "using namespace std" 이외에는 다른 용도로 쓴 적이 없다. 전지전능한 GPT에 의하면 "C#의 using과 C++의 using은 비슷한 구문이지만, 사용되는 문맥과 목적이 다르며, 각 언어에서 다른 동작을 합니다." 라고 한다.

     

    2. class로 전체를 감싸는 부분과 첫 번째 함수부분(static void Main(string[] args))은 java와 거의 비슷해 보인다. 다음은 java의 코드이다.

    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }

     

    차이점은 public의 유무와 string 자료형의 대문자 여부다. class 다음에 오는 Program과 HelloWorld는 그냥 프로그램 이름이니 원하는 것으로 바꿔도 좋다.

     

    프로그램의 실행과 편집

    <출력>

    C에서는 주로 printf를, cpp에서는 cout을, java에서는 System.out.print를 사용한다면, C#의 출력은 다음과 같다:

    Console.Write("Hello, World!");

    아마 VS Community에서 콘솔앱으로 자동생성된 것은 이 코드에서 Write 뒤에 Line이 붙어있을텐데, 이건 자동 개행을 포함했다는 뜻이다. 비슷하게 java에서는 print 뒤에 ln을 붙임으로써 자동개행을 만들 수 있다. cpp에서는 마지막에 << endl을 붙일 수도 있다. 

    유니티에서 출력을 하면 같은 c#인데도 출력문이 다르다:

    Debug.Log("Hello, World!");

     이것은 Unity 인터페이스에서 출력을 하기 때문에 위의 콘솔창으로 출력하는 코드와는 달라지는 것이다.

     

    Think:  ' \ ' 을 문자열 안에 사용하려면 어떻게 할까?

    답: "\\" 이라 입력하면 된다! 비슷하게 "이나 온점(.) 등 각종 기호들은 대체로 앞에 백슬래시(또는 원 기호)를 붙이면 출력할 수 있게 된다.


    2. 데이터 다루기

    이 챕터는 전반적인 언어들 사이에 공유하는 것이 많기 때문에 많은 부분이 생략된다.

    자료형의 차이

    <float>

    내가 제일 헷갈렸던 것 중 하나이다. 원래 cpp에서는 다음의 코드에 오류가 없다:

    float a = 0.5;
    double b = 1.1;
    float c = a + b;
    
    cout << c;

     

    1. 이게 C#이 된다면, a는 0.5가 아닌 0.5f가 되어야 한다. 더 이상 float의 생략이 안된다.

    2. 또 서로 다른 자료형을 더할 때 cpp에서는 자료형의 크기가 커지든 작아지든 상관없이 크기가 안맞으면 넘치는 부분을 과감하게 생략해버림으로써 연산이 이루어지지만, C#에서는 서로 다른 자료형을 더할 때의 자료형은 반드시 크기가 큰 쪽으로 치우치는 것 같다. 이건 char 같은 문자에도 적용되는 듯하다. 다른 언어들은 제각각 특징이 미묘하게 달라서 생략한다.

    <string>

    1. c, cpp 등에서는 따로 string 팩을 추가해야 사용할 수 있지만, C#에는 기본으로 추가가 되어있다.

    2. 문자열 조작 방법: 더 이상 함수의 방식으로 조작하지 않는다. cpp에서는 str.length()가 문자열의 길이였지만, C#에서는 str.Length다. 이것도 헷갈린 요소이다.

     

    <자료형 정리>

    <형 변환: Convert, Parse, TryParse>

    이거는 string에서 다른 자료형으로 바꾸는 것만 특이점이 왔다.

    string iStr = "10";
    int x;
    x = Convert.ToInt32(iStr); // x : 10
    
    string bStr = "true";
    bool b;
    b = Convert.ToBoolean(bStr); // b : true

    우선 Convert는 "." 뒤에 추가적인 함수가 붙어야 한다. 형식은 To + (대문자 자료형)(변수명) 이다.

     

    string iStr = "10";
    int x;
    x = int.Parse(iStr); // x : 10
    
    string bStr = "true";
    bool b;
    b = bool.Parse(bStr); // b : true

     다음은 Parse. 이건 순서가 반대다. (소문자 자료형).Parse(변수명) 이다. 

     

    string iStr = "10";
    int x;
    bool isSuccess;
    isSuccess = int.TryParse(iStr, out x); // isSuccess : true
    
    string bStr = "true";
    bool b;
    bool.TryParse(bStr, out b); // b : true

    마지막으로 TryParse. 이건 Parse에서 기능이 추가된 함수다. Parse와 비슷하게 (소문자 자료형).TryParse(변수1, out 변수2) 의 형식이다. 이 때 TryParse는 bool형을 반환하므로, isSuccess처럼 앞에 bool형을 두면 iStr에 들어있는 자료형이 x와 일치할 때 true, 아니면 false를 반환한다. 또한 true인 경우에 한해서 x에 iStr의 값이 자료형이 바뀐 채로 할당된. 만약 false라면, 그냥 기본값을 출력하는 것으로 보인다. int면 0, bool이면 false, string이면 "".

     

    Think: Convert와 Parse는 어떤 차이가 있을까?

    Convert는 문자열이 아닌 자료형도 변환할 수 있다. 하지만 Parse는 문자열만 바꿀 수 있다.