다음을 통해 공유


연습: 개체 유지(C# 및 Visual Basic)

디자인 타임에 개체의 속성을 기본값으로 설정할 수 있지만 런타임에 입력된 값은 개체가 소멸되면 손실됩니다. serialization을 사용하여 인스턴스 간에 개체의 데이터를 유지할 수 있습니다. 이렇게 하면 값을 저장하고 다음에 해당 개체가 인스턴스화될 때 이 값을 검색할 수 있습니다.

참고

Visual Basic에서 이름이나 숫자와 같은 간단한 데이터를 저장하려면 My.Settings 개체를 사용합니다. 자세한 내용은 My.Settings 개체(Visual Basic)를 참조하십시오.

이 연습에서는 간단한 Loan 개체를 만들고 해당 개체의 데이터를 파일에 저장합니다. 그런 다음 개체를 다시 만들 때 파일에서 데이터를 검색합니다. 마지막으로, 코드를 수정하여 개체를 SOAP 형식으로 유지합니다.

보안 정보보안 정보

이 예제에서는 파일이 없는 경우 새 파일을 만듭니다. 응용 프로그램에서 파일을 만들어야 하는 경우 해당 응용 프로그램에는 폴더에 대해 Create 권한이 필요합니다. 사용 권한은 액세스 제어 목록을 사용하여 설정됩니다. 해당 파일이 이미 있으면 응용 프로그램에는 더 낮은 수준의 권한인 Write 권한만 있으면 됩니다. 가능하면 배포하는 동안 파일을 만들고 폴더에 대한 Create 권한 대신 파일 하나에 대한 Read 권한만 부여하는 것이 보안상 안전합니다. 또한 루트 폴더나 Program Files 폴더보다 사용자 폴더에 데이터를 쓰는 것이 안전합니다.

보안 정보보안 정보

이 예제는 데이터를 이진 또는 SOAP 형식의 파일에 저장합니다. 암호나 신용 카드 정보와 같은 중요한 데이터에 이러한 형식을 사용하면 안 됩니다.

참고

표시되는 대화 상자와 메뉴 명령은 활성 설정이나 버전에 따라 도움말에서 설명하는 것과 다를 수 있습니다. 설정을 변경하려면 도구 메뉴에서 설정 가져오기 및 내보내기를 클릭합니다. 자세한 내용은 Visual Studio 설정을 참조하십시오.

Loan 개체 만들기

첫 번째 단계는 Loan 클래스와 이 클래스를 사용하는 테스트 응용 프로그램을 만드는 것입니다.

Loan 클래스를 만들려면

  1. 새 클래스 라이브러리 프로젝트를 만들고 이름을 "LoanClass"로 지정합니다. 자세한 내용은 방법: 솔루션 및 프로젝트 만들기를 참조하십시오.

  2. 솔루션 탐색기에서 Class1 파일을 마우스 오른쪽 단추로 클릭한 다음 이름 바꾸기를 클릭합니다. 파일 이름을 Loan으로 바꾸고 Enter 키를 누릅니다. 파일의 이름을 바꾸면 클래스의 이름도 Loan로 바뀝니다.

  3. 클래스에 다음의 public 멤버를 추가합니다.

    Public Class Loan
        Implements System.ComponentModel.INotifyPropertyChanged
    
        Public Property LoanAmount As Double
        Public Property InterestRate As Double
        Public Property Term As Integer
    
        Private p_Customer As String
        Public Property Customer As String
            Get
                Return p_Customer
            End Get
            Set(ByVal value As String)
                p_Customer = value
                RaiseEvent PropertyChanged(Me,
                  New System.ComponentModel.PropertyChangedEventArgs("Customer"))
            End Set
        End Property
    
        Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _
          Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    
        Public Sub New(ByVal loanAmount As Double,
                       ByVal interestRate As Double,
                       ByVal term As Integer,
                       ByVal customer As String)
    
            Me.LoanAmount = loanAmount
            Me.InterestRate = interestRate
            Me.Term = term
            p_Customer = customer
        End Sub
    End Class
    
    public class Loan : System.ComponentModel.INotifyPropertyChanged
    {
        public double LoanAmount {get; set;}
        public double InterestRate {get; set;}
        public int Term {get; set;}
    
        private string p_Customer;
        public string Customer
        {
            get { return p_Customer; }
            set 
            {
                p_Customer = value;
                PropertyChanged(this,
                  new System.ComponentModel.PropertyChangedEventArgs("Customer"));
            }
        }
    
        public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    
        public Loan(double loanAmount,
                    double interestRate,
                    int term,
                    string customer)
        {
            this.LoanAmount = loanAmount;
            this.InterestRate = interestRate;
            this.Term = term;
            p_Customer = customer;
        }
    }
    

또한 Loan 클래스를 사용하는 간단한 응용 프로그램을 만들어야 합니다.

테스트 응용 프로그램을 만들려면

  1. Windows Forms 응용 프로그램 프로젝트를 솔루션에 추가하려면 파일 메뉴에서 추가를 가리키고 새 프로젝트를 클릭합니다.

  2. 새 프로젝트 추가 대화 상자에서 프로젝트의 이름으로 LoanApp를 입력하고 확인을 클릭하여 대화 상자를 닫습니다.

  3. 솔루션 탐색기에서 LoanApp 프로젝트를 선택합니다.

  4. 프로젝트 메뉴에서 시작 프로젝트로 설정을 클릭합니다.

  5. 프로젝트 메뉴에서 참조 추가를 클릭합니다.

  6. 참조 추가 대화 상자에서 프로젝트 탭을 클릭하고 LoanClass 프로젝트를 선택합니다.

  7. 확인을 클릭하여 대화 상자를 닫습니다.

  8. 디자이너에서 TextBox 컨트롤 네 개를 폼에 추가합니다.

  9. 코드 편집기에서 다음 코드를 추가합니다.

    Private WithEvents TestLoan As New LoanClass.Loan(10000.0, 0.075, 36, "Neil Black")
    
    Private Sub Form1_Load() Handles MyBase.Load
        TextBox1.Text = TestLoan.LoanAmount.ToString
        TextBox2.Text = TestLoan.InterestRate.ToString
        TextBox3.Text = TestLoan.Term.ToString
        TextBox4.Text = TestLoan.Customer
    End Sub
    
    private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black");
    
    private void Form1_Load(object sender, EventArgs e)
    {
        textBox1.Text = TestLoan.LoanAmount.ToString();
        textBox2.Text = TestLoan.InterestRate.ToString();
        textBox3.Text = TestLoan.Term.ToString();
        textBox4.Text = TestLoan.Customer;
    }
    
  10. 다음 코드를 사용하여 PropertyChanged 이벤트에 대한 이벤트 처리기를 폼에 추가합니다.

    Public Sub CustomerPropertyChanged(
          ByVal sender As Object,
          ByVal e As System.ComponentModel.PropertyChangedEventArgs
        ) Handles TestLoan.PropertyChanged
    
        MsgBox(e.PropertyName & " has been changed.")
    End Sub
    
    private void CustomerPropertyChanged(object sender, 
        System.ComponentModel.PropertyChangedEventArgs e)
    {
        MessageBox.Show(e.PropertyName + " has been changed.");
    }
    

이 시점에서 응용 프로그램을 빌드하고 실행할 수 있습니다. Loan 클래스의 기본값은 텍스트 상자에 표시됩니다. 이자율 값을 7.5에서 7.1로 변경한 다음 응용 프로그램을 닫고 다시 실행합니다. 이자율이 기본값인 7.5로 되돌려집니다.

실제 상황에서 이자율은 주기적으로 변경되지만 응용 프로그램이 실행될 때마다 반드시 변경되는 것은 아닙니다. 따라서 응용 프로그램이 실행될 때마다 사용자가 직접 이자율을 업데이트하는 것보다는 응용 프로그램의 인스턴스 간에서 최신 이자율을 유지하는 것이 더 좋은 방법입니다. 다음 단계에서는 Loan 클래스에 serialization을 추가하여 이러한 작업을 수행합니다.

개체를 유지하기 위해 Serialization 사용

Loan 클래스에 대한 값을 유지하려면 먼저 Serializable 특성을 사용하여 클래스를 표시를 해두어야 합니다.

클래스를 serializable로 표시하려면

  • 다음과 같이 Loan 클래스에 대한 클래스 선언을 변경합니다.

    <Serializable()>
    Public Class Loan
    
    [Serializable()]
    public class Loan : System.ComponentModel.INotifyPropertyChanged
    {
    

Serializable 특성은 컴파일러에게 클래스 안의 모든 요소가 파일로 보관될 수 있음을 알립니다. PropertyChanged 이벤트는 Windows Form 개체에 의해 처리되기 때문에 serialize할 수 없습니다. NonSerialized 특성을 사용하면 유지하지 않을 클래스 멤버를 표시해 둘 수 있습니다.

멤버가 serialize되지 않도록 만들려면

  • 다음과 같이 PropertyChanged 이벤트에 대한 선언을 변경합니다.

    <NonSerialized()>
    Event PropertyChanged As System.ComponentModel.PropertyChangedEventHandler _
      Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    
    [field: NonSerialized()]
    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
    

다음 단계는 LoanApp 응용 프로그램에 serialization 코드를 추가하는 것입니다. 클래스를 serialize하여 파일에 쓰려면 System.IOSystem.Xml.Serialization 네임스페이스를 사용합니다. 정규화된 이름을 입력하지 않으려면 필요한 클래스 라이브러리에 대한 참조를 추가합니다.

네임스페이스에 대한 참조를 추가하려면

  • 다음 문을 Form1 클래스의 맨 위에 추가합니다.

    Imports System.IO
    Imports System.Runtime.Serialization.Formatters.Binary
    
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    

    이 경우에 사용자는 이진 포맷터를 사용하여 개체를 이진 형식으로 저장합니다. 이 연습의 뒷 부분에서는 코드를 수정하여 개체를 SOAP 형식으로 저장합니다.

다음 단계는 개체가 만들어질 때 파일의 개체를 deserialize하는 코드를 추가하는 것입니다.

개체를 deserialize하려면

  1. serialize된 데이터의 파일 이름에 대한 클래스에 상수를 추가합니다.

    Const FileName As String = "..\..\SavedLoan.bin"
    
    const string FileName = @"..\..\SavedLoan.bin";
    
  2. 다음과 같이 Form1_Load 이벤트 프로시저의 코드를 수정합니다.

    Private WithEvents TestLoan As New LoanClass.Loan(10000.0, 0.075, 36, "Neil Black")
    
    Private Sub Form1_Load() Handles MyBase.Load
        If File.Exists(FileName) Then
            Dim TestFileStream As Stream = File.OpenRead(FileName)
            Dim deserializer As New BinaryFormatter
            TestLoan = CType(deserializer.Deserialize(TestFileStream), LoanClass.Loan)
            TestFileStream.Close()
        End If
    
        AddHandler TestLoan.PropertyChanged, AddressOf Me.CustomerPropertyChanged
    
        TextBox1.Text = TestLoan.LoanAmount.ToString
        TextBox2.Text = TestLoan.InterestRate.ToString
        TextBox3.Text = TestLoan.Term.ToString
        TextBox4.Text = TestLoan.Customer
    End Sub
    
    private LoanClass.Loan TestLoan = new LoanClass.Loan(10000.0, 0.075, 36, "Neil Black");
    
    private void Form1_Load(object sender, EventArgs e)
    {
        if (File.Exists(FileName))
        {
            Stream TestFileStream = File.OpenRead(FileName);
            BinaryFormatter deserializer = new BinaryFormatter();
            TestLoan = (LoanClass.Loan)deserializer.Deserialize(TestFileStream);
            TestFileStream.Close();
        }
    
        TestLoan.PropertyChanged += this.CustomerPropertyChanged;
    
        textBox1.Text = TestLoan.LoanAmount.ToString();
        textBox2.Text = TestLoan.InterestRate.ToString();
        textBox3.Text = TestLoan.Term.ToString();
        textBox4.Text = TestLoan.Customer;
    }
    

    먼저 파일이 존재하는지 확인해야 합니다. 파일이 존재하면 Stream 클래스를 만들어 이진 파일을 읽고 BinaryFormatter 클래스를 만들어 파일을 변환합니다. 스트림 형식을 Loan 개체 형식으로 변환할 수도 있습니다.

그 다음에는 텍스트 상자에 입력된 데이터를 Loan 클래스에 저장하는 코드를 추가한 다음 클래스를 파일로 serialize해야 합니다.

데이터를 저장하고 클래스를 serialize하려면

  • Form1_FormClosing 이벤트 프로시저에 다음 코드를 추가합니다.

    Private Sub Form1_FormClosing() Handles MyBase.FormClosing
        TestLoan.LoanAmount = CDbl(TextBox1.Text)
        TestLoan.InterestRate = CDbl(TextBox2.Text)
        TestLoan.Term = CInt(TextBox3.Text)
        TestLoan.Customer = TextBox4.Text
    
        Dim TestFileStream As Stream = File.Create(FileName)
        Dim serializer As New BinaryFormatter
        serializer.Serialize(TestFileStream, TestLoan)
        TestFileStream.Close()
    End Sub
    
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        TestLoan.LoanAmount = Convert.ToDouble(textBox1.Text);
        TestLoan.InterestRate = Convert.ToDouble(textBox2.Text);
        TestLoan.Term = Convert.ToInt32(textBox3.Text);
        TestLoan.Customer = textBox4.Text;
    
        Stream TestFileStream = File.Create(FileName);
        BinaryFormatter serializer = new BinaryFormatter();
        serializer.Serialize(TestFileStream, TestLoan);
        TestFileStream.Close();
    }
    

이 시점에서 응용 프로그램을 다시 빌드하고 실행할 수 있습니다. 처음에는 기본값이 텍스트 상자에 표시됩니다. 값을 변경하고 네 번째 텍스트 상자에 이름을 입력합니다. 응용 프로그램을 닫고 다시 실행합니다. 새 값이 텍스트 상자에 표시됩니다.

SOAP 형식을 사용하여 개체 유지

지금까지 이 예제에서는 이진 형식을 사용하여 개체를 텍스트 파일에 저장하는 방법을 보여 주었습니다. 대부분의 Windows 응용 프로그램에는 이진 형식을 사용하는 것이 좋습니다. 웹 응용 프로그램 또는 Web services의 경우에는 SOAP 형식을 사용하여 개체를 XML 파일에 저장합니다. 이렇게 하면 개체를 쉽게 공유할 수 있습니다.

개체를 SOAP 형식으로 유지하려면 먼저 SoapFormatter 클래스를 참조해야 합니다. SoapFormatter 클래스는 자체 네임스페이스인 System.Runtime.Serialization.Formatters.Soap에 있습니다.

SOAP 형식을 사용하여 개체를 유지하려면

  1. 솔루션 탐색기에서 LoanApp 프로젝트를 선택합니다.

  2. 프로젝트 메뉴에서 참조 추가를 클릭합니다.

  3. 참조 추가 대화 상자에서 .NET 탭을 클릭한 다음 System.Runtime.Serialization.Formatters.Soap 구성 요소를 선택합니다.

  4. 확인을 클릭하여 대화 상자를 닫습니다.

  5. 코드 편집기에서 Form1모듈의 맨 위에 다음 문을 추가합니다.

    Imports System.Runtime.Serialization.Formatters.Soap
    
    using System.Runtime.Serialization.Formatters.Soap;
    
  6. 파일 이름을 SavedLoan.bin에서 SavedLoan.xml로 변경합니다.

  7. Form1_Load 이벤트 프로시저에서 deserializer 변수의 선언을 다음으로 변경합니다.

    Dim deserializer As New SoapFormatter
    
    SoapFormatter deserializer = new SoapFormatter();
    
  8. Form1_FormClosing 이벤트 프로시저에서 serializer 변수의 선언을 다음으로 변경합니다.

    Dim serializer As New SoapFormatter
    
    SoapFormatter serializer = new SoapFormatter();
    

이 시점에서 응용 프로그램을 빌드하고 테스트할 수 있습니다. 응용 프로그램을 처음 실행하면 SavedLoan.xml 파일이 만들어집니다. 파일을 보려면 솔루션 탐색기모든 파일 표시 옵션을 선택합니다. 이 파일은 Windows 응용 프로그램 프로젝트의 Bin 노드에 있습니다.

참고

이미 모든 파일 표시 모드로 설정되어 있는 경우 파일을 보려면 보기 메뉴에서 새로 고침을 클릭하여 보기를 새로 고쳐야 합니다.

LoanClass의 세 멤버가 XML 형식으로 표시됩니다. XML 파일에서 InterestRate 값을 변경한 다음 이 값을 저장하고 응용 프로그램을 다시 실행합니다. 두 번째 텍스트 상자에 새 이자율이 표시됩니다.

참고 항목

개념

C# 프로그래밍 가이드

기타 리소스

Serialization(C# 및 Visual Basic)

Visual Basic 프로그래밍 가이드