c#/windows.pre.foundation/원리금균등상환.금리비교시.대출상환포함
c#/windows.pre.foundation/원리금균등상환.금리비교시.대출상환포함

Install Win.Form)



FiancialNM.msi
2.05MB


Install Win.Pre.Foundation)

FiancialCalc.msi
1.38MB



0. 메모장에서 코딩후 빌드 & 런

1. Win Form과 Win Presentaion Foundation과의 비교화면)

 

 


2. 대출상환정보가 없을경우)

3. 대출상환정보가 있을경우)

 

4. 대출상환정보가 있을경우>데이타선택시에, 해당월 일별 데이타 리스트출력

( ChatGPT )c# List 와 배열의 차이점

C#에서 List와 배열(Array)의 주요 차이점은 다음과 같습니다:

  1. 크기 조절 가능 여부:
    • 배열(Array): 배열은 선언된 크기를 초과하거나 축소할 수 없습니다. 한 번 생성되면 크기가 고정됩니다.
    • List: List는 동적으로 크기가 조절될 수 있습니다. 요소를 추가하거나 제거할 때 List 내부에서 자동으로 크기가 조절됩니다.
  2. 메서드와 기능:
    • 배열(Array): 배열은 .NET Framework에서 제공하는 여러 메서드와 기능이 있지만, 크기 조절이나 요소 추가/삭제에 제한이 있습니다. 예를 들어, Array 클래스는 Length 속성을 통해 배열의 길이를 확인할 수 있습니다.
    • List: List는 배열보다 다양한 메서드와 기능을 제공합니다. 예를 들어, 요소 추가/삭제를 위한 Add, Remove, Insert 메서드 등이 있습니다. 또한 LINQ 쿼리와 함께 사용할 수 있는 다양한 확장 메서드를 사용할 수 있습니다.
  3. 선언 및 초기화:
    • 배열(Array): 배열은 고정된 크기를 선언하고 초기화해야 합니다. 예를 들어, int[] numbers = new int[5];와 같이 선언하고 초기화합니다.
    • List: List는 크기를 선언하지 않고 생성할 수 있으며, 초기 요소를 포함할 수도 있습니다. 예를 들어, List<int> numbers = new List<int>();로 선언하고 초기화합니다.
  4. 타입 안정성:
    • 배열(Array): 배열은 특정 데이터 형식으로 타입 안전성을 보장합니다. 즉, 선언된 데이터 형식 이외의 데이터를 저장할 수 없습니다.
    • List: List는 제네릭 형식으로 제공되며, 특정 데이터 형식에 대한 타입 안정성을 보장합니다.

이러한 차이점으로 인해 상황에 따라 배열이나 List 중 하나를 선택하여 사용할 수 있습니다. 배열은 크기가 고정된 정적 데이터에 적합하고, List는 동적인 데이터 구조에 적합합니다.

ChatGPT)
C#에서 public string SpecificPay { get; set; }와 public string SpecificPay;의 차이는 다음과 같습니다:

1. public string SpecificPay { get; set; }

public string SpecificPay { get; set; }: 이것은 C#의 속성(Property)입니다. 속성은 클래스의 멤버로, 해당 속성에 대한 값을 캡슐화하고, 접근을 제어하며, 필요한 경우 추가 로직을 적용할 수 있습니다. 이 특정 속성은 읽기 및 쓰기가 가능합니다(getter와 setter 모두가 존재함).

2. public string SpecificPay;

public string SpecificPay;: 이것은 클래스의 필드(Field)입니다. 필드는 해당 클래스의 인스턴스마다 각각의 값을 저장합니다. 이것은 간단한 데이터 저장 용도로 사용되며, 특별한 접근 로직이나 제한이 없습니다. 직접적으로 필드에 접근하여 값을 설정하거나 가져올 수 있습니다.


따라서, 첫 번째 선언은 읽기 및 쓰기가 가능한 속성을 정의하고, 두 번째 선언은 클래스의 필드를 정의합니다.

결과화면)


(CHAT.GPT)
WPF에서 메인 윈도우에서 클래스를 호출하고, 해당 클래스에서 다이얼로그를 메인 윈도우의 가운데에 위치하도록 호출하려면, 다음과 같은 절차를 따르면 됩니다.

  1. 메인 윈도우에서 클래스 호출
  2. 클래스에서 다이얼로그 호출 시 메인 윈도우를 기준으로 위치 설정



1. MainWindow.xaml.cs

메인 윈도우에서 클래스를 호출하는 버튼 클릭 이벤트를 설정합니다.

using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OpenDialogFromClassButton_Click(object sender, RoutedEventArgs e)
        {
            DialogHelper helper = new DialogHelper();
            helper.ShowDialog(this);
        }
    }
}

2. DialogHelper.cs

다이얼로그를 표시할 클래스입니다.

using System.Windows;

namespace WpfApp
{
    public class DialogHelper
    {
        public void ShowDialog(Window owner)
        {
            DialogWindow dialog = new DialogWindow
            {
                Owner = owner,
                WindowStartupLocation = WindowStartupLocation.CenterOwner
            };
            dialog.ShowDialog();
        }
    }
}

3. DialogWindow.xaml

다이얼로그 윈도우의 XAML 파일입니다.

<Window x:Class="WpfApp.DialogWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DialogWindow"
        Height="200"
        Width="400">
    <Grid>
        <!-- 다이얼로그의 UI 요소들 -->
    </Grid>
</Window>

4. DialogWindow.xaml.cs

다이얼로그 윈도우의 코드 비하인드 파일입니다.

using System.Windows;

namespace WpfApp
{
    public partial class DialogWindow : Window
    {
        public DialogWindow()
        {
            InitializeComponent();
        }
    }
}

5. MainWindow.xaml

메인 윈도우의 XAML 파일에서 클래스를 호출하여 다이얼로그를 여는 버튼을 추가합니다.

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="450"
        Width="800">
    <Grid>
        <Button Content="Open Dialog from Class" Click="OpenDialogFromClassButton_Click" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</Window>

요약

이 구조에서는 DialogHelper 클래스가 메인 윈도우의 인스턴스를 인자로 받아 다이얼로그를 중앙에 위치하도록 설정합니다. 이렇게 하면 다이얼로그 윈도우가 항상 메인 윈도우의 중앙에 표시됩니다.






1. 기존 Windows Form방식)
- 기존 Form방식에서 사용되어진 Form 화면디자인을 WPF방식에는 이용할수 없다는점이 아쉽다.
- Form과 WPF를 동시에 코딩을 원한다면, 화면과 로직을 분리하는 설계를 잘해야한다.
- 즉 Form Class에 로직코드에 해당되는 부분은 클래스파일을 따로 만들어서 작성하도록 한다.

2. Windows.Presentation.Foundation(WPF) 방식
- 디자인파트
- 코드파트로 나눌수 있다는점에서 웹프로그래밍과 일맥상통하다.(xaml/cs)

FiancialCalc.msi
0.71MB


<Window x:Class="WINPAYCalcM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WINPAYCalcM"
        mc:Ignorable="d"
        Title="원리금균등상환계산기(대출상환포함)" Height="1000" Width="1400"
KeyDown="Window_KeyDown">
    <Window.Resources>
        <Style TargetType="DataGrid">
            <Setter Property="ColumnHeaderHeight" Value="40"/>
            <Setter Property="RowHeight" Value="30"/>
            <Setter Property="FontSize" Value="14"/>
            <Setter Property="HorizontalGridLinesBrush" Value="LightGray"/>
            <Setter Property="VerticalGridLinesBrush" Value="LightGray"/>
            <Setter Property="AlternatingRowBackground" Value="LightCyan"/>
            <Setter Property="Background" Value="White"/>
        </Style>
        <Style TargetType="DataGridColumnHeader">
            <Setter Property="Background" Value="SlateGray"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
        </Style>
        <Style TargetType="DataGridRow">
            <EventSetter Event="MouseEnter" Handler="DataGridRow_MouseEnter"/>
            <EventSetter Event="MouseLeave" Handler="DataGridRow_MouseLeave"/>
            <Setter Property="Background" Value="White"/>
        </Style>
    </Window.Resources>
    <DockPanel>
        <Menu DockPanel.Dock="Top">
            <MenuItem Header="_Information">
                <MenuItem Header="기초정보입력" Click="BasicInfoMenuItem_Click"/>
                <MenuItem Header="상환정보입력(자동)" Click="RepayMenuItem_Click"/>
                <MenuItem Header="상환정보입력(수동)" Click="RepayManualMenuItem_Click"/>
                <Separator/>
                <MenuItem Header="_Exit" Click="ExitMenuItem_Click"/>
            </MenuItem>
            <MenuItem Header="_File">
                <MenuItem Header="_Save" Click="SaveFileMenuItem_Click"/>
                <MenuItem Header="_Open" Click="OpenFileMenuItem_Click"/>
            </MenuItem>
            <MenuItem Header="_Help">
                <MenuItem Header="_About" Click="AboutMenuItem_Click"/>
            </MenuItem>
        </Menu>
        <!-- 다른 컨텐츠 -->
        <Grid>
            <DataGrid x:Name="dataGrid" AutoGenerateColumns="False" IsReadOnly="False" CanUserAddRows="True"
                  CanUserDeleteRows="True" CanUserResizeColumns="True" CanUserSortColumns="True" Margin="10">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="번호" Binding="{Binding index}" Width="*"/>
                    <DataGridTextColumn Header="상환방법" Binding="{Binding repaymethod}" Width="*"/>
                    <DataGridTextColumn Header="날짜" Binding="{Binding date}" Width="*"/>
                    <DataGridTextColumn Header="이자금액" Binding="{Binding rate_real_to_bank}" Width="*"/>
                    <DataGridTextColumn Header="원금금액" Binding="{Binding reapy_real_to_bank}" Width="*"/>
                    <DataGridTextColumn Header="이자상환합계" Binding="{Binding rate_real_to_bank_sum}" Width="*"/>
                    <DataGridTextColumn Header="현재원금" Binding="{Binding remain_original_pay}" Width="*"/>
    <DataGridTextColumn Header="원리금균등상환금액(일정)" Binding="{Binding original_rent_pay}" Width="*"/>
                    <DataGridTextColumn Header="이자+원금합계" Binding="{Binding calc_pricipal_plus_interest_sum}" Width="*"/>
                    <DataGridTextColumn Header="상환금액합계(원금+매달일정상환)" Binding="{Binding remain_repay_except_interest_sum}" Width="*"/>
                </DataGrid.Columns>

            </DataGrid>
        </Grid>
    </DockPanel>
</Window>


//11.txt
//{"param":{"loginid":"admin","pwd":"admin123"},"proto":"r","sender":"/cli/admin/10.1.181.79/25216","id":"login_client.0000919860.001","ts":"1713428639","method":"login_client"}

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

class Program
{
    public static void Main(string[] args)
    {
        if (args.Length == 1)
        {
            CHKNM nmm = new CHKNM();
            nmm.RUN(args[0]);
        }
        else
        {
            CHKNM nmm = new CHKNM();
            nmm.RUN();
        }
    }
}
class CHKNM
{
    public void RUN(string fileText)
    {
        string lines = File.ReadAllText(fileText);

        Console.WriteLine(lines);

        byte[] bytes = Encoding.UTF8.GetBytes(lines);
        PrintByteArray(bytes);
    }
    public void RUN()
    {
        byte[] buffer = new byte[] { 123, 34, 112, 97, 114, 97, 109, 34, 58, 123, 34, 108, 111, 103, 105, 110, 105, 100, 34, 58, 34, 97, 100, 109, 105, 110, 34, 44, 34, 112, 119, 100, 34, 58, 34, 97, 100, 109, 105, 110, 49, 50, 51, 34, 125, 44, 34, 112, 114, 111, 116, 111, 34, 58, 34, 114, 34, 44, 34, 115, 101, 110, 100, 101, 114, 34, 58, 34, 47, 99, 108, 105, 47, 97, 100, 109, 105, 110, 47, 49, 48, 46, 49, 46, 49, 56, 49, 46, 55, 57, 47, 50, 53, 50, 49, 54, 34, 44, 34, 105, 100, 34, 58, 34, 108, 111, 103, 105, 110, 95, 99, 108, 105, 101, 110, 116, 46, 48, 48, 48, 48, 57, 49, 57, 56, 54, 48, 46, 48, 48, 49, 34, 44, 34, 116, 115, 34, 58, 34, 49, 55, 49, 51, 52, 50, 56, 54, 51, 57, 34, 44, 34, 109, 101, 116, 104, 111, 100, 34, 58, 34, 108, 111, 103, 105, 110, 95, 99, 108, 105, 101, 110, 116, 34, 125, 13, 10, };
        string strText = Encoding.Default.GetString(buffer);

        Console.WriteLine(strText);
    }
    public void PrintByteArray(byte[] bytes)
    {
        var sb = new StringBuilder("new byte[] { ");
        foreach (var b in bytes)
        {
            sb.Append(b + ", ");
        }
        sb.Append("}");
        Console.WriteLine(sb.ToString());
    }
}





플랫버퍼에서 데이터를 읽고 쓰는 방법은 다음과 같습니다.

1.데이터 구조 정의: 먼저 플랫버퍼에서 사용할 데이터 구조를 정의해야 합니다. 이를 위해 플랫버퍼에서 제공하는 FlatBufferBuilder 클래스를 사용합니다. FlatBufferBuilder 클래스는 데이터 구조를 생성하고, 데이터를 추가하며, 최종적으로 직렬화된 데이터를 생성하는 데 사용됩니다.

2.데이터 추가: FlatBufferBuilder 클래스를 사용하여 데이터 구조에 데이터를 추가합니다. 데이터를 추가할 때는 FlatBufferBuilder 클래스의 메소드를 사용합니다. 예를 들어, int 타입의 데이터를 추가하려면 FlatBufferBuilder.addInt 메소드를 사용합니다.

3.데이터 직렬화: 데이터 추가가 완료되면, FlatBufferBuilder 클래스의 Finish 메소드를 사용하여 데이터를 직렬화합니다. Finish 메소드는 직렬화된 데이터를 반환합니다.

4.데이터 읽기: 직렬화된 데이터를 읽으려면, FlatBufferBuilder 클래스에서 제공하는 GetRootAs 메소드를 사용합니다. 이 메소드는 직렬화된 데이터에서 원하는 데이터 구조를 추출하는 데 사용됩니다. 추출된 데이터 구조는 해당 언어에서 제공하는 방식으로 사용할 수 있습니다.

5.데이터 수정: 추출된 데이터 구조를 수정하려면, 해당 언어에서 제공하는 방식으로 데이터를 수정합니다. 수정된 데이터를 다시 직렬화하려면, FlatBufferBuilder 클래스를 사용하여 데이터를 추가하고, Finish 메소드를 사용하여 데이터를 직렬화합니다.

다음은 C++에서 플랫버퍼를 사용하여 데이터를 읽고 쓰는 예제입니다.

#include "flatbuffers/flatbuffers.h"

struct Person {
    int id;
    std::string name;
    int age;
};

int main() {
    // 데이터 구조 정의
    FlatBufferBuilder builder;

    // 데이터 추가
    auto nameOffset = builder.CreateString("John");
    auto person = CreatePerson(builder, 1, nameOffset, 30);

    // 데이터 직렬화
    FinishPersonBuffer(builder, person);

    // 데이터 읽기
    auto buffer = builder.GetBufferPointer();
    auto person_ = GetPerson(buffer);

    // 데이터 출력
    std::cout << "ID: " << person_->id() << std::endl;
    std::cout << "Name: " << person_->name()->c_str() << std::endl;
    std::cout << "Age: " << person_->age() << std::endl;

    return 0;
}

SBE (Simple Binary Encoding)는 성능에 민감한 애플리케이션을 위한 경량의 고성능 바이너리 데이터 인코딩 및 직렬화 형식입니다. SBE는 금융 서비스, IoT, 산업 자동화, 네트워크 모니터링 등 다양한 산업 분야에서 사용됩니다.

다음은 SBE의 주요 특징입니다:

1.고성능: SBE는 경량의 바이너리 형식을 사용하여 데이터를 인코딩하고 직렬화하므로, 데이터 전송 및 처리 속도가 빠릅니다.

2.유연성: SBE는 사용자가 데이터 구조를 정의하고, 필드의 길이, 데이터 타입, 값의 범위 등을 지정할 수 있습니다. 이를 통해 사용자는 자신의 요구사항에 맞게 데이터를 인코딩할 수 있습니다.

3.다양한 언어 지원: SBE는 C++, Java, .NET, Python, JavaScript 등 다양한 언어를 지원합니다. 이를 통해 여러 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

4.안전성: SBE는 데이터 무결성을 보장하기 위해 체크섬을 사용합니다. 또한, 데이터가 손상되는 것을 방지하기 위해 오류 검사를 수행합니다.

5.확장성: SBE는 대규모 데이터 처리를 위한 확장성이 높습니다. 이를 통해 대량의 데이터를 빠르고 안정적으로 처리할 수 있습니다.

6.표준화: SBE는 금융 서비스 산업에서 널리 사용되는 FIX (Financial Information eXchange) 프로토콜을 기반으로 개발되었습니다. 이를 통해 SBE는 금융 서비스 분야에서 표준화된 데이터 인코딩 형식으로 자리 잡았습니다.

SBE는 금융 서비스 분야에서 널리 사용되고 있으며, 다른 산업 분야에서도 점차 도입되고 있습니다. SBE를 사용하면 데이터 전송 및 처리 속도를 향상시키고, 데이터 무결성을 보장하며, 다양한 언어로 작성된 애플리케이션 간에 데이터를 쉽게 교환할 수 있습니다.

+ Recent posts