티스토리 뷰

728x90

프로그램의 종류를 살펴 보면 아파치 웹서버나 크롬 브라우저, 윈도우 운영체제 처럼 서로 다른 언어 환경에도 불구하고 사용자 인터페이스만 다를뿐 동일한 기능과 성능을 발휘하는 범용 프로그램이 있는 반면 프로그램 로직 구성에 있어서 언어별 전문 용어가 사용 될 수 밖에 없는 프로그램들이 있습니다. 다양한 수식이 적용되는 회계 프로그램이나 대형 플랜트 관리 프로그램, 회사 업무 관리 프로그램등을 예로 들 수 있습니다.


이런 프로그램들의 내부를 살펴보면 업무 흐름을 표현하는 비즈니스 로직은 코드를 처음 보는 사람들에게는 거의 암호 수준이라해도 과언이 아닐 정도입니다. 콩글리시를 최소화하고 변수명, 함수명을 정확한 영어로 기술하여 그나마 가독성 있게 작성한 경우라면 다행이지만 이런 경우 마저도 영어를 읽을줄 아는 한국인이라 하더라도 모국어인 한국어 만큼 피부에 와닿지는 않는 법입니다.


예전에는 BASIC 프로그래밍 언어를 한글로 작성하게 하는 시도라거나 SQL문을 한글로 작성할 수 있게 만든 DBMS, 한글로 명령을 내릴 수 있는 DOS 운영체제와 같은 시도가 있었지만 대중화에는 실패한 사례가 있었습니다. 돌아보면 변수와 함수명, 주요 키워드마저 한글로 작성한다고 가독성이 아주 좋아지는 것은 아니라고 생각됩니다.  수식, 업무 로직과 같은 처리 흐름을 한글로 자연스럽게 표현하면서도 프로그램 제작이 복잡해 지지도 않고, 성능상의 차이도 거의 없는 환경이 참 좋지 않을까 싶은데 그 해결책으로 C#을 만난 것입니다.


C#에서는 숫자가 아닌 영문자나 한글로 시작한다면 클래스명, 함수명, 속성명, 변수명등에 한글을 사용할 수 있습니다. 길이도 거의 무제한이기 때문에 자유롭게 이름을 기술 할 수 있다고 하겠습니다.


문제는 혹시 오류가 있지는 않을까? 하는 의구심과 성능이 많이 떨어지지 않을까? 하는 염려인데 논리적으로 생각해 보면 C#에서 한글을 변수명이나 함수명에 사용해도 정확성이나 성능에는 그다지 영향을 미치지 않을 것이다 라는 예상을 하게 됩니다. C#이 컴파일러 언어이기 때문이고 한글을 사용할 수 있는 근본적인 이유는 코드 체계로 유니코드를 사용하기 때문입니다. 일본어나 중국어로 변수명이나 함수명을 기술할 수도 있다는 의미겠지요. *.cs의 파일 형태도 UTF-8-BOM 텍스트 파일입니다.


C# 프로그램에서 한글을 사용할때의 정확성과 성능을 검증하기 위해서 동일한 기능을 수행하는 한글 및 영문 클래스를 제작하고 이를 5백만번 수행해서 그 결과를 검증해 보기로 했습니다. 결과가 동일하게 일치하는지 여부와 한글/영문의 성능 차이를 살펴볼 까 합니다.




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            rst_eng.Text = "___";
            한글_결과.Text = "___";
            time_eng.Text = "___";
            한글_시간.Text = "___";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            DateTime hfromtime = DateTime.Now;
            한글클래스 한클래스 = new 한글클래스("Go start!");

            for (long 인덱스 = 0; 인덱스 < 5000000; 인덱스++)
            {

                한클래스.작업스트링 = (한클래스.함수1() + 한클래스.함수2() + 한클래스.함수3()).ToString() + 한클래스.작업스트링
                                + (한클래스.함수4() + 한클래스.함수5() + 한클래스.함수6()).ToString() + 한클래스.작업스트링
                                + (한클래스.함수7() + 한클래스.함수8() + 한클래스.함수9()).ToString();
                한클래스.작업스트링 = 한클래스.작업스트링.Substring(5, 15);
                한글_카운트.Text = 인덱스.ToString();
            }
            DateTime htotime = DateTime.Now;
            한글_결과.Text = 한클래스.작업스트링;
            한글_시간.Text = htotime.Subtract(hfromtime).TotalMilliseconds.ToString();

            DateTime fromtime = DateTime.Now;
            eng_class eng = new eng_class("Go start!");

            for (long i = 0; i < 5000000; i++)
            {

                eng.workstr = (eng.goact1() + eng.goact2() + eng.goact3()).ToString() + eng.workstr
                                + (eng.goact4() + eng.goact5() + eng.goact6()).ToString() + eng.workstr
                                + (eng.goact7() + eng.goact8() + eng.goact9()).ToString();
                eng.workstr = eng.workstr.Substring(5, 15);
                eng_count.Text = i.ToString();
            }
            DateTime totime = DateTime.Now;
            rst_eng.Text = eng.workstr;
            time_eng.Text = totime.Subtract(fromtime).TotalMilliseconds.ToString();

        }
    }


    class eng_class
    {
        public String workstr;
        String w1, w2, w3, w4, w5, w6, w7, w8, w9;
        double val = 3.141592;
        double val1, val2, val3, val4, val5, val6, val7, val8, val9;

        public eng_class(String init)
        {
            workstr = init;
        }

        public double goact1()
        {
            val1 = val - 0.0012345;
            w1 = val1.ToString();
            return val1;
        }

        public double goact2()
        {
            val2 = val + 0.00345;
            w2 = val2.ToString();
            return val2;
        }

        public double goact3()
        {
            val3 = val + 0.00345;
            w3 = val3.ToString();
            return val3;
        }

        public double goact4()
        {
            val4 = val + 0.00345;
            w4 = val4.ToString();
            return val4;
        }

        public double goact5()
        {
            val5 = val + 0.00345;
            w5 = val5.ToString();
            return val5;
        }

        public double goact6()
        {
            val6 = val + 0.00345;
            w6 = val6.ToString();
            return val6;
        }

        public double goact7()
        {
            val7 = val + 0.00345;
            w7 = val7.ToString();
            return val7;
        }

        public double goact8()
        {
            val8 = val + 0.00345;
            w8 = val8.ToString();
            return val8;
        }

        public double goact9()
        {
            val9 = val + 0.00345;
            w9 = val9.ToString();
            return val9;
        }
    }

    class 한글클래스
    {
        public String 작업스트링;
        String 임시1, 임시2, 임시3, 임시4, 임시5, 임시6, 임시7, 임시8, 임시9;
        double 값 = 3.141592;
        double 값1, 값2, 값3, 값4, 값5, 값6, 값7, 값8, 값9;

        public 한글클래스(String 초기치)
        {
            작업스트링 = 초기치;
        }

        public double 함수1()
        {
            값1 = 값 - 0.0012345;
            임시1 = 값1.ToString();
            return 값1;
        }

        public double 함수2()
        {
            값2 = 값 + 0.00345;
            임시2 = 값2.ToString();
            return 값2;
        }

        public double 함수3()
        {
            값3 = 값 + 0.00345;
            임시3 = 값3.ToString();
            return 값3;
        }

        public double 함수4()
        {
            값4 = 값 + 0.00345;
            임시4 = 값4.ToString();
            return 값4;
        }

        public double 함수5()
        {
            값5 = 값 + 0.00345;
            임시5 = 값5.ToString();
            return 값5;
        }

        public double 함수6()
        {
            값6 = 값 + 0.00345;
            임시6 = 값6.ToString();
            return 값6;
        }

        public double 함수7()
        {
            값7 = 값 + 0.00345;
            임시7 = 값7.ToString();
            return 값7;
        }

        public double 함수8()
        {
            값8 = 값 + 0.00345;
            임시8 = 값8.ToString();
            return 값8;
        }

        public double 함수9()
        {
            값9 = 값 + 0.00345;
            임시9 = 값9.ToString();
            return 값9;
        }
    }

} 

위의 코드 예제와 같이 클래스명, 함수명, 변수명등에 한글은 자유롭게 사용할 수 있습니다.  물론 변수 타입과 같은 C#의 키워드는 그대로 영문으로 작성해야 합니다.


코드의 흐름은 간단합니다. 동일한 처리를 수행하는 두개의 클래스를 이름만 영문과 한글로 달리해서 한번은 영문 클래스를 먼저 수행하고 그 다음에는 한글 클래스를 수행합니다. 각 클래스의 수행 전후 시각을 추출하여 시간 차이를 수행 결과와 함께 출력하여 한글 이름 클래스의 정확성과 시간 지연 여부를 확인하는 것입니다. 각 클래스에 대해서 5백만번 반복 수행하므로 정확성과 시간 차이를 제대로 짚어 내지 않을까 싶습니다. 특히 한글 변수명과 함수명을 길게 입력해서 성능 차이를 좀더 분명하게 확인해 보고자 합니다.






위의 그림은 차례대로 영문 클래스를 먼저 수행했을 때의 결과와 한글 클래스를 먼저 수행 했을 때의 결과입니다. 테스트 결과를 분석해 보면 한글 클래스를 실행한 것과 영문 클래스를 실행한 것 두가지 클래스의 수행 결과는 일치합니다.  한글이름으로 코드를 작성하더라도 코드 수행 결과의 정확성에는 영향을 미치지 않는다는 점입니다.


수행 속도에 대해서는 한글 클래스를 사용했을 때 약간의 시간 지연이 있지 않을까하는 추측을 했지만 수행결과 거의 차이가 없었습니다. 한글 클래스를 먼저 수행하면 80ms 더 빨리 수행했고 영문 클래스를 먼저 수행하면 60ms 더 빨리 수행했으니 단순 수치로만 비교하면 한글 이름을 길게 기술한 경우가 오히려 빨랐습니다. 결과적으로 한글이름으로 클래스명, 함수명, 변수명을 작성해도 정확성과 성능에는 영향이 거의 없다고 하느 것이 맞을 것으로 보입니다.




728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함