xx
윈도우 운영체제 윈도우 응용 프로그램 Win32 API Device Driver
메인보드 CPU 코어 멀티 CPU 멀티 코어
CPU 운영체제 스케줄러 프로세스 A 프로세스 B 프로세스 C 프로세스 D
A.EXE 불가능 B.EXE C.DLL E.DLL D.DLL F.DLL EXE로부터 사용되는 DLL DLL로부터 사용되는 DLL
컴파일러 링커 A.exe 소스코드 파일 A A.obj 소스코드 파일 B B.obj 소스코드 파일 C C.obj 소스코드 파일 D D.obj 컴파일 링크
공통 파일 포맷 공통 중간 언어 윈도우용 VM 컴파일러 개발자 소스코드 void Main() { } 리눅스용 VM
EXE 파일 C# 소스 코드 빌드 중간 언어 (IL Code) CLR 로더 실행 컴파일러에 의해 삽입된 CLR 로더 코드가 실행되고, CLR 로드 후, 사용자의 중간 언어 코드를 실행
CTS CLS C# VB.NET
어셈블리 모듈 C 매니페스트 모듈 A 모듈 B 메타데이터
Common Language Infrastructure csc.exe 컴파일러 vbc.exe 컴파일러 fsc.exe 컴파일러 C# 소스코드 VB.NET 소스코드 F# 소스코드 Common Language Infrastructure Common Intermediate Language Common Language Runtime (Windows) 1000 0011 1111 1000 닷넷 언어는 각 소스코드를 컴파일해 플랫폼 독립적인 공통 중간 언어(CIL)로 변환 CIL 결과물을 각 플랫폼에 구현된 CLI 구현체가 번역해 실행 Mono (Linux) 1111 1000 0000 0001
Common Language Runtime Windows Win32 API COM+ Console 응용 프로그램 ASP.NET 웹 응용 프로그램 Windows 응용 프로그램 IIS Base Class Library Common Language Runtime VB.NET, C#, C++/CLI, F#, ……
System.Web System.Windows.Forms System.Drawing System.Data System.XML Globalization Diagnostics Configuration Collections Resources Reflection Net IO CodeDom Media Service Process Security Runtime Serialization Remoting Interop Services System.Data ODBC OLEDB SQL Types SQL System.XML XPath XSLT System.Web Caching Session State Services Protocols Discovery Description UI Web Controls HTML Controls System.Drawing System.Windows.Forms Imaging Drawing2D Text Printing Message Box Form List Control Button
Common Infrastructure Compilers .NET Framework Base Class Library WPF Windows Forms .NET Core Languages Runtime components ASP.NET Core Library UWP ASP.NET Core 기반 라이브러리 앱 유형
Common Infrastructure Compilers .NET Framework 비-표준 라이브러리 WPF Windows Forms .NET Core Languages Runtime components ASP.NET UWP ASP.NET Core 앱 유형 .NET Standard Library 기반 라이브러리
int n = 5; 4바이트 할당 5 메모리 저장소 이름 int n = 5; 5 10 메모리 n = 10; (변수의 값 변경)
int n = 5; 4바이트 할당 5 메모리 저장소 이름 스택 영역 int product = 500; 4바이트 할당 500 메모리
0x2000 string text = “Hello”; 스택 저장소 이름 스택 영역 힙 영역 0x0000 메모리 Hello
0x0000 string text; 메모리 null 0x2000 스택 저장소 이름 스택 영역
0x2000 int n1; string txt1; 5 0x1600 int n2; 스택 영역 C# 힙 영역 0x1200 메모리 0x0400 0x2000 int n1; 5 string txt2; int n2; 스택 영역 힙 영역 0x1600 0x1200
0x0000 Book book1; 메모리 #1 0x2000 0x0400 Book book2; 다른 참조 값 0x4000 스택 9788998139018 메모리 #1 0x1600 0x2000 0x0400 Book book2; 다른 참조 값 0x4000 스택 힙 메모리 #2
int [] products = new int[10]; 메모리 4바이트로 10개의 공간을 할당 0x0030 0x0000 0x2000 [9] [8] [7] [6] [5] [4] [3] [2] [1] [0] 힙 스택
int [] arr = new int[10]; int [,] arr = new int[3,10];
int [10] int [9] int [8] int [3] int [5] arr[0][8] arr[0][7] arr[0][6]
int i = 2; while (true) { int j = 1; Console.WriteLine(i + " * " + j + " = " + (i * j)); if (++j > 9) break; } if (++i > 9)
N = 1,Sum = 0 거짓 N = N + 1 Print Sum 참 Sum = Sum + N N < 1,000 3 또는 5의 배수 Sum = Sum + N 참 Print Sum
허클베리 핀의 모험 걸리버 여행기 이상한 나라의 앨리스
short var; 타입의 실체화된 객체 타입
Book 타입의 속성값을 담을 수 있는 메모리 할당 0x0000 Book gulliver = new Book(); Book 타입의 속성값을 담을 수 있는 메모리 할당 메모리 0x1400 0x2000
int result = m.f( 5 ); public int f(int x) { return x * x; }
Notebook Computer Desktop Netbook object DeviceManager
- bool - sbyte, byte - short, ushort - int, uint - long, ulong float, double decimal char System.ValueType class로 정의하는 타입들… object string enum, struct로 정의하는 타입들… 값 형식 참조 형식 System.Array 코드에 정의된 모든 배열
Circle o = new Circle(); double piValue = o.Pi; o.Pi = 3.14159; public double Pi { get { return pi; } set { pi = value; } }
정수 short -32,768 ~ +32,767 int -2,147,483,648 ~ +2,147,483,647
암시적 형변환 명시적 형변환 Computer Notebook 속성 행위 powerOn Boot Shutdown Reset 속성 fingerScan HasFingerScanDevice CloseLid
string text = “Hello”; … H 메모리 0x1400 0x2000 0x0000
0x0000 홍길동 메모리 _name: 0x1400 0x2000 0x0800 홍길순 2 0x1400 CountOfInstance Person 타입 person1 인스턴스 person2 인스턴스 _name: 0x0800
class Target { public void Do(Source obj) Console.WriteLine(obj.GetResult()); } class Source public int GetResult() return 10; public void Test() Target target = new Target(); target.Do(this); ① ②
int Clean (object arg); int FuncDelegate (object arg); delegate int FuncDelegate (object arg); 대상 메서드의 반환값과 인자를 분리하고, 식별자만 바꾼다. 그 상태에서 delegate 예약어를 추가한다.
0x0000 Point pt1; 6 12 메모리 0x2000 0x0400 Vector v1; 5 10 Point pt2 = pt1; Vector v2 = v1; 0x1200 0x1600 스택 힙
Vector v1; 5 10 메모리 0x0000 0x2000 Change(ref Vector vt) 0x1600 스택
0x0000 Point pt1; 5 10 메모리 0x2000 Change(ref Point pt) 0x0400 스택 힙
0x2000 Point pt1; 스택 6 12 힙 Change1(Point pt) 메모리 0x2000 Change1(Point pt) null 6 12 pt = new Point(); pt.X = 6; pt.Y = 12; 0x400 스택 힙
0x0000 Point pt1 = null; 메모리 0x2000 Change2(ref Point pt) Point pt1; 7 14 0x0400 pt = new Point(); pt.X = 7; pt.Y = 14; 스택 힙
System.IndexOutOfRangeException System.SystemException System.NullReferenceException …그 밖에 CLR을 통해 발생하는 모든 예외… System.Exception System.ApplicationException …응용 프로그램 개발자가 정의하는 예외…
5 6 void Main(string [] args) { int result = Sum(5, 6); 0xFFFFFFFF … } 메모리 0xFFFFFFFF 5 Main을 실행하는 스레드에 할당된 스택 6 int Sum( int v1, int v2 ) { int v3 = v1 + v2; return v3; Sum 메서드 호출 후 실행될 주소
5 6 0xFFFFFFFF Main을 실행하는 스레드에 할당된 스택 0x00000000 메모리 v3 용 4바이트 Sum 메서드 호출 후 실행될 주소 v3 용 4바이트
0세대 위치 a 0세대
a b c d e f g 0세대 a b c f g 0세대 1세대
a b c f g h i j k 0세대 1세대 a b c f g h i 0세대 1세대 2세대
a b c 0세대 1세대 2세대 20MB 40MB 40MB(Free) Free 40MB 20MB 40MB
… i 관리 힙 종료 큐 … i 관리 힙 종료 큐 Freachable 큐
… i 관리 힙 종료 큐 Freachable 큐
string txt = “Hello {0}: {1}”; string output = string.Format(txt, “World”, “Anderson”); string txt = “{0,-10} * {1} == {2,10}”; string output = string.Format(txt, 5, 6, 5 * 6); 5 * 6 == 10 10개의 공백 - 좌측정렬 10개의 공백 - 우측정렬
0x0000 string txt; 메모리 #1 0x2000 0x0400 string lwrText; 0x4000 스택 힙 hello world 메모리 #1 0x1600 0x2000 0x0400 string lwrText; Hello World 0x4000 스택 힙 메모리 #2
검색시간 컬렉션 크기 O(N) O(1)
1 Push 1 Push 5 5 Push 3 3 Pop Push 7 7
1 5 3 7 Enqueue 1 Enqueue 5 Enqueue 3 Dequeue Enqueue 7 Dequeue (empty)
“Hello World” 직렬화 byte [ ] 역직렬화 0x48 0x65 0x6c 0x6f 0x20 0x57 0x72
MemoryStream 의 내부 byte 배열 Position = 0 0x7D 0x00 Position = 2 0x7D 0x00 0x4C 0x36 0x19 Position = 6 0x7D 0x00 0x4C 0x36 0x19 Position = 0
0x7D 0x00 0x4C 0x36 0x19 Position = 6 Position = 2 2 바이트 읽음 4 바이트 읽음
스레드 1 실행 스레드 2 실행 CPU 스레드 1 스레드 2 운영체제 이전에 보관해 둔 CPU의 실행 정보를 복원 int func() { int a = 5; int b = 6; int sum = a + b; return sum; } void procedure() Console.WriteLine(“test”); Console.WriteLine(“is”);
Thread t = new Thread(threadFunc); t 스레드 주 스레드 Main 메서드 진입 Thread t = new Thread(threadFunc); t 스레드 t.Start(); 더 이상 실행될 명령어가 없으므로 스레드 종료 스레드 실행 Console.WriteLine(“......”); threadFunc 메서드 진입
Thread t = new Thread(threadFunc); t 스레드 주 스레드 Main 메서드 진입 Thread t = new Thread(threadFunc); t 스레드 t.Start(); 스레드 종료 스레드 실행 Console.WriteLine(“......”); Thread.Sleep(1000 * 60); threadFunc 메서드 진입 t.Join(); 스레드 대기 스레드 종료 알림 스레드 재개
CPU 1번 CPU 2번 CPU 3번 CPU 4번 스레드 A 실행 스레드 B 실행 스레드 C 실행 D 실행 E 실행 F 실행 G 실행 CPU 4번 H 실행 I 실행 J 실행 A 실행
Non-Signal Signal Set Reset
Read 스레드 디스크 스레드 대기 디스크 I/O 다음 코드 실행
BeginRead 스레드 디스크 디스크 I/O 다음 코드 실행 스레드 풀 스레드 readCompleted 실행
스레드 디스크 I/O 디스크 스레드 풀 스레드 스레드 대기 총 스레드 사용 시간 QueueUserWorkItem 다음 코드 실행 스레드 디스크 I/O 디스크 스레드 풀 스레드 스레드 대기 총 스레드 사용 시간
스레드 WaitOne 대기 스레드 스레드 풀 Cumsum 다음 코드 실행 calc (Cumsum) BeginInvoke
BeginInvoke 스레드 스레드 풀 calcCompleted 다음 코드 실행 Cumsum
013-1200-3001 013-1200-3000 홍길동: 013-1200-3000 홍길순: 013-1200-3001 전화번호부 1 2 3 홍길순 홍길동
202.131.30.11 10.10.10.200 전화번호부 1 2 3 네이버 서버 사용자 PC 네트워크 어댑터 DNS 서버 www.sysnet.pe.kr: 168.63.135.152 www.naver.com: 202.131.30.11 전화번호부 1 2 3 네이버 서버 사용자 PC 네트워크 어댑터 DNS 서버
사내 PC Internet 라우터 네이버 웹 서버 192.168.0.2 (개인 IP) 202.131.30.11 (공용 IP)
Internet 네이버 웹 서버 (유무선) 액세스 포인트 192.168.1.2 (개인 IP)
DNS 서버 등록 데이터 www.testdomain.com 173.252.110.27 173.252.100.27 173.252.110.27 (공용 IP) 웹 서버 1 Internet 173.252.100.27 (공용 IP) 웹 서버 2 DNS 서버 DNS 서버 등록 데이터 www.testdomain.com 173.252.110.27 173.252.100.27
TCP/IP 사용 클라이언트 A 서버 192.168.1.10 192.168.1.11 클라이언트 B xx TCP/IP 사용 클라이언트 B 192.168.1.10과 통신 192.168.1.11과 통신 192.168.1.10을 점유하는 프로그램 192.168.1.11을 점유하는 프로그램
TCP/IP 사용 클라이언트 A 서버 192.168.1.10 클라이언트 B 80번 포트를 점유하는 프로그램 xx TCP/IP 사용 클라이언트 B 192.168.1.10의 80번 포트와 통신 192.168.1.10의 90번 포트와 통신 80번 포트를 점유하는 프로그램 90번 포트를 점유하는 프로그램
10.10.10.200 사용자 PC 네트워크 어댑터 A 10.10.10.201 네트워크 어댑터 B 60.20.10.150 60.20.10.151 IP TCP UDP
사용자1 네트워크 어댑터 A (10.10.10.200) 네트워크 어댑터 B (60.20.10.150) 10.10.10.201 60.20.10.151 사용자2 사용자3
UDP 서버 소켓 UDP 클라이언트 소켓 SendTo/Receive serverFunc - 스레드 clientFunc
new Socket(…); Bind Listen Accept Close 2) IP+Port 와 연결 3) 클라이언트로부터 연결을 받을 수 있도록 소켓 상태 전환 4) Listen 이후 연결된 클라이언트를 하나 꺼내와서 반환 5) 서버 소켓 종료 1) TCP 소켓 생성
H e l o char(10) varchar(10)
reader = cmd.ExceuteReader(); Anderson 1950-06-02 anderson@gmail.com 2 Jason 1967-12-03 jason@gmail.com Mark 1988-03-02 mark@naver.com 1 1행 2행 3행 reader = cmd.ExceuteReader(); true = reader.Read() false = reader.Read()
UI 계층 데이터 접근 계층 class MemberInfoDAC 데이터베이스 응용 프로그램 class BlogDAC 데이터 컨테이너 class Blog
UI 계층 데이터 접근 계층 class MemberInfoDAC 데이터베이스 응용 프로그램 class BlogDAC DataSet 데이터 컨테이너
EXE 프로세스(Process) n개의 추가 AppDomain AppDomain 어셈블리 A 어셈블리 B n개의 어셈블리…
어셈블리(Assembly) n개의 모듈(Module) n개의 타입(클래스) n개의 메서드 n개의 필드 n개의 프로퍼티 n개의 이벤트
0x0000 5 메모리 0x2000 스택 영역 힙 영역 0x0400 박싱(Boxing) Add( 0x0400 );
public class NewStack<T> { T [] _list; public void Push(T item) { …… } public T Pop() { …… } } NewStack<int> t = new …; NewStack<double> t = new …; public class NewStack<int> int [] _list; public void Push(int item) { …… } public int Pop() { …… } public class NewStack<double> double [] _list; public void Push(double item) { …… } public double Pop() { …… }
3 ForEach( (elem) => { … } ); 1 4 5 2 Action<T> 리스트의 요소를 하나씩 차례대로 Action<T>에 전달
+ 2항 표현식(Binary Expression) a b 인자 표현식(Parameter Expression) Left Right Expression
from person in people select person; foreach (var person in people) yield return person;
join language in languages Tom 63 Korea Winnie 40 Tibet Anders 47 Sudan Hans 25 Eureka 32 Hawk 15 from person in people join language in languages on person.Name equals language.Name select new { ...... }; Anders Delphi C# Tom Borland C++ Hans Visual C++ Winnie R
LINQ(Language-Integrated Query) C# VB.NET … 기타 .NET 언어 LINQ(Language-Integrated Query) IEnumerable LINQ to Objects LINQ 제공자 LINQ to DataSet LINQ to SQL LINQ to Entities LINQ to XML 배열, List<T>, …… 관계형 DB XML
byte[] buf = new byte[fs.Length]; fs.Read(buf, 0, buf.Length); string txt = Encoding.UTF8.GetString(buf); Console.WriteLine(txt); 동기식 코드 비동기식 코드로 변환 fs.BeginRead(…, readCompleted, …);
스레드 디스크 디스크 I/O 스레드 풀 스레드 ReadAsync (곧바로 메서드 반환) Console.ReadLine 실행 스레드 풀 스레드 GetString 메서드 WriteLine 메서드 C# 컴파일러가 분리해낸 코드
int a; 6 메모리 5 0x0000 0x2000 int b; 0x1600 0x1200 스택 영역 스택 영역 int a; 5 메모리 0x0000 0x2000 int b; 0x1600 0x1200
스택 영역 int a; 5 메모리 0x0000 0x2000 int b; 0x1600 0x1200
0x2000 int n1; string txt1; 5 0x1600 int n2; 스택 영역 C# 힙 영역 0x1200 메모리 0x0400 0x2000 int n1; 5 string txt2; int n2; 스택 영역 힙 영역 0x1600 0x1200
마우스 클릭 윈도우 운영체제가 마우스 눌림을 윈도우에 전달 Form1.Click 이벤트 발생
부모 윈도우 자식 윈도우 + = 2개의 윈도우
윈도우 요소(Element) 메모리 영역을 메모리에 그린다. 메모리상의 그림이 합쳐져서 하나의 윈도우 출력이 완성된다.
INotifyPropertyChanged를 구현한 인스턴스 using System; using System.ComponentModel; using System.Windows; using System.Windows.Threading; namespace WpfApplication1 { public partial class MainWindow : Window, INotifyPropertyChanged DispatcherTimer _timer; string _time; public string Time get { return _time; } set _time = value; PropertyChanged(this, new PropertyChangedEventArgs("Time")); } public MainWindow() InitializeComponent(); // …… [생략] …… void _timer_Tick(object sender, EventArgs e) this.Time = DateTime.Now.ToLongTimeString(); public event PropertyChangedEventHandler PropertyChanged; <Window x:Class="WpfApplication1.MainWindow" xmlns=“……" xmlns:x=“……" x:Name="thisWindow“ ……> <Grid> <Label DataContext="{Binding ElementName=thisWindow}" Content="{Binding Path=Time}" ……></Label> </Grid> </Window> INotifyPropertyChanged를 구현한 인스턴스 Time 속성을 가진 인스턴스 Content 에 반영 이벤트 발생
_processInstaller.Account = ServiceAccount.LocalService; _serviceInstaller.ServiceName = “MyEchoServer”; _serviceInstaller.Description = “My First Service Program”; _serviceInstaller.StartType = ServiceStartMode.Automatic;
웹 서버 (w3wp.exe) CGI 실행 파일 ([……].exe) 표준 입력을 통해 인자 값 전달 표준 출력을 통해 HTML 텍스트 반환
사용자 컴퓨터 myapp.exe RAM 상태 유지
사용자 컴퓨터 웹 브라우저 서버 컴퓨터 웹 서버 HTTP 통신 ASPX 클래스 RAM
전송 버튼을 누르면
전송 버튼을 누르면
PC 윈도우 폰 파워포인트 PPTShow ShowController
PC 윈도우 폰 파워포인트 PPTShow ShowController HTTP 통신 5022번 포트 대기 오피스 자동화 기술을 이용해 제어
…… 컴퓨터 IP …… 5022 Open …… 선택된 PPT 파일 경로 …… Port Label 컨트롤 Button 컨트롤
…… 컴퓨터 IP 목록 …… 5022 Open …… 선택된 PPT 파일 경로 …… Port Label 컨트롤 Button 컨트롤 Not Loaded 목록 컨트롤
…… 컴퓨터 IP …… 5022 Connect IP TextBlock 컨트롤 Button 컨트롤 Port TextBox 컨트롤
현재 슬라이드 이미지 TextBlock 컨트롤 Image 컨트롤 Panorama 컨트롤 슬라이드의 메모 내용
현재 슬라이드 이미지 Image 컨트롤 Panorama 컨트롤 슬라이드의 메모 내용 TextBlock 컨트롤 전체 슬라이드의 이미지 목록 ListBox 컨트롤 + Image 컨트롤
닷넷 응용 프로그램 COM 개체 RCW 관리되지 않는(Unmanaged) 영역 관리(Managed) 영역
PC 윈도우 폰 파워포인트 PPTShow ShowController HTTP 통신 5022번 포트 대기 오피스 자동화 기술을 이용해 제어
닷넷 응용 프로그램 P/Invoke Microsoft.Win32 Win32 API