본문 바로가기

Software Engineering/Computer Science

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

연산자와 제어문은 프로그래밍의 기본이다. 그에 따라 거의 모든 언어가 비슷한 연산자와 제어문을 공유한다. 따라서 프로그램 언어가 처음이라면 노션에서 배울 항목은 많아도, 이미 다른 언어를 어느정도 배운 적이 있다면 이 챕터들은 아마 수월하게 배울 수 있다.

목   차

     


    3. 연산

    연산자는 거의 모든 언어가 공유한다. 내가 배운 언어들(C, C++, C#, java, python)은 파이썬을 제외하고는 거의 차이가 없다고 봐도 무방하다.  이건 산술연산자, 논리연산자나 비트연산자 모두에 해당하는 이야기다. 특히 비트연산자는 다 같은 것으로 알고 있다.

    산술연산

      +, -, *, /, %, ++, --는 보기의 모든 언어가 공유한다. 어셈블리는 *, /, %가 함수로 구현되고, 파이썬은 추가로 //(정수연산)과 **(제곱) 기호가 있다. 문자열 산술연산으로 넘어가면 조금씩 달라진다. C는 + 대신 strcat이라는 함수를 사용해야만 문자열 더하기가 가능하다. C++와 C#은 모두 문자열 끼리의 + 연산은 가능하지만 - 연산 등은 불가능하다. 근데 C#은 자료형이 달라도 더해지는 반면, C++에서는 반드시 문자열 대 문자열의 관계여야만 한다.

    논리연산

    논리연산자는 Python을 제외한 다른 언어들은 같은 것을 공유한다. Python은 && 대신 and, || 대신 or 을 사용한다. 이쪽이 가독성은 좋지만, 범용적으로는 전자의 기호를 사용하기 때문에 어떤걸 써야 하는지 헷갈리게 한다.

    비트연산

    차이점이 없긴 하지만, 자주 쓰지 않는 터라 잊지 않기 위해 이미지를 첨부한다.

    Think: 사칙연산 간 우선순위가 어떻게 될까?

    아주 기본적인 수학연산처럼 *(곱셈)과 /(나눗셈)을 먼저하고, +(덧셈)과 -(뺄셈)을 한다. 그렇다면 %는 배운 적이 없는데 과연 언제 연산을 하게 될까? 직접 실험해보며 확인해보자. 

    float a = 3 * 5 % 2;

     다음의 출력은 '1' 이다. 따라서 우리는 최소한 %가 *, / 과 순위가 같거나 느리다는 것을 알 수 있다. 

    float a = 15 - 5 % 2;

     다음의 출력은 '14'이다. 만약 뺄셈이 먼저였다면, 출력이 0이 되어야 하므로 - 보다는 %의 연산이 먼저 이루어졌음을 알 수 있다.

    그렇다면 ++와 --의 순서는 어떨까? 후위연산일 때와 전위연산일 때 모두 알아보자.

    float a = 15;
    float b = 3;
    float c = a++ * b;

     여기서 c의 출력은? 45가 된다. a++의 연산은 반드시 이 라인이 끝난 후에나 성사되기 때문이다. 

    float c = ++a * b;

     이렇게 바꾸면 그 결과는? 48이 된다! 즉, 곱셈, 나눗셈보다도 ++의 전위연산이 먼저 이루어진다.

     

    정리하자면!! 산술연산의 우선순위는 ++/--(전위) > *, /, % > +, - > ++/--(연산 자체에 영향을 못미침.) 이 된다. 


    4. 제어문

    제어문은 if, for, while이 가장 기본적인 종류이다. switch, do while은 상대적으로 덜 쓰이는 제어문이다. 또 위에서 배운 '논리 연산자'는 주로 이곳에서 쓰이게 된다. 몇몇 언어는 for each가 있기도 하다. (노션에서는 배열을 배운 다음에 foreach문을 소개하지만, 이것 역시 제어문에 속하고 또 노션 공부를 끝낸 상태에서 복습하는 것이라 미리 소개하겠다.)

    조건문

    계속 말하지만, Python은 극한의 편리성을 위해 독자적인 노선을 타는 편이다. if/else 문에서 중간에 추가 조건을 넣을 때 다른 대부분의 언어가 else if 라고 풀어서 쓸때, 혼자 줄여서 elif 라고 해버린다. 또 switch문도 혼자 없다.(다른 언어도 없을 수는 있지만, 필자가 아는 언어-C계열, java, python만이 비교대상이다!) 사용법은 노션에 자세히 나와있으니 생략한다.

    Think: 언제 if를 쓰고 언제 case를 쓸까?

    하나의 변수가 특정 "여러" 값 중 하나일 경우에는 switch문을, 그 외에는 싹 다 if를 쓴다고 보면 된다. switch문 예제를 보면 알겠지만, 대부분 점수가 몇 점일 때 어떤 알파벳(A,B,C,D,F)을 부여할까 를 고정적으로 사용한다. 이거 외에 쓸 일이 그렇게 많지 않기 때문! 뭘 사용할지 헷갈린다 싶으면 일단 if를 사용하자.

     

    반복문

    python은 혼자 for문의 생김새가 특히나 다르다. 다른 언어들이 for (int i = 0; i < 5; i++) 와 같은 형식을 공유할 때, python은 range 함수를 쓴다!

    for i in range(5):
    	a++
        print(a)

     tistory문제인지 모르겠지만, 위의 코드에서 a++와 print의 들여쓰기 정도는 같다... 왜 다르게 보이는지는 잘 모르겠다. python은 무려 {}도, ;도 필요가 없어버린다. 다른 문자들과 달리 tab도 인식할 수 있기 때문이다. 대부분의 언어는 프로그래머의 편의성을 위해 탭을 하는 거지 사실 한 줄 코딩으로 해도 작동은 한다. 그래서 ;가 존재하는 것이고.

     

    while문도 파이썬만 괄호가 없고, 위의 for문과 같이 :으로 조건을 끝낸다. 또 do while문도 파이썬은 없어서 비슷한 실행을 원한다면 while 문에 true를 넣고 탈출은 break 를 통해야 한다.

     

    +내가 아는 모든 언어들은 break와 continue는 다들 기본 장착하고 있기에 이 부분은 넘어간다.

     

    for each 문

    자주 쓰지 않는 제어문이라 후에 찾아보기 쉽게 따로 서술한다. 다음은 C#의 for each문이다: 

    int[] numbers = {1, 2, 3, 4, 5};
    
    // 배열의 각 요소에 대해 반복
    foreach(int number in numbers) {
        Console.WriteLine(number);
    }

     이처럼 C#은 for과 each가 하나의 이름으로 붙어 있다. 하지만 위에 괜히 띄어쓰기가 있는 것이 아니다. 다음은 C++의 예시이며, java도 유사한 형식을 공유한다. 

    std::vector<int> numbers = {1, 2, 3, 4, 5};
    
    // 벡터의 각 요소에 대해 반복
    for (int number : numbers) {
    	std::cout << number << std::endl;
    }

     vector를 모른다면 일단 배열과 비슷한 것이라 생각하고 넘어가시라. C#과 차이를 보면 in을 :으로 바꾼 차이밖에 없다. 하지만 홍대병의 python은 이번엔 C#과 비슷한 모습을 하고 있다. 

    numbers = [1, 2, 3, 4, 5]
    
    # 리스트의 각 요소에 대해 반복
    for number in numbers:
        print(number)

     지금껏 넣지 않던 주석이 들어가서 추가설명하자면, python은 주석도 자기만 다른 형식을 쓴다. C#과 달리 자료형 선언을 하지 않은 모습을 확인할 수 있는데, 이건 python에서는 선언 자체가 없기 때문이다. 나는 오히려 선언이 없어서 python이 너무 헷갈리지만, 아무튼 편의성을 위해 이 언어는 선언을 생략한단다.(다른 언어에 빗대자면, auto나 var이 패시브라고 생각하면 된다.) 만약 python만 아는데 개발자가 하고 싶다면 꼭 C#이나 java를 함께 배우길 바란다. (C가 원래 언어의 기본 역할을 하지만, 조금 어렵고 없는 기능이 많아 헷갈린다.)