[1] 클래스 라이브러리와 닷넷 스탠다드

  • 23 minutes to read

클래스 라이브러리는 재 사용 가능한 코드를 DLL 파일로 압축해서 관리해주는 기능을 제공합니다. Visual Studio에서 제공하는 클래스 라이브러리 프로젝트의 결과물로 만들어진 DLL 파일을 통해서 여러 프로젝트에서 사용되는 공통 코드를 관리할 수 있습니다.

> // 클래스 라이브러리: 하나 이상의 앱에서 호출되는 형식 및 메서드 등을 정의하여 DLL로 제공

클래스 라이브러리 프로젝트

Windows 환경에서 콘솔 응용 프로그램으로 컴파일된 결과물은 일반적으로 *.exe 파일입니다. 클래스 라이브러리 프로젝트를 사용하면 컴파일된 결과물이 *.dll 파일로 생성이됩니다.

DLL 파일은 동적 링크 라이브러리(Dynamic Link Library)라고 하는데 단독으로 실행되지 않고 다른 프로그램에서 참조해서 사용할 수 있는 구조로 되어 있습니다. 말 그대로 라이브러리 파일입니다.

클래스 라이브러리 프로젝트의 종류

C#으로 만들 수 있는 클래스 라이브러리 프로젝트는 종류가 다양합니다.

  • 클래스 라이브러리(.NET)
  • 클래스 라이브러리(.NET Framework)
  • 클래스 라이브러리(.NET Core)
  • 클래스 라이브러리(.NET Standard)

여러 클래스 라이브러리 프로젝트 중에서 닷넷 스탠다드는 닷넷을 사용하는 모든 영역에서 공통적으로 사용할 수 있는 API를 모아놓을 수 있기에 최근에는 특별한 경우가 아니면 클래스 라이브러리는 닷넷 스탠다드 프로젝트 기반으로 생성합니다. 현재는 .NET 5 이후로 닷넷 코어가 닷넷 그 자체로 통합되어 각각의 버전에 맞는 클래스 라이브러리로 만들어 사용하면 됩니다. 어쨌든, 모든 닷넷 버전에 공통으로 사용되는 라이브러리는 닷넷 스탠다드입니다.

IMPORTANT

닷넷 최신 버전만 사용한다면 굳이 닷넷 스탠다드를 선택할 필요가 전혀 없습니다. 각각의 닷넷 버전에 맞는 클래스 라이브러리 프로젝트를 선택하면 됩니다.

TIP

여러 .NET 프로젝트가 동일한 코드를 공유할 필요가 있을 때는 .NET Standard를 사용하여 클래스 라이브러리 프로젝트를 생성하고, 이 라이브러리를 각 프로젝트에서 참조하여 사용하면 효율적입니다.

어셈블리(Assembly)

클래스 라이브러리 프로젝트를 빌드하면 결과물이 DLL(Dynamic Link Library) 파일로 생성됩니다. 그러나 이 파일은 단독으로 실행할 수 없으며, 다른 응용 프로그램에서 참조하여 사용해야 합니다. 이러한 DLL 파일을 어셈블리(Assembly)라고 합니다.

어셈블리는 자동차(Car 클래스)를 예로 들면, 교체 가능한 부품과 같습니다. 엔진, 바퀴, 변속기처럼 특정 기능을 담당하는 모듈이 조합되어 하나의 완성된 자동차를 구성하는 것과 같이, 어셈블리는 독립적인 기능 단위를 제공하여 프로그램의 일부로 활용됩니다.

C#에서 컴파일된 소스 코드의 결과물을 *닷넷 어셈블리(.NET Assembly)*라고 부르며, 실행 파일(.exe) 또는 라이브러리(.dll) 형식으로 생성됩니다.

[그림: 어셈블리]

어셈블리

참고로, C#의 어셈블리는 프로그래밍에서 기능을 모듈화하는 개념으로, 다음과 유사한 역할을 합니다.

  • 파이썬모듈(Module) 또는 패키지(Package)
  • C 언어헤더 파일(Header File)

이처럼 어셈블리는 코드의 재사용성을 높이고, 유지보수를 용이하게 하며, 프로젝트를 모듈 단위로 관리할 수 있도록 도와줍니다.

전역 어셈블리 캐시(GAC; Global Assembly Cache)

Windows 환경에서 컴퓨터에서 사용되는 모든 어셈블리들을 모아놓은 폴더를 전역 어셈블리 캐시 영역으로 부릅니다. 줄여서 GAC라고 표현하며 일반적으로 다음 폴더입니다.

  • C:\Windows\Assembly 폴더

참조(Reference)

GAC 또는 다른 클래스 라이브러리에 있는 어셈블리를 사용하려면 Visual Studio에서 참조 추가를 해야 합니다. Visual Studio의 템플릿으로 제공되는 여러 클래스 라이브러리 프로젝트들은 C# 콘솔 응용프로그램등에서 프로젝트 참조 추가를 통해서 가져다 사용할 수 있습니다.

[실습] 닷넷 스탠다드 프로젝트로 나만의 라이브러리 만들기

소개

닷넷 스탠다드(.NET Standard) 기반의 클래스 라이브러리를 사용하여 나만의 라이브러리를 만들고 하나 이상의 프로젝트에서 사용하는 방법에 대해서 학습합니다. 참고로, 박용준 강사는 유틸리티(Utility)보다는 라이브러리(Library)가 크고, 라이브러리보다는 프레임워크(Framework)가 더 큰 존재로 표현합니다.

이번 실습에서 만드는 프로젝트는 앞으로 이어질 2개의 강의에서도 함께 사용될 것입니다.

이번 실습에서 생성되는 Dul 솔루션의 최신 전체 소스는 다음 경로에서 확인할 수 있습니다.

따라하기 1: Dul 클래스 라이브러리 프로젝트 생성하기

(1) Visual Studio를 사용하여 Dul 이름으로 <C# > .NET Standard> 템플릿으로 프로젝트를 생성합니다. 최신 .NET 버전을 사용해도 무방합니다.

그림: Dul 이름의 클래스 라이브러리 프로젝트 생성

Dul Class Library Project

(2) 박용준 강사는 C 드라이브에 C# 폴더에 Dul 이름으로 프로젝트를 생성했습니다. 하지만 프로젝트 이름과 저장 위치는 독자들이 원하는 대로 설정해도 괜찮습니다.

그림: 프로젝트 및 솔루션 이름 지정

프로젝트 및 솔루션 이름 지정

(3) 프로젝트 생성 후 기본 생성된 Class1.cs와 같은 클래스는 삭제를 합니다.

그림: 기본 생성 cs 파일 삭제

기본 cs 파일 삭제

(4) 프로젝트를 [솔루션 빌드] 또는 [솔루션 다시 빌드] 메뉴를 사용하여 빌드하면 프로젝트가 위치한 하위 폴더에 프로젝트 이름으로 DLL 파일이 생성됩니다.

그림: 솔루션 빌드 또는 솔루션 다시 빌드

솔루션 빌드

[Debug] 모드로 빌드하면 다음과 같이 Debug 폴더에 Dul.dll 파일이 생성됩니다.

그림: Debug 모드로 빌드

Debug 모드로 빌드

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

[Release] 모드로 솔루션을 다시 빌드하면 다음과 같이 Release 폴더에 Dul.dll 파일이 생성됩니다.

그림: Release 모드로 빌드

Release 모드로 빌드

1>------ 모두 다시 빌드 시작: 프로젝트: Dul, 구성: Release Any CPU ------
1>Dul -> C:\C#\Dul\Dul\bin\Release\netstandard2.0\Dul.dll
========== 모두 다시 빌드: 성공 1, 실패 0, 생략 0 ==========

이렇게 만들어진 DLL 파일은 닷넷 기반의 다른 프로젝트의 bin 폴더에 Dul.dll 파일을 복사해 놓으면 Dul 프로젝트에서 만들어 놓은 기능들을 해당 프로젝트에서 가져다 사용할 수 있는 개념입니다.

따라하기 2: Dul 프로젝트에 몇 가지 API 추가하기

(1) Dul 프로젝트에 01_Creator 폴더 생성 후 Creator.cs 이름의 클래스 파일을 생성 후 다음과 같이 코드를 작성합니다. Creator 클래스는 정적 메서드인 GetName() 메서드를 가지고 이를 호출하면 단순하게 프로젝트.DLL 파일에 대한 제작자 이름 또는 별명을 문자열로 반환합니다.

그림: Creator.cs 파일 만들기

Creator.cs 파일 만들기

코드: Creator.cs

namespace Dul
{
    /// <summary>
    /// *Dul.dll* 파일 제작자: RedPlus
    /// </summary>
    public class Creator
    {
        public static string GetName() => "RedPlus";
    }
}

클래스 라이브러리 프로젝트는 Main() 메서드에 Console.WriteLine()과 같이 직접 내용을 출력하는 기능이 아닌 말 그대로 라이브러리 형태로 주요 API를 담아놓는 기능을 합니다. 콘솔 응용 프로그램 또는 데스트톱 응용 프로그램에서 공통적으로 사용할 기능은 클래스 라이브러리에 모아 놓으면 나중에 재 사용하기에 좋습니다.

(2) 클래스를 하나 더 만들어 보겠습니다. 프로젝트에 02_Mathematics 폴더를 생성 후 Math.cs 클래스 파일을 생성 후 다음과 같이 코드를 작성합니다. 만약 Dul 이름이 아닌 다름이름으로 프로젝트를 만들었다면 네임스페이스를 직접 작성한 솔루션 이름으로 넣어도 됩니다.

그림: Math.cs 파일 만들기

Math.cs 파일 만들기

코드: Math.cs

namespace Dul
{
    /// <summary>
    /// Math 클래스 모방
    /// </summary>
    public class Math
    {
        /// <summary>
        /// 절댓값 구하기 
        /// </summary>
        /// <param name="number">자연수</param>
        /// <returns>절댓값</returns>
        public static int Abs(int number) => (number < 0) ? -number : number;
    }
}

당연한 얘기겠지만, Math.Abs()는 이미 닷넷에 내장된 API입니다. 하지만, 이를 모방하여 나만의 라이브러리를 만들어 보는 과정으로 Math.cs 클래스를 생성하였습니다.

(3) 마지막으로 클래스 하나만 더 만들어 보겠습니다. 03_String 폴더를 생성 후 StringLibrary.cs 이름으로 클래스 파일을 추가한 후 다음과 같이 코드를 작성합니다.

그림: StringLibrary.cs 파일 만들기

StringLibrary.cs 파일 만들기

코드: StringLibrary.cs

namespace Dul
{
    public static class StringLibrary
    {
        /// <summary>
        /// 주어진 문자열을 주어진 길이만큼만 잘라서 반환, 나머지 부분은 '...'을 붙임
        /// </summary>
        /// <param name="cut">원본 문자열</param>
        /// <param name="length">잘라낼 길이</param>
        /// <returns>안녕하세요. => 안녕...</returns>
        public static string CutString(
            this string cut, int length, string suffix = "...")
        {
            if (cut.Length > (length - 3))
            {
                return cut.Substring(0, length - 3) + "" + suffix;
            }
            return cut;
        }

        /// <summary>
        /// 유니코드 이모티콘을 포함한 문자열 자르기
        /// </summary>
        /// <param name="str">한글, 영문, 유니코드 문자열</param>
        /// <param name="length">자를 문자열의 길이</param>
        /// <returns>잘라진 문자열: 안녕하세요. => 안녕...</returns>
        public static string CutStringUnicode(
            this string str, int length, string suffix = "...")
        {
            string result = str;

            var si = new System.Globalization.StringInfo(str);
            var l = si.LengthInTextElements;

            if (l > (length - 3))
            {
                result = si.SubstringByTextElements(0, length - 3) + "" + suffix;
            }

            return result;
        }
    }
}

str 문자열을 result 변수에 그대로 저장한 후, System.Globalization.StringInfo 클래스를 사용하여 str의 문자 요소 개수를 l 변수에 저장합니다. 이때 LengthInTextElements는 유니코드 문자 조합을 고려하여 실제 문자 개수를 반환합니다.

여기까지 작성한 후 [솔루션 다시 빌드]를 실행하여 Dul.dll 파일을 다시 생성합니다.

따라하기 3: 콘솔에서 DLL 파일 참조해서 사용하기

(1) [따라하기 2]에서 만든 API를 사용하기 위해서 콘솔 응용 프로그램을 하나 만들어 보겠습니다. 솔루션 탐색기에서 [Dul] 솔루션에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 프로젝트>를 선택하여 새로운 프로젝트를 추가합니다.

그림: 콘솔 프로젝트 생성하기

콘솔 프로젝트 생성하기

(2) 프로젝트 유형은 .NET 기반의 콘솔 앱을 선택합니다. 또한, .NET Framework 기반의 콘솔 앱을 선택해도 무방합니다. 현재 강의를 학습하는 시점에서 .NET 8.0 또는 .NET 9.0과 같은 최신 버전을 사용하여 연습해도 괜찮습니다.

그림: 콘솔 앱 프로젝트 추가

콘솔 앱 프로젝트 추가

(3) 콘솔 앱의 이름은 Dul.App 이름을 주고 프로젝트를 생성합니다.

그림: 콘솔 앱 프로젝트 이름 지정

콘솔 앱 프로젝트 이름 지정

(4) Dul 솔루션에 새롭게 생성된 Dul.App 콘솔 앱 프로젝트의 생성된 모습은 다음 그림과 같습니다.

그림: 클래스 라이브러리 및 콘솔 앱 프로젝트 생성 확인

Dul.App 프로젝트 생성 확인

(5) 자, 그러면 Dul 클래스 라이브러리를 Dul.App 콘솔 앱에서 사용하려면 Dul.App의 종속성(References)에 마우스 오른쪽 버튼을 클릭하여 [참조 추가] 메뉴를 선택합니다.

그림: 참조 추가

참조 추가

(6) [참조 관리자] 창에서 솔루션 내의 프로젝트인 Dul을 확인 후 체크박스를 체크한 후 [확인] 버튼을 클릭합니다.

그림: 참조 관리자에서 클래스 라이브러리 체크

참조 관리자에서 클래스 라이브러리 체크

(7) 클래스 라이브러리에 대한 참조가 끝나면 종속성 노드의 하위에 다음 그림과 같이 Dul 항목이 등록된 것을 확인할 수 있습니다. 참고로, 이러한 모양은 Visual Studio의 버전에 따라 조금 다르게 보여질 수 있습니다.

그림: 참조가 추가된 모양 확인

참조가 추가된 모양 확인

참고로, 참조 추가가 완료되면 필자의 환경에서는 다음 그림과 같이 Dul.dll 파일이 bin 폴더에 추가가 된 것을 확인할 수 있습니다.

그림: DLL 파일 위치 살펴보기

DLL 파일 위치 살펴보기

(8) Dul.App 콘솔 프로젝트의 Program.cs 파일을 다음과 같이 작성합니다. Dul.dll 파일에 정의된 API를 호출해서 사용합니다.

코드: Program.cs

using System;

namespace Dul.App
{
    class Program
    {
        static void Main(string[] args)
        {
            //[1] Creator 호출 테스트
            Console.WriteLine(Dul.Creator.GetName());

            //[2] Math 호출 테스트
            Console.WriteLine(Dul.Math.Abs(-1234));

            //[3] StringLibrary 호출 테스트
            Console.WriteLine("안녕하세요.".CutStringUnicode(6));
        }
    }
}

(9) Dul.App 프로젝트를 시작 프로젝트로 설정 후 Ctrl + F5를 눌러 실행하면 다음과 같이 실행됩니다.

RedPlus
1234
안녕하...

C:\Program Files\dotnet\dotnet.exe(20392 프로세스)이(가) 0 코드로 인해 종료되었습니다.
이 창을 닫으려면 아무 키나 누르세요.

여기까지 실행이 완료되면 클래스 라이브러리에서 생성된 로직을 콘솔(또는 기타 다른 앱) 응용 프로그램에서 참조하여 사용하는 식으로 공통 코드는 클래스 라이브러리에 넣고 이를 콘솔과 같은 실행 가능한 프로젝트에서 참조해서 사용합니다.

마무리

Visual Studio에는 많은 수의 [클래스 라이브러리] 프로젝트 템플릿을 제공합니다. 하지만, C#에서는 [.NET Standard] 템플릿만을 사용하면 충분합니다. 이렇게 만들어진 닷넷 스탠다드 프로젝트의 결과물은 다른 닷넷 기반의 프로젝트에서 참조하여 사용할 수 있는 공통 라이브러리가 되는 것입니다.

참고: 클래스 다이어그램 사용하기

Visual Studio에는 클래스를 시각화해서 보여주는 클래스 다이어그램을 제공합니다.

클래스 다이어그램으로 클래스 시각화하기

Visual Studio Installer에서 처음 설치하거나 수정할 때 다음 그림과 같이 <개별 구성 요소> 탭에서 <클래스 디자이너> 항목을 선택해서 Visual Studio가 설치되면, C# 클래스에 대한 시각화 도구를 제공합니다.

그림: 클래스 디자이너 설치하기

클래스 디자이너 설치하기

Dul 프로젝트에 마우스 오른쪽 버튼 클릭 후 <새 항목 추가> 메뉴에서 "클래스 다이어그램"을 검색 후 DulClassDiagram.cd 이름으로 추가합니다.

그림: 클래스 다이어그램 추가

클래스 다이어그램 추가

우리가 앞서 생성한 Creator.cs와 같은 클래스 파일을 드래그해서 클래스 다이어그램 영역으로 드롭하면 자동으로 클래스에 대한 시각화된 그림을 얻을 수 있습니다.

그림: CS 파일을 드래그해서 클래스 시각화하기

클래스 파일을 드래그해서 클래스 시각화하기

클래스 다이어그램에서 직접 클래스와 멤버 구성하기

DotNet 솔루션에 ClassDiagramDemo 이름으로 콘솔 프로젝트를 생성 후 프로젝트에 마우스 오른쪽 버튼을 눌러 <새 항목 추가> 메뉴에서 <클래스 다이어그램>을 선택한 후 MyClassDiagram.cd 이름으로 생성합니다. 생성된 cd 파일에서 마우스 오른쪽 버튼을 눌러 <Add > Class>를 사용하여 직접 PersonStudent와 같은 클래스를 생성할 수 있습니다.

그림: 클래스 다이어그램에서 직접 클래스 추가하기

클래스 다이어그램에서 직접 클래스 추가하기

클래스 생성 창은 다음과 같습니다.

그림: 클래스 다이어그램을 통해서 클래스 파일 생성하기

클래스 다이어그램을 통해서 클래스 파일 생성하기

박용준 강사가 데모로 생성한 클래스는 다음과 같습니다.

그림: 클래스 다이어그램으로 클래스를 시각적으로 표현하기

클래스 다이어그램으로 클래스를 시각적으로 표현하기

자동으로 생성된 Person 클래스와 Student 클래스는 다음과 같습니다.

코드: Person.cs

namespace ClassDiagramDemo
{
    // 클래스
    public class Person
    {
        // 속성
        public string Name { get; set; }

        public int Age
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }

        // 메서드
        public bool Update() 
        {
            return false;
        }
    }
}

코드: Student.cs

namespace ClassDiagramDemo
{
    public class Student
    {
        public int Year
        {
            get
            {
                throw new System.NotImplementedException();
            }
            set
            {
            }
        }

        public void OrderTranscript(bool official)
        {
            throw new System.NotImplementedException();
        }
    }
}

이처럼, 클래스 다이어그램을 사용하면 내가 만든 라이브러리에 대한 시각화된 이미지를 얻을 수 있어 문서 작업 등에 도움이 됩니다.

클래스 다이어그램 또는 UML 그리기 도구들

  • starUML: 무료
  • Visual Paradigm Community Edition
  • draw.io: 공유 가능

장 요약

이번 장에서는 처음으로 나만의 라이브러리인 Dul.dll 파일을 생성해 보았습니다.
그리고 해당 라이브러리를 참조하여, 콘솔 애플리케이션에서 3개의 API를 테스트하는 방법을 실습했습니다.

다음 장에서는 우리가 만든 라이브러리가 제대로 동작하는지 검증하기 위해 테스트 프로젝트를 활용하는 방법을 알아보겠습니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com