NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 팁 앤 테크
  • 매뉴얼

    팁과 테크니컬 노하우를 확인하세요.

    팁 앤 테크

    팁과 테크니컬 노하우를 확인하세요.

    본 사이트의 컨텐츠는 저작권법의 보호를 받으므로 무단 복사, 게재, 배포 등을 금합니다.

    커스텀 문자를 숫자로 변환하는 커스텀 액션 만들기. (Create a custom action that converts char to…

    페이지 정보

    본문

    안녕하세요. NGMsoftware입니다. 오늘은 엔지엠의 커스텀 액션을 만들어 볼건데요. 이 커스텀 액션은 문자 정확히는 Char (Character)를 말합니다. C 나 C++ 프로그래밍에서 Char는 8비트 정수형 처리 변수입니다. A는 숫자로 65이며, a는 97입니다. 이처럼 사용하는 모든 언어는 숫자로 변환할 수 있으며, 반대로 숫자를 문자로 변환할수도 있습니다. ASCII 코드표는 아래 링크에서 확인할 수 있습니다.

    [ ASCII Code Table ]

    ※ 이 예제에서 만든 결과물(Custom Module)은 [ 여기 ]에서 다운로드 받을 수 있습니다.

     

    커스텀 모듈을 제작하기 위해서는 엔지엠 엔터프라이즈 라이센스가 필요합니다. 엔지엠 엔터프라이즈 라이센스가 있는 분은 관리자에게 커스텀 모듈 개발 킷을 요청해서 받아야 합니다. 아래 링크의 커스텀 모듈 개발하기 내용을 참고해서 Visual Studio Community를 설치하세요. 그리고, 비주얼 스튜디오를 실행 시킵니다. 새 솔루션 또는 프로젝트를 추가하세요. 이 프로젝트는 닷넷 프레임워크의 라이브러리입니다.

    Ticc2q0.png

     

     

    프로젝트 이름은 사용자가 임의로 만들어도 됩니다. 저는 직관적인 이름인 "CharToInt"로 지었습니다.  위치는 원하는 곳을 지정하고, 프레임워크는 4.6.1 이상으로 선택하세요.

    guWkbdr.png

     

     

    아래 그림처럼 새로운 프로젝트가 생성 되었을겁니다. 여러분들은 아마도~ 아래 그림과는 다를겁니다. 제 경우에는 NGM의 제품 및 기타 개발중인 프로그램들이 모두 표시되어 있습니다. 이제 커스텀 모듈 개발 킷을 프로젝트의 참조에 추가 시켜야 합니다. 아래 동영상을 참고해서 참조에 추가하세요. 참고로, 바탕화면에 커스텀 모듈 개발 킷(3개)을 복사해두고 참조에 추가 했습니다.

    zJQjyBh.gif

     

     

    너무 오랜만에 커스텀 모듈을 만들다보니... 네이밍 룰을 맞춰야 한다는걸 깜박했네요. 아래 동영상을 참고해서 프로젝트명과 클래스명을 수정해주세요.

    5MJm6tk.gif

     

     

    커스텀 모듈은 2가지 네이밍룰이 존재합니다. 프로젝트명은 Custom으로 시작해야 하고, 엔지엠 에디터에 액션으로 표시되는 클래스는 이름이 Model로 끝나야 합니다. 이는, 엔지엠 에디터가 수용할 수 있는 커스텀 모듈인지 체크하는 최소한의 안전 장치입니다. 이외에도 몇가지 더 존재하지만, 개발하는데 중요한 내용은 아니므로 자세한 설명은 건너뛰도록 하겠습니다. 프로젝트를 선택하고, 우클릭 후 속성을 클릭하세요.

    HuvzWxt.png

     

     

    어셈블리 이름을 "CustomCharToInt"로 변경 해주세요. 관리하기 위한 프로젝트 이름은 변경했지만, 실제 프로젝트가 컴파일되어 만들어지는 라이브러리 이름은 그대로입니다. 프로젝트명과 동일하게 Custom을 붙여주세요. 참고로, 프로젝트를 처음 새성할 때 이름을 제대로 만들었다면~ 이 부분은 안해도 되는 작업입니다.

    KE0OhvL.png

     

     

    이제 본격적으로 코딩을 해봅시다. 코딩은 클래스(CharToIntModel.cs)라는 곳에 작성합니다. 클래스를 더블 클릭하세요. 요즘~ 초딩 코딩 교육이 열풍이죠? 엔지엠 에디터와 비슷한 엔트리나 스크레치를 코딩 교육에 사용합니다. 우리 아이들도~ 엔트리로 코딩 교육을 하고 있습니다. 언젠가는 엔지엠 에디터도 사용하겠죠? 이처럼 블록을 쌓아서 코딩하는 방식이 가장 직관적이고 쉽다는걸 알 수 있습니다. 하지만, 커스텀 모듈은 개발자가 아니라면 혼자서 하기가 쉽지 않죠. 그래서~ Step by Step으로 작성된 메뉴얼을 보고, 직접 학습해야 합니다.

    V45Wfti.png

     

     

    클래스의 내용은 아래와 같습니다. 기본적인 코드는 작성되어 있죠.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CharToInt
    {
        public class CharToIntModel
        {
    
        }
    }

     

    클래스 위에 "[Serializable]" 특성을 부여해줍니다. 이 특성을 부여해야만 엔지엠 에디터에서 역직렬화해서 인스턴스화 할 수 있습니다. 용어가 다소 어려운 부분이 있는데요. 이 부분도 그냥 외워서 사용하시면 됩니다. 엔지엠 에디터에 표시되어야 하는 클래스만 Serializable 특성을 추가해주면 됩니다. 그리고, "NGM.Models.Interface.BaseCustomToolModel"을 상속 받으세요. 그러면 아래와 같은 모드가 됩니다.

    1nwSw0c.png

     

     

    ChartToIntModel 클래스에 빨간색 밑줄이 생깁니다. 여기에 마우스를 올리면 추상 클래스의 구현할 내용들을 자동으로 생성해줍니다. 우리가 ChartToIntModel 클래스를 만들었죠? 일반적으로 인스턴스화해서 사용하는 것들은 클래스라고 부릅니다. 간단하게 얘기하면 추상 클래스는 자동차이고, 인스턴스화 하는 클래스들은 소나타, K5와 같이 실체를 가진 것들을 말합니다. 자동차는 바퀴가 4개고 핸들을 가지고 있죠? 소나타나 K5도 동일합니다. 이런 공통적인 부분들은 추상화할 수 있기 때문에 프로그래밍에서는 많이 사용하는 기술입니다.

    [ 인터페이스와 추상화 ]

    6dzcM4y.gif

     

     

    엔지엠 제품들도 추상화, 인터페이스, 일반화 프로그래밍 기법들이 많이 사용되었습니다. 기본 디자인 패턴은 MVC이지만, CBD 방식으로 컴포넌트를 확장할 수 있습니다. 이런것들은 NGM Framework와 NGM Macro Engine을 만들면서 많은 고민이 있었던 부분입니다. 커스텀 액션을 만드는데 필요한 내용은 아니므로, 건너뛰고 다시 본론으로 돌아가죠^^; 코드를 아래와 같이 수정하세요. 설명은 주석으로 달아 두었습니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CharToInt
    {
        [Serializable]
        public class CharToIntModel : NGM.Models.Interface.BaseCustomToolModel
        {
            /// <summary>
            /// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
            /// </summary>
            public override string DisplayCategory => "NGMsoftware";
    
            /// <summary>
            /// 도구 상자에 표시될 액션 이름을 가져옵니다.
            /// </summary>
            public override string DisplayName => "문자를 숫자로 변환";
    
            public override void Execute()
            {
                throw new NotImplementedException();
            }
        }
    }

     

     

    DisplayCategory, DisplayName은 클래스의 속성입니다. 속성이란 어떤 것(사람, 우주선, 자동차, 유령등등... 세상에 존재하거나 존재하지 않더라도 의미를 부여할 수 있는 모든것)이 가질 수 있는 성질입니다. 아무튼, 엔지엠 에디터에서 DisplayCategory에 설정한 이름은 아래 그림에서 ①에 표시됩니다. DisplayName은 ②에 표시되죠. 커스텀 모듈을 여러개 만드는 경우 DisplayCategory 이름을 동일하게 설정하면 유사한 기능끼리 그룹화할 수 있습니다.

    qaO9ngX.png

     

     

    여기까지가 기본적인 커스텀 모듈 만들기에 대한 설정입니다. 이제부터는 내가 원하는 기능을 만들기 위한 코딩입니다. 아래와 같이 코드를 추가하고, 유징(using)을 추가하세요. 비주얼 스튜디오와 같은 IDE를 사용하면 대부분의 것들이 자동으로 처리됩니다. 이제는 누구나 쉽고 빠르게 원하는 기능을 개발할 수 있게 되었습니다. 두꺼운 책을 옆에 끼고 텍스트 편집기 같은데서 코딩하고, 인텔리센스조차 없던 시절이 있었는데 말이죠 ㅎㅎ;

    FVZShCr.gif

     

     

    각각의 특성들은 아래와 같은 기능을 담당합니다.

            /// <summary>
            /// 숫자로 변환할 Char 문자를 입력하세요.
            /// </summary>
            [Category("Action")]
            [DisplayName("문자")]
            [Description("숫자로 변환할 문자를 입력하세요.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public char Char { get; set; }

     

    Category 특성에 "Action"을 부여하면 속성창의 "작업" 하위에 이 속성이 표시됩니다. 그리고, "Data"를 부여하면 "데이터" 하위에 이 속성이 표시됩니다.

    1ki80wP.png

     

     

    Category 특성은 아래와 같습니다. 이외에도 커스텀 카테고리도 지원하고 있으나, 이 부분은 별도로 알아보겠습니다.

    rW2fC3o.png

     

     

    DisplayName은 속성의 표시 이름입니다. 그리고, Description은 아래 그림과 같이 하단에 표시되는 속성의 설명입니다.

    KvzOOrt.png

     

     

    Browsable 특성은 GUI에 이 속성을 표시할지 여부를 결정합니다. 이 값을 true로 설정했기 때문에 엔지엠 에디터에 보여질겁니다. 마지막으로 DefaultValue가 있는데요. 이 특성은 속성이 가지는 기본 값을 설정합니다. 원시타입이 아닌 경우에는 typeof를 사용해서 기본값을 할당할 수 있습니다. 이제 숫자로 변환할 문자를 받을 속성을 만들었습니다. 변수 또는 사용자로부터 문자를 입력 받았으면 숫자로 변환된 값을 보여줄 속성도 필요합니다. 문자를 숫자로 변환한 값은 결과이므로 데이터에 표시해줍니다. 전체 코드는 아래와 같습니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CharToInt
    {
        [Serializable]
        public class CharToIntModel : NGM.Models.Interface.BaseCustomToolModel
        {
            /// <summary>
            /// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
            /// </summary>
            public override string DisplayCategory => "NGMsoftware";
    
            /// <summary>
            /// 도구 상자에 표시될 액션 이름을 가져옵니다.
            /// </summary>
            public override string DisplayName => "문자를 숫자로 변환";
    
            /// <summary>
            /// 문자가 숫자로 변환된 결과 값을 표시합니다.
            /// </summary>
            [Category("Data")]
            [DisplayName("문자 코드")]
            [Description("문자가 숫자로 변환된 결과 값입니다.")]
            [Browsable(true)]
            [DefaultValue(0)]
            public int CharCode { get; set; }
    
            /// <summary>
            /// 숫자로 변환할 Char 문자를 입력하세요.
            /// </summary>
            [Category("Action")]
            [DisplayName("문자")]
            [Description("숫자로 변환할 문자를 입력하세요.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public char Char { get; set; }
    
            public override void Execute()
            {
                
            }
        }
    }

     

    이제 거의 다 되었습니다. 로직만 짜면 되죠^^; 크롬 웹브라우저를 실행하세요. 그리고, 구글로 이동합니다. 그리고, "how to char to int in c#"이라고 입력 해보세요. 개발자라면 기본 검색 엔진으로 구글을 사용해야 합니다. 네이버나 다음을 기본으로 사용하지 마세요^^; 자~ 내가 원하는 비즈니스 로직을 찾아서 참고하려면 앞에 "how to <내용> in [Language]"와 같이 검색하세요. 그냥 외우세요. 처음에 나오는 내용부터 하나씩 보다보면 원하는 코드를 찾을 수 있을겁니다. 아래는 완성된 코드입니다.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace CharToInt
    {
        [Serializable]
        public class CharToIntModel : NGM.Models.Interface.BaseCustomToolModel
        {
            /// <summary>
            /// 도구 상자에 표시될 카테고리 이름을 가져옵니다.
            /// </summary>
            public override string DisplayCategory => "NGMsoftware";
    
            /// <summary>
            /// 도구 상자에 표시될 액션 이름을 가져옵니다.
            /// </summary>
            public override string DisplayName => "문자를 숫자로 변환";
    
            /// <summary>
            /// 문자가 숫자로 변환된 결과 값을 표시합니다.
            /// </summary>
            [Category("Data")]
            [DisplayName("문자 코드")]
            [Description("문자가 숫자로 변환된 결과 값입니다.")]
            [Browsable(true)]
            [DefaultValue(0)]
            public int CharCode { get; set; }
    
            /// <summary>
            /// 숫자로 변환할 Char 문자를 입력하세요.
            /// </summary>
            [Category("Action")]
            [DisplayName("문자")]
            [Description("숫자로 변환할 문자를 입력하세요.")]
            [Browsable(true)]
            [DefaultValue(null)]
            public char Char { get; set; }
    
            public override void Execute()
            {
                CharCode = (int)Char;
            }
        }
    }

     

    그런데~ 이 코드를 보니 뭔가 불안합니다. 만약, Char 속성에 아무런 값도 없으면 어떻게 될까요? 아마도, 에러를 발생시킬겁니다. 그래서, Char 속성에 사용자로부터 어떤 값이라도 받아야만 동작하도록 수정할 필요가 있습니다. 또는 이 값을 입력하라고 알려줘야 할 필요가 있죠. Execute 메소드를 다음과 같이 수정했습니다.

            public override void Execute()
            {
                // 실행 전 결과 값을 초기화합니다.
                CharCode = 0;
    
                // 사용자로부터 문자를 입력받지 않았다면 에러 메시지를 표시합니다.
                if (Char == '\0')
                    MainView.WriteOutput("문자 속성에 값을 입력해주세요.");
                else
                    CharCode = (int)Char;
            }

     

    이제 컴파일해봅시다. 아래 그림처럼 솔루션 탐색기에서 프로젝트를 선택하고, 우클릭하세요. 그리고, 빌드 또는 다시 빌드를 클릭해줍니다.

    B5V7HcD.png

     

     

    빌드가 성공하면 아래와 같이 1개의 프로젝트가 빌드에 성공했다고 알려줍니다.

    다시 빌드 시작...
    1>------ 모두 다시 빌드 시작: 프로젝트: CustomCharToInt, 구성: Debug Any CPU ------
    1>  CustomCharToInt -> C:\Users\CustomModule\CharToInt\bin\Debug\CustomCharToInt.dll
    ========== 모두 다시 빌드: 성공 1, 실패 0, 생략 0 ==========

     

    컴파일(빌드)해서 만들어진 라이브러리를 바탕화면에 복사해줍니다. 우측 프로젝트에서 우클릭 후 "파일 탐색기에서 폴더 열기"를 선택하세요.

    DjU9s3P.png

     

     

    bin 폴더 안으로 들어가세요.

    JNOtrxH.png

     

     

    Debug 폴더로 들어가세요.

    aKwrH6P.png

     

     

    우리가 만든 CustomCharToInt.dll 라이브러리가 여기 있습니다. 복사 후 바탕화면에 붙여넣기 하세요.

    7u9A1ie.png

     

     

    이제 엔지엠 에디터를 실행 해줍니다. 에디터의 상단 메뉴에서 "관리자 > 도구 모듈 설치"를 클릭하세요.

    GqJyFTA.png

     

     

    바탕화면에 복사한 CustomCharToInt.dll을 선택해주세요. 그러면 커스텀 모듈이 설치되었다는 메시지가 표시됩니다.

    fQSJgtT.png

     

     

    좌측에 ①사용자 도구 탭을 클릭하세요. 그리고, 우리가 만든 ②커스텀 모듈이 표시되는걸 알 수 있습니다.

    r5WhALs.png

     

     

    새로운 스크립트에 문자를 숫자로 변환 액션을 추가하세요.

    NpH2aGc.png

     

     

    "문자" 속성에 "A"를 입력하고, 실행 해보세요. "문자 코드" 속성에 "65"가 표시됩니다.

    HVb2UyL.png

     

     

    이렇게해서 커스텀 액션을 만들어봤습니다. 이걸 응용하면 IntToChar로 변환도 가능하겠죠? 약간만 수정하면 충분히 만들 수 있을겁니다. 프로그래밍을 처음 접하시는 분들은 생소한 단어들이 많을겁니다. 이런것들도 구글에서 검색하면 수많은 유튜브와 블로그가 나옵니다. 개발자마다 설명하는 방식이 다르기 때문에 몇개를 선택해서 보면 좋습니다. 개념을 이해하고 안하고의 차이는 정말 큽니다. 그리고, 이론에 충실하면 에러나 버그를 추적하고 수정하는데 드는 비용을 많이 줄일 수 있습니다. 실제로, 문제가 발생했을 때 어떻게 분석하고 문제 해결을 위한 방안을 찾는지는 개개인의 역량에 크게 좌우됩니다. 꾸준히 연습하는게 실력 향상에 많은 도움이 됩니다.

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.