[Revit API]01-3_C# 문장 작성하기, 변수

JakkeLab·2023년 10월 29일

Revit API

목록 보기
4/9

지난시간에 설명한 코드 구조를 조금 더 자세히 설명하면 아래와 같습니다.

네임스페이스 안에 클래스, 구조체, 인터페이스, 열거형 등을 정의할 수 있고
그 안에 있는것들을 멤버라고 부릅니다.
여기서 메소드는 클래스 안에 정의된 함수를 의미합니다.

간단한 예시를 통해 이를 확인해보겠습니다.

Greeting 이라는 클래스 내에 Name 이라는 속성을 정의했고, SayHello라는 메소드를 추가했습니다.

그러면 이를 참고해서 위쪽의 A, B, C가 각각 무엇인지, 그리고 B와 C를 합쳐서 뭐라고 부르는지 알 수 있을 것입니다.
정답(드래그해서 확인) : A : 클래스, B : 필드, C : 메소드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Part1_3_1_WriteCode
{
    //클래스
    public class WriteCode
    {
        public string MyName;
        //메소드(함수)
        static void Main(string[] args)
        {
            //메소드 내에서 실행하는 내용
            Greeting greeting = new Greeting();
            greeting.Name = "Jakke";
            greeting.SayHello();

            //종료 방지용.
            Console.ReadLine();
        }
    }
    
    //클래스
    public class Greeting
    {
        //필드
        public string Name;

        //메소드(함수)
        public void SayHello()
        {
            Console.WriteLine("Hello, " + this.Name);
        }
    }
}

다음으로 문장을 끝내는 방법 중 2가지를 짚어봅시다.

일반적으로 변수의 선언, 함수의 실행을 하는 것과 같은 것은 하나의 문장으로 이루어집니다. 그리고 끝에 세미콜론(;)을 달아주는 것으로 문장이 끝났음을 표시합니다.
파이썬이나 Javascript와 다르게 세미콜론을 입력하지 않으면 오류가 나는데, 그 이유는 아래와 같습니다.

파이썬은 인터프리터 언어로, 프로그램이 실행될 때 한줄씩 기계어로 번역되면서 CPU가 이를 읽어서 실행을 합니다.
반면, C#은 컴파일 언어로
1. 프로그램을 완성하기 전에 한줄씩 읽을수 있는 인터프리터 언어로 번역합니다.
2. 그렇게 번역된 결과를 각 컴퓨터의 하드웨어에 맞는 기계어로 다시 번역합니다.
3. 이렇게 번역된 결과를 바탕으로 프로그램이 실행됩니다.

이렇게 1~3번의 과정을 거치게 되는데, 한줄씩 읽을 수 있는 언어로 번역을 하기 위해 문장이 어디서 끝나는지를 명시해줘야 합니다.
그래서 문장의 끝에 세미콜론을 붙여줍니다.

그리고 중괄호 (Brace)는 구문을 한단위로 묶는데 주로 사용합니다.
C#에서는

public int GetIndex()
{
	return this.Index;
}
if(index > 10)
{
	...
}
for(int i = 0; i < length; i++)
{
	...
}

이렇게 함수(메소드)를 정의하거나, 조건문 등을 나타낼때 쓰는데 각 경우를 외울필요는 없고 문법을 익히는 과정에서 자연스럽게 언제 쓰는지 습득하게 됩니다.


변수의 사용

C#은 Strongly-Typed 언어로, 변수를 선언할 때, 미리 변수의 타입을 지정해줘야 합니다.
이를 기름통에 빗대서 설명해보겠습니다.

기름은 종류에 따라 용도가 바뀝니다. 휘발유 넣는차에 경유를 넣으면 하면 고장이 나겠죠.
그런데 가져온 기름들이 종류가 다른데 크기와 색이 똑같아서 구분이 안되는 상황이라면? 골치아픕니다.
이를 해결하기 위해선 기름통에 미리 매직으로 쓰거나, 통의 색을 달리하여 구분하는 등의 방법이 필요합니다.

사진처럼 미리 기름 용도별 통의 색상을 달리하여 각 통에 맞는 기름만 넣도록 하는 것과 같이,
미리 변수의 타입을 지정해주는 것이 C#에서 변수를 선언하는 방법입니다.

그래서 C#에서는 변수를 선언할때 기본적으로 아래와 같은 구조가 됩니다.

(타입명) a = (값);

예를들어, a라는 변수에 10이라는 정수를 저장하고 싶으면 정수를 나타내는 타입명인 int를 이용하여

int a = 10;

이렇게 쓸 수 있습니다.

그런데 이미 int로 설정한 변수에 "문자" 라는 문자열을 넣게되면

이런식으로 오류가 납니다. 이는 서로 변환할 수 있는 데이터가 아니기 때문에 위와같은 오류가 나게 됩니다.

그리고 타입을 명시하지 않고 값을 저장하게 되면 오류가 납니다.

명시하지 않은 경우 위와같은 오류가 나오게 됩니다. 따라서 변수명 앞에 변수의 타입을 명시해야 합니다.

C#에서는 아래와같은 타입들이 있습니다.

1. 문자
- string : 문자열을 의미 (ex. "레빗")
- char : 문자 한개를 의미 (ex. "R")

사용 예시

string name = "레빗";
char c = 'R';

문자열은 큰따옴표("")로, 문자는 작은따옴표('')로 씁니다.

2. 정수
- int : 부호가 있는 32비트 정수 (–2,147,483,648 ~ 2,147,483,647)
- uint : 부호가 없는 32비트 정수 (0 ~ 4,294,967,295)
- short : 부호가 있는 16비트 정수 (–32,768 ~ 32,767)
- ushort : 부호가 없는 16비트 정수 (0 ~ 65,535)
- long : 부호가 있는 64비트 정수 (–9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807)
- ulong : 부호가 없는 64비트 정수 (0 ~ 18,446,744,073,709,551,615)
- byte : 부호가 없는 8비트 정수 (0 ~ 255)
- sbyte : 부호가 있는 8비트 정수 (-128 ~ 127)
쉽게 생각해서, u가 붙은것은 부호가 없는것이라고 생각하면 됩니다 (byte 형만 s가 붙으면 부호가 있는것)

사용 예시

int a = 10;

그 외 nint, nuint는 강의에서 별도로 다루지는 않겠습니다.

3. bool : 참과 거짓 2가지만 나타내는 타입

bool isRoom = true;
isRoom = false;

4. 부동 소수점 형식 (2.12423과 같은 실수)
-float : ±1.5 x 10−45 ~ ±3.4 x 1038
-double : ±5.0 × 10−324 ~ ±1.7 × 10308
-decimal : ±1.0 x 10-28 ~ ±7.9228 x 1028

double pyeong = 3.3;

예제

  1. 정수 a와 b를 각각 10, 20으로 선언하고, 이를 더한 결과를 출력하시오.

  2. 실수 d1과 d2를 각각 10.23, 5.01로 선언하고 이를 더한 결과를 출력하시오.

  3. 문자열 str1과 str2를 각각 "Revit", "Programming" 으로 선언하고 이를 합친 결과를 출력하시오.

  4. 문자 c1, c2, c3을 각각 'R', 'V', 'T'로 선언하고 이를 합친 결과를 출력하시오.

참고 : 출력을 할때는 Console.WriteLine({내용}) 으로 하면 됩니다.

소스코드

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Part1_3_2_Types
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("예제1번");
            int a = 10;
            int b = 20;
            Console.WriteLine(a + b);           //30 출력

            Console.WriteLine("\n예제2번");
            double d1 = 10.23;
            double d2 = 5.01;
            Console.WriteLine(d1 + d2);         //15.24 출력

            Console.WriteLine("\n예제3번");
            string str1 = "Revit";
            string str2 = "Programming";
            Console.WriteLine(str1 + str2);     //RevitProgramming 출력

            Console.WriteLine("\n예제4번");
            char c1 = 'R';
            char c2 = 'V';
            char c3 = 'T';
            Console.WriteLine(c1 + c2 + c3);    //252 출력
            Console.WriteLine(c1.ToString() + c2 + c3);    //RVT 출력

            //종료 방지용.
            Console.ReadLine();
        }
    }
}

위 예시를 보면 a와 b가 숫자일 때, 서로 더하면 계산을 한 결과를 보여줍니다.

문자열의 경우, 둘을 이어 붙인 RevitProgramming이 출력이 됩니다.

그런데 char의 경우 둘중 위의 것은 252, 아래것은 RVT가 됩니다.


이는 char 끼리만 쓸 때는 정수의 + 연산자가 설정되기 때문인데, R, V, T 각각에 해당하는 값(ASCII 코드)이 82, 86, 84 이기때문에 이 3개를 합친 252가 나옵니다.

아래것은 그중 하나를 뒤에 .ToString()을 적어서 문자열로 바꿔준 것인데, 이렇게 문자열이 섞여있는 경우에는 문자의 + 연산자가 설정되어 세 문자를 차례대로 이어 붙이게 됩니다.

참고
아스키코드 : https://ko.wikipedia.org/wiki/ASCII

다음 강의에서는 배열, 리스트, 조건문, 반복문에 대해 설명하겠습니다.

profile
시간을 설계하는 건축가

0개의 댓글