■WPF(Windows Presentation Foundation)란?

WinForm의 부족한 기능 및 디자인 기능을 대처하기 위해서 등장한 디자인 특화 사용자 인터페이스이다.

 

■등장배경

2002년 WinForm이 등장하여 Windows 응용 프로그램 개발을 주도했다.

이후 비디오, 미디어, 애니메이션, 2D/3D 그래픽 등을 다이나믹하게 사용하고 싶은 요구가 생겨났다.

이러한 기술들은 독립, 분산되어 있었고 통합하여 개발하기 위해서는 각각의 기술을 모두 이해해야 했다.

통합된 기술에 대한 수요가 있었고, 이에 부응하여 WPF이 개발되었다.

 

■특징

- Windows API를 사용하는 WinForm과 달리, DirectX 기반으로 동작한다.

- 윈도우를 생성하는 네이티브 함수인 CreateWindow는 창에만 한정되고 나머지는 직접 그리기 때문에, 버튼의 각도를 변경하는 등 WinForm에서 기능상 한계로 불가능한 것이 가능해졌다.

- UI 구현에 XAML(eXtensible Application Markup Language)을 사용한다.

- WinForm과 달리 모던한 디자인 패턴을 적용할 수 있다.

- WinForm과 달리 디자이너와 분리된 상태의 협업이 가능하다.

 

■용어

XAML

- 선언적으로 UI를 구현하는데 사용되는 XML 기반 태그 언어이다.

- 창, 대화 상자, 페이지 및 사용자 정의 컨트롤을 만들고 이러한 항목을 컨트롤, 도형 및 그래픽으로 채우는 데 사용된다.

 

출처

ojc.asia/bbs/board.php?bo_table=WPF&wr_id=2

namu.wiki/w/C%23

 

C# - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

닷넷, C# WPF소개, 개요_WPF출현배경 및 간단한 예제_WPF학원/WPF교육/WPF강좌/XAML예문

닷넷, C# WPF소개, 개요_WPF출현배경 및 간단한 예제_WPF학원/WPF교육/WPF강좌1.1 WPF 소개? 2002년 정식으로 출시된 닷넷 프레임워크에서 윈폼 이라는 기술이 등장하여 윈도우 응용프로그램 개발을 주

ojc.asia

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

pdb 파일  (0) 2021.03.15
LINQ  (0) 2021.02.14
비동기처리1 - Thread, Task  (0) 2021.01.07
DLL이란?  (0) 2020.12.09

Program Database의 약자로 디버그와 프로젝트 상태 정보를 보유하고 있는 파일이다.

Visual Studio에서 프로젝트 작성 시, MyDocument에 있는 경우 PC의 유저명이 유출될 수 있다.

디버그 시에는 이 파일로 브레이크 포인트를 걸 수 있어 유효하지만, 릴리즈 시에는 필요가 없다.

 

Visual Studio의 프로젝트 프로퍼티의 빌드설정에서 디버그 정보인 pdb파일을 출력하지 않게 설정할 수 있다.

 

출처 : https://qiita.com/lainzero/items/27681ddc96638e33758b

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
LINQ  (0) 2021.02.14
비동기처리1 - Thread, Task  (0) 2021.01.07
DLL이란?  (0) 2020.12.09

■개요

LINQ(Language INtergrated Query : 통합 언어 쿼리)는 복수의 데이터에서 조건에 맞는 데이터를 간추린 데이터들을 얻을 수 있도록 해주는 C#의 문법으로, .Net Framework 3.5부터 도입되었다고 한다.

 

■샘플코드

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

namespace HelloWorldCore
{
    /// <summary>
    /// 학생 클래스
    /// </summary>
    class Student
    {
        public string name { get; set; }
        public int age { get; set; }
        public int grade { get; set; }
    }

    /// <summary>
    /// Linq 사용법
    /// </summary>
    class LinqPractice
    {
        private int studentNumber = 5;
        private string[] studentNames = { "홍길동", "황진이", "이순신", "장영실", "정약용" };
        private int[] studentAges = { 25, 26, 25, 30, 40 };
        private int[] studentGrades = { 4, 4, 4, 2, 1 };

        // 학생 리스트
        List<Student> students = new List<Student>();

        public LinqPractice()
        {
            CreateStudents();
        }
        private void CreateStudents()
        {
            // 학생 객체를 생성하여 학생 리스트에 추가한다.
            for (int i = 0; i < studentNumber; i++)
            {
                Student student = new Student();
                student.name = studentNames[i];
                student.age = studentAges[i];
                student.grade = studentGrades[i];

                students.Add(student);
            }
        }

        /// <summary>
        /// LINQ구문은 from ~ where ~ select 순서로 작성한다.
        /// LIST, DataSource, Database, Collection, Array등을 LINQ로 사용할 수 있다.
        /// from, where, order by, select, group by, join등의 구문을 사용할 수 있다.
        /// </summary>
        public void TestLinq()
        {
            // 20대 학생만을 조회하여 얻어오는 Linq구문
            var Twenty_Student = from _student in students
                                 where _student.age >= 20 && _student.age < 30
                                 orderby _student.age ascending
                                 select _student;

            // 30대 학생만을 조회하여 얻어오는 Linq구문
            var Thirty_Student = from _student in students
                                 where _student.age >= 30 && _student.age < 40
                                 orderby _student.age ascending
                                 select _student;

            foreach(var Student in Twenty_Student)
            {
                Console.WriteLine("20대 학생은 = {0} 입니다.", Student.name);
            }

            Console.WriteLine();

            foreach (var Student in Thirty_Student)
            {
                Console.WriteLine("30대 학생은 = {0} 입니다.", Student.name);
            }
        }
    }
}

 

 

■참조

afsdzvcx123.tistory.com/entry/C-LINQ-%EC%86%8C%EA%B0%9C-%EB%B0%8F-%EC%82%AC%EC%9A%A9%EB%B2%95

 

[C#] LINQ 소개 및 사용법

이번 포스팅에서는 C# 문법 중 하나인, LINQ에 대해 알아보도록 하겠습니다. LINQ란 Language-Intergreated Query의 약자?로써, .NET Framework 버전 3.5부터 도입이 되었습니다. 그냥 쉽게 간단히 얘기해 C#에서..

afsdzvcx123.tistory.com

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
비동기처리1 - Thread, Task  (0) 2021.01.07
DLL이란?  (0) 2020.12.09

■ 동기 처리란?

앞 처리의 결과가 반환돼야 다음 처리로 넘어가는 것

ex) 요리하기

 

■ 비동기 처리란?

앞 처리의 결과를 기다리지 않고 다음 처리로 넘어가는 것

ex) 요리하면서 욕실에 물 받기

 

■ 비동기 처리의 종류

Thread, Task, async, await

 

■ 옛 방식의 비동기 처리 「Thread」

아래는 메인 스레드에서는 HeavyMethod2를, 다른 별도의 스레드에서 HeavyMethod1를 비동기로 실행하는 소스이다.

Program
{
    static void Main(String[] args)
    {
    	Thread thread = new Thread(new ThreadStart(() =>
        {
        	HeavyMethod1();
        }));
        
        thread.Start();
        
        HeavyMethod2();
        
        Console.ReadLine();
    }
    
    static void HeavyMethod1()
    {
    	Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 종료");
    }
    
    static void HeavyMethod2()
    {
    	Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 종료");
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료

■ 비동기 처리 「Task」

Task는 Thread에서는 할 수 없는, 다음 세 가지를 실현할 수 있다.

- 비동기로 실시한 처리의 상태(실행중, 완료, 취소, 에러)를 알 수 있다.

- 예외를 보충(처리 할 수 있다는 말인가?)할 수 있다.

- 비동기 처리의 실행순서를 제어할 수 있다.

Program
{
    static void Main(string[] args)
    {
    	// Task를 생성한다.
        // Task.Run메소드는 Task를 생성하는 Factory 클래스로, Task형의 객체를 반환한다.
        // 인수에는 delegate를 전달한다.
        // 단순히 HeavyMethod1을 실행하고 싶은 경우, 인수가 없는 delegate를 전달한다.
        Task task = Task.Run(() => {
        	HeavyMethod1();
        });
        
        HeavyMethod2();
        
        Console.ReadLine();
    }
    
    static void HeavyMethod1()
    {
    	Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 종료");
    }
    
    static void HeavyMethod2()
    {
    	Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 종료");
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료

■ Thread와 Task 비교 ~1~ 「결과값을 취득하고 싶을 때」

・Thread의 경우

Program
{
    static void Main(string[] args)
    {
    	// 메인 스레드에서 접근할 수 있는 변수를 정의하고 이 곳에 결과를 저장한다.
        string result = "";
        
        Thread thread = new Thread(new ThreadStart(() =>
        {
            // 메인스레드와 다른 스레드로 HeavyMethod를 실행하여,
            // 결과(이러쿵저러쿵)을 result에 저장한다.
            result = HeavyMethod();
        }));
        
        // 스레드를 시작한다.
        thread.Start();
        
        // Join 메소드를 사용하면 스레드가 종료할 때까지 다음 처리를 실행하지 않는다.
        thread.Join();
        
        // 결과를 콘솔에 표시한다.
        Console.WriteLine(result);
        
        Console.ReadLine();
    }
    
    static string HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thrad.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
        
        return "이러쿵저러쿵";
    }
}

결과

매우 무거운 처리 시작
매우 무거운 처리 종료
이러쿵저러쿵

・Task의 경우

Program
{
    static void Main(string[] args)
    {
    	// 결과를 취득하는 경우 Task를 Generic 타입으로 정의하여 그 Generic에 반환값의 타입을 지정한다.
        Task<string> task = Task.Run(() =>
        {
            return HeavyMethod();
        });
        
        // 결과를 취득한다.
        // Result의 속성을 사용하면 Task에서 지정한 HeavyMethod가 종료할 때까지 대기하며,
        // 결과를 result 변수에 대입해준다.
        string result = task.Result;
        
        // 결과를 콘솔에 표시한다.
        Console.WriteLine(result);
        
        Console.ReadLine();
    }
    
    static string HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thrad.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
        
        return "이러쿵저러쿵";
    }
}

결과

매우 무거운 처리 시작
매우 무거운 처리 종료
이러쿵저러쿵

Task의 Result 속성을 사용하면, Thread에 비해 직관적이고 간단하게 결과값을 얻을 수 있다.

Result 속성의 사용으로 Thread에서 수행하던 다음 2가지 처리를 하지 않아도 된다.

- 메인스레드에 result 변수를 미리 정의하는 것

- 스레드가 종료할 때까지 Join 메소드로 대기하는 것

→ Task는 개발자가 스레드를 의식하지 않고 동기 처리같은 코드로 비동기 처리를 실현하게 해준다.

 

■ Thread와 Task 비교 ~2~ 「예외를 보충하고 싶을 때」

・Thread의 경우

 

Program
{
    static void Main(string[] args)
    {
    	try {
            Thread thread = new Thread(new ThreadStart(() =>
            {
            	throw new Exception("받아줘 >_<");
                HeavyMethod();
            }));
            
            thread.Start();
            
        } catch (Exception e) {
            Console.WriteLine("받아줘~ Catch!!")
        }
        
        Console.WriteLine("종료");
        
        Console.ReadLine();
    }
    
    static void HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
    }
}

결과

종료

스레드 안의 예외를 처리하지 않는다.

 

・Task의 경우

Program
{
    static void Main(string[] args)
    {
        Task task = Task.Factory.StartNew(() => {
            throw new Exception("받아줘 >_<");
            HeavyMethod();
        });
        
    	try {
            // 예외를 캐치하는 경우, Wait 메소드를 실시하는 부분을 try...catch로 감싼다.
            // 예외가 발생하면 AggregateException에 Wrap되어 Throw된다.
            task.Wait();
        } catch (Exception e) {
            Console.WriteLine("받아줘~ Catch!!")
        }
        
        Console.WriteLine("종료");
        
        Console.ReadLine();
    }
    
    static void HeavyMethod()
    {
    	Console.WriteLine("매우 무거운 처리 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리 종료");
    }
}

결과

받아줘~ Catch!!
종료

스레드 안에서 발생한 예외를 메인스레드가 제대로 캐치했다.

여기서도 마찬가지로 스레드를 의식하지 않고 동기적인 코드로 예외를 캐치했다.

 

■ Thread와 Task 비교 ~3~ 「다수 스레드의 종료를 기다리고 싶을 때」

케이스 : 정수 1을 반환하는 HeavyMethod1과 정수 2를 반환하는 HeavyMethod2를 병행 실행하여

그 결과를 더해서 콘솔에 3을 출력

・Task의 경우

Program
{
    static void Main(string[] args)
    {
        // 정수 1을 반환하는 HeavyMethod1의 Task를 생성한다.
        Task<int> task1 = Task.Run(() => {
            return HeavyMethod1();
        });
        
        // 정수 2를 반환하는 HeavyMethod2의 Task를 생성한다.
        Task<int> task2 = Task.Run(() => {
            return HeavyMethod2();
        });
        
        // WhenAll의 인수로 생성한 Task를 지정하면 HeavyMethod1, HeavyMethod2가 종료할 때까지
        // 다음 코드를 실행하지 않는다. 즉, 대기한다.
        Task.WhenAll(task1, task2);
        
        Console.WriteLine(task1.Result + task2.Result);
        
        Console.ReadLine();
    }
    
    static int HeavyMethod1()
    {
        Console.WriteLine("매우 무거운 처리1 시작");
        Thread.Sleep(5000);
        Console.WriteLine("매우 무거운 처리1 시작");
        
        return 1;
    }
    
    static int HeavyMethod2()
    {
        Console.WriteLine("매우 무거운 처리2 시작");
        Thread.Sleep(3000);
        Console.WriteLine("매우 무거운 처리2 시작");
        
        return 2;
    }
}

결과

매우 무거운 처리2 시작
매우 무거운 처리1 시작
매우 무거운 처리2 종료
매우 무거운 처리1 종료
3

■ 정리

Task를 사용하면 Thread로 하던 처리를 매우 심플하게 작성할 수 있다.

 

출처 : https://tech-lab.sios.jp/archives/15637 

 

多分わかりやすいC#の非同期処理その1 〜 ThreadとTask 〜 | SIOS Tech. Lab

こんにちは、サイオステクノロジー技術部 武井(Twitter:@noriyukitakei)です。今回は、C#を学び始めた人たちが一番始めに当たる関門であろう非同期処理ついて解説したいと思います。2回シリー

tech-lab.sios.jp

 

반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
LINQ  (0) 2021.02.14
DLL이란?  (0) 2020.12.09
정의
DDL(Dynamic Link Library)를 이해하기 위해서는, Library의 의미와 Static Link, Dynamic Link의 차이를 이해해야 한다.
 
Library란?
간단한 코드(함수, 데이터 타입)를 재사용 가능하도록 모듈화한 것이다.
 
Static Link와 Dynamic Link의 차이점
라이브러리를 언제 메인 프로그램에 연결하느냐에 따라 구분된다.
  • 정적 링크(Static Link)
    • 컴파일 시점에 라이브러리가 링크에 의해 연결되어 실행 파일의 일부분이 된다.

  • 동적 링크(Dynamic Link)
    • 실행 파일에서 해당 라이브러리의 기능을 사용 시에만 라이브러리를 참조(혹 다운로드)하여 기능을 호출한다.
    • 프로그램 실행 시 DLL도 함께 메모리 공간으로 읽어와 내부 함수처럼 호출한다.
    • 필요한 시점에 메모리로 읽어오고 불필요하면 메모리에서 내릴 수 있다.

 
DLL의 이점
  • 적은 리소스
    • 한 코드를 여러 프로그램에서 사용하기 때문에 메모리가 절약된다.
    • 사용되는 디스크 공간을 줄일 수 있다.(정적 링크는 실행 파일에 라이브러리의 함수가 모두 포함되어 실행 파일 크기가 커진다.)
    • 운영체제와 프로그램이 더 빠르게 로드 및 실행된다.
  • 모듈식 아키텍쳐
    • 실행 파일은 DLL에 있는 함수를 Import, DLL은 실행파일에게 함수를 Export하는 것과 다름 없다.
    • Export할 함수에 대한 정보가 DLL에 기록되어 있어야 한다.
  • 손쉬운 배포 및 설치
    • DLL 하나만 업데이트해도 모든 프로그램에 그 내용이 적용된다.
  • 프로그래머의 분업이 용이하고 뛰어난 재사용성을 보유
    • 코드의 양이 적어지므로 디버깅이 용이하다.
 
DLL 사용상의 유의점
  • 프로그램이 DLL을 사용할 때 종속성*이라는 문제로 프로그램이 실행되지 않을 수 있다.
  • DLL은 해로운 파일일 수도 있기 때문에 신뢰할 수 있는지 확인해야 한다.
  • DLL 파일을 함부로 이동시키면 프로그램이 정상적으로 작동하지 않을 수 있다.
 
* DLL 종속성이란?
프로그램 혹은 DLL이 다른 DLL의 함수를 사용하는 경우 종속성이 작성된다.
이런 경우 해당 프로그램은 더 이상 자체 포함 프로그램이 아니며, 종속성이 손상되면 프로그램에 문제가 발생할 수 있다.
아래 예의 경우를 DLL 충돌이라 하며, 호환성이 적용되지 않으면 프로그램이 정상적으로 실행되지 않을 수 있다.
ex1) 종속 DLL을 새 버전으로 업그레이드하는 경우
ex2) 종속 DLL을 수정하는 경우
ex3) 종속 DLL을 이전 버전으로 덮어쓰는 경우
ex4) 종속 DLL을 제거하는 경우
 
출처 :
반응형

'■ 프로그래밍 언어 > C#' 카테고리의 다른 글

WPF  (0) 2021.03.17
pdb 파일  (0) 2021.03.15
LINQ  (0) 2021.02.14
비동기처리1 - Thread, Task  (0) 2021.01.07

+ Recent posts