인터넷 통신의 계층 간 상호작용을 설명하는 모델에는 여러 종류가 있다. 초기 인터넷 호스트 요구사항을 정의한
RFC 1122에선 링크 계층(링크 네트워크 인터페이스 계층), IP계층, 전송계층, 응용계층 이렇게 네 개의 계층으로 구분한다.
한편, [OSI7 계층] 이라 하여 OSI 모델에서는 7개의 계층으로 구분한다.

각 계층에서는 저마다 자기 윗단 계층을 지원하기 위해 수행해야 하는 역할이 있다. 
  • 윗단 계층에서 데이터 블록을 수신한다.
  • 계층 헤더를 추가해 패킷을 꾸린다.
  • 데이터를 아랫단 계층으로 전달해 송신 과정을 계속해 나간다.
  • 아랫단 계층에서 수신된 데이터를 받는다.
  • 헤더를 제거하여 수신된 데이터의 패킷을 푼다.
  • 수신된 데이터를 윗단 계층으로 전달해 수신처리를 계속해 나간다.
<통신 과정에서 각 계층을 지나는 데이터는 패킷 단위로 작게 쪼개지고 목적지 정보와 같은 부가 정보가 헤더의 형태로 덧붙여지게 된다>


<계층의 역할>
애플리케이션 계층(서버,클라이언트) - 웹 서비스, 이메일과 같은 서비스를 사용자에게 제공
트랜스포트 계층(TCP,UDP) - 애플리케이션 계층과 인터넷 계층 사이에서 데이터가 올바르게 전달되도록 중계한다.
인턴넷 계층(IP 어드레스, IPv4, IPv6, 라우팅) - 목적지의 IP 어드레스로 데이터를 전달한다.
네트워크 인터페이스 계층(무선랜, 이더넷) - 네트워크 어댑터와 같은 하드웨어를 통해 데이터를 전달한다.

4개의 계층 중 서비스의 내용을 결정하는 것은 애플리케이션 계층뿐이다. 
나머지 3개의 계층은 데이터를 전달하는 통신 기능을 담당

그렇지만 각 계층이 어떤 식으로 역할을 수행해야 하는지 정해져 있는 것은 아니다. 
각 계층마다 다양한 프로토콜이 있어 그중 하나로 역할을 수행하는데, 개중엔 TCP/IP 처럼 오래된 것도 있고
어떤 것은 최근 발명된 것도 있다. 객체 지향 개념에 익숙하다면 계층을 인터페이스라 여기고 
프로토콜 집합은 그 인터페이스를 구체화한 구현물이라 생각해도 좋다.


송신지 --->

애플리케이션 계층 - 상대에게 보낼 데이터
트랜스포트 계층 - 전송하기에 적합한 크기로 작게 쪼갠 후, 목적지의 프로그램을 식별할 수 있는 정보를 덧붙힌다.
인턴넷 계층 - 수신 측의 컴퓨터를 식별할 수 있는 정보를 덧붙힌다.
네트워크 인터페이스 계층 - 하드웨어에 신호를 전달하는 데 필요한 정보를 덧붙힌다.

---> 수신지 

네트워크 인터페이스 계층 - 헤더나 트레일러를 떼어네고 인터넷 계층으로 전달한다.
인턴넷 계층 - 자신이 수신해야 하는 데이터라고 판단되면 이 데이터를 트랜스포트 계층으로 전달한다.
트랜스포트 계층 - 모든 데이터가 수신된 것을 확인하고 데이터들이 결합되면 목적지의 프로그램에게 전달한다.
애플리케이션 계층 - 수신된 데이터






'Programming > 네트워크' 카테고리의 다른 글

OSI 참조 모델  (0) 2018.08.14
기본 용어 정리  (0) 2018.08.14

통신 기술의 도입과 통신 기능의 확장을 쉽게 하려고 프로토콜을 몇 개의 계층으로 나누는 것을 계층화라고 하고 

통신 기능을 7계층으로 분류하여 각 계층마다 프로토콜을 규정한 규격을 OSI(Open System Interconnection) 모델이라 한다.

과거에는 통신업체마다 상호 호완성을 감안하지 않은 채 각자의 시스템에만 적용되는 개별 네트워크 구조를 사용해 왔다.
수많은 컴퓨터와 네트워크 장비를 연결하여 통신하려면, 서로 간의 통신회선, 구조, 프로토콜 등의 표준화가 이루어져야 하는데
이에 대한 요구로 1978년 국제표준협회(ISO)에서는 서로 다른 컴퓨터 간에 통신할 때 네트워크 구조에 상관없이 통신할 수 있도록
국제 표준인 OSI(개방형 시스템 상호 연결) 모델을 만들었다.
그림 참조 (https://www.blackmoreops.com/2016/05/05/osi-layers/)


LAYER 7 애플리케이션 층
구체적인 통신 서비스(파일/메일의 전송, 원격 데이터베이스 액세스 등) 을 제공, HTTP나 FTP(File Transfer Protocol) 프로토콜 등이 있다.

LAYER 6 프레젠테이션 층
데이터의 표현 방법을 정함(데이터의 포맷/확장자를 결정) (EBCDIC의 텍스트 파일을 ASCII코드의 파일로 변환하는 것 등)

LAYER 5  세션 층
통신장치 간의 상호 작용을 설정, 유지 및 동기화(접속 도중에 끊어진 경우 접속 회복을 시도한다.)

LAYER 4 전송 층
오류복구와 흐름제어(발신지 대 목적지) 등을 담당한다.
패킷들의 전송이 유효한지 확인하고 실패한 패킷은 다시 보내는 등 신뢰성 있는 통신을 보장하며, 헤더에는 세그먼트가 포함
-----------------------------------------------------
LAYER 3 네트워크 층
상위 계층에 연결하는 데 필요한 데이터 전송과 경로 선택 기능 제공, 네트워크 통신 경로의 선택(라우팅), 데이터 중계

LAYER 2 데이터 링크 층
직접적(인접적)으로 접속되어 있는 통신 기기 간의 신호를 전달

LAYER 1 물리 층
물리적인 세부 사항 정의 (커넥터의 핀 수, 커넥터 형태의 규격 등. 구리선, 광케이블 간의 전기 신호의 변환 등)


'Programming > 네트워크' 카테고리의 다른 글

TCP/IP Model과 데이터 형태  (0) 2018.08.14
기본 용어 정리  (0) 2018.08.14

#온라인 게임을 지탱하는 기술


TCP (Transport Control Protocol)

인터넷 전체를 뒷받침하는 데이터 전송을 위한 통신 규격. 필요에 따라 IP(Internet Protocol)패킷을 재전송하여 

큰 데이터를 보내는 것이 가능하다. 그 대신에 느린 링크에서 속도를 내기 위해서는 대량의 메모리가 필요하다.


캐시 (Cache)

데이터를 고속으로 꺼내오기 위해 일시적으로 다른 장소에 보존해 두는 것. 예를 들어 디스크 액세스는 느리기 때문에

파일의 내용을 메모리상에 배치해 두면(캐시해 두면), 고속으로 데이터를 꺼낼 수 있다. CPU 캐시, 캐시 메모리,

브라우저 캐시, 캐시 서버 등 여러 가지 레이어에서 활용되고 있는 장치.


클라우드 (Cloud)

클라우드 컴퓨팅(Cloud Computing)에서 주로 서버 측 컴퓨터 망을 말한다. 단순한 서버 머신의 호스팅 서비스뿐 

아니라 스토리지나 부하 분산, 과금 시스템, 로그분석 등 서버 구축에 필요한 모든 컴퓨터 관련 리소스를 필요 시에

유연하며 빠르게 조달할 수 있다. 매우 편리하지만, 중요한 기밀정보나 개인정보를 클라우드 운영회사에 건네줘야

한다는 단점이 있다.


리던던시 (Redundancy)

예비로 여러 개를 준비하는 것, 게임 데이터의 다중화(Redundancy)란 데이터를 가까운 곳과 먼곳, 복수의 장소에 

복사하여 보관하는 것을 말한다. (마스터, 복사본의 관계)


스루풋 (Throughput)

시스템이 일정시간 수행할 수 있는 처리량. 예를 들어, 1초에 1000의 처리를 수행할 수 있는 시스템은 100밖에 

처리할 수 없는 시스템보다 스루풋이 높다고 할 수 있다.


스레드 (Thread)

프로세스에 의해 세분화된 프로그램의 실행 단위. 리소스 공유에 있어 대개의 경우 프로세스 간보다 스레드 간의

연계처리가 더 쉽다. 단일 스레드를 가지고 처리를 수행하는 방법을 싱글 스레드. 복수의 스레드를 동시에 사용하여

처리를 수행하는 방법을 멀티 스레드라고 부른다.


소켓 API (Socket API)

네트워크에 관련된 파일 디스크립터(file descriptor)인 소켓을 다루는 API. 


대역폭 (Bandwidth)

온라인 게임 개발에서 네트워크를 경유하여 데이터 전송을 수행하는 전송률을 가리킨다.


디플로이 (Deploy)

애플리케이션 프로그램의 배치. 서버 디플로이먼트는 다른 버전의 서버 프로그램을 각 서버 머신에 인스톨하여 버전을 

변경하는 일련의 작업을 말한다.


네트워크 토폴로지 (Network Topology)

네트워크에 포함되어 있는 각 컴퓨터가 어떠한 구조로 배치되어 있는지를 나타내는 개념. 컴퓨터는 노드, 접속은 엣지라고

부른다. 스타형, 버스형, 링형 등의 각종 구조에 명칭을 부여하고 네트워크 구조분석에 사용할 수 있으며 네트워크 구조

설계를 돕는다.


패킷 (Packet)

데이터의 전송 단위. 패킷 통신의 원리는 데이터를 분할하고 제어 정보 등을 부가하여 전송하는 것이다. 

TCP에서 데이터 송신 단위는 세그먼트(Segment)이고, UDP/IP에서는 데이터그램(Datagram)으로 불리기도 한다. 

온라인 게임 개발은 결국 네트워크 패킷 지연과의 싸움이다.


파일 디스크립터 (File Descriptor)

유닉스 운영체제에서는 파일뿐 아니라 네트워크나 블록 디바이스 등 OS하에 입출력 가능한 다양한 리소스를 파일처럼

취급한다. 프로그램에서는 파일 디스크립터로서 정수(C언어에서는 Int형)를 할당 사용하여 데이터의 입출력을 실시한다.

파일 디스크립터를 통해서 파일의 입출력과 같은 방법으로 네트워크의 입출력도 행해진다. 파일 기술자로고도 불린다.


블로킹/논블로킹 (Blocking/Non-Blocking) 

블로킹이란 처리가 끝날 때까지 기다리는 것을 말한다. 예를 들어, 데이터가 들어올 때까지 기다리는 프로그램(블록하는)

에서는 그 사이에 다른 처리를 수행할 수 없다. 이문제를 해결하기 위해서는 논블로킹(계속 기다리즌 않음)으로 하면 된다.

동기적 호출, 비동기적 호출로 불리기도 한다.


보틀넥 (Bottleneck)

시스템에서 제일 약점이 되는 부분. 다른 부분이 아무리 빨라도 하나의 늦은 부분(보틀넥)이 있는 것만으로 전체가 느려지는

경우도 있다.


폴링 (Polling)

데이터의 송신과 이벤트의 유무를 확인하는 것. 폴링을 너무 많이 하면 CPU에 불필요한 부하가 걸린다.


미들웨어 (Middleware)

애플리케이션에서 사용하는 범용적인 기능을 집약하여 특화한 패키지 소프트웨어. 통신 등의 유연성과 성능이 요구되는

처리를 패키지화하는 것으로, 개별작업의 번거로움을 줄이고, API를 통해 고도의 기능을 이용할 수 있게 한다.


레이턴시 (Latency)

처리 소요 시간. 예를 들어, 플레이어가 키를 누르고 그 조작이 화면에 반영될 때까지 1초나 걸리는 게임은 레이턴시가 

나쁜 것이라 할 수 있다. 다양한 상화에서 사용되는 용어이며, 대체로 CPU 액세스 레이턴시는 나노초, 메모리 액세스는

수십~수백 나노초. SSD 액세스는 수백 마이크로초, 하드 디스크 액세스는 수십 밀리초, 네트워크는 밀리초~(초) 단위이다.


'Programming > 네트워크' 카테고리의 다른 글

TCP/IP Model과 데이터 형태  (0) 2018.08.14
OSI 참조 모델  (0) 2018.08.14

유니티 게임을 모바일로 빌드하고 마켓에 출시하기 위해선 결국 aos 또는 ios를 통해야 하는데 

이런 것들을 해주기 위해 각종 SDK 설치와 여러 인증 작업을 거쳐야 한다.



준비 작업 0  External Tools 설정

Edit > Preferences >External Tools

(참고 링크 https://boostlog.io/@mohammedalsayedomar/setup-android-sdk-and-jdk-in-unity-5adad03d47018500491f3f77

버전 오류가 없는지 확인요망 (JDK는 1.8.x  NDK는 r13b 사용)




준비 작업 1 Package Name 설정

Build Settings > Android로 스위치  

Player Settings 클릭 Identification 에서 package Name 지정 



준비 작업 2 Keystore 생성


준비 작업 3 SHA1 인증서 지문 


keytool 을 이용하여 인증서 지문 발췌 (keytool -v -list -keystore authKey.keystore) 명령어 실행)





준비 작업 4  프로젝트 구성 


앱 등록 단계 - 준비작업 1의 패키지 이름과 준비작업 3에서의 PHA1 인증서 지문 사용

구성파일(google-services.json) 다운로드 -->  유니티 프로젝트 root 디렉토리로 옮김 

https://firebase.google.com/  firebase 메인 

https://console.firebase.google.com/u/1/ (콘솔로 이동) 프로젝트 추가 







준비작업 5 Firebase SDK 다운 후 유니티에 임포트


https://firebase.google.com/docs/?authuser=1 (문서로 이동)  Unity 시작하기  API 참조

https://firebase.google.com/docs/unity/setup (SDK 다운로드 링크)





준비 작업 6 웹 애플리케이션의 클라이언트 ID와 보안 비밀번호 


구글 클라우드 플랫폼으로 이동  https://console.cloud.google.com/

사용자 인증 정보에서 웹 애플리케이션 클라이언트 ID와 보안비밀 번호를 확인할 수 있다.

이것 역시 인증에 사용되는 중요한 정보이므로 편리한 공간에 따로 카피해두자


OAuth 2.0클라이언트 ID항목에서 웹 클라이언트 쪽을 선택하면 ID와 비밀번호를 확인할 수 있으며 이것은 구글 Play 게임 인증 절차에서 사용된다.


그동안 작업한 정보를 바탕으로 firebase Autentication에서 로그인 제공 업체를 선택할 수 있다.

추가적으로 구글 Play 게임 서비스 GPGS를 사용하려면 

https://github.com/playgameservices/play-games-plugin-for-unity 이곳 링크로 들어가 해당 플러그인을 다운 받고 유니티에 임포트해야 하는데 

이 최신 릴리즈 된 버전 v0.9.50  과 현재 firebase SDK 최신버전 (firebase_unity_SDK_5.1.1) 사이에는 충돌 문제가 있는듯?







람다 식 (Lambda Expression)

미적분학 형태에서 (x) => x * x 와 같이 화살표가 들어간 표기법을 사용해 함수를 표현하는데

람다식의 개념은 바로 이 함수를 설명하는 표현 방법을 제공하는 "Lambda Calculas"에 기원을 둔다.

람다 식은 대리자 또는 식 트리 형식을 만드는 데 사용할 수 있는 일종의 익명 함수이다.

람다 식을 사용하여 인수로 전달하거나 호출에 대한 값을 반환하는 로컬 함수를 쓸 수 있다.


둘 이상의 입력 매개변수 사용 예제 (x, y) => x == y  괄호로 묶고 쉼표로 구분


Lambda (문 형태 람다) 예시 (input-parameter) => { statement; } 중괄호 안에 문을 지정한다.



 namespace System에서 미리 선언해 둔 Func Actioin 을 사용하면 델리게이트 선언 없이 바로 람다 식을 사용할 수 있다



Func<T1, TResult> 예시  String.Split (문자열 분할 구문 사용) 메서드

크리스마스

12

25

2018


Func<T1, T2, TResult> 예시 Select 메서드  

the

same


Lambda 쿼리문 예시 Count 메서드

62 35 32 26 67 42 51 12 70

커트라인 점수 [50]을 넘긴 학생 수: 4


Lambda (문 형태 람다) 예시

4

6


'Programming > C++, C#' 카테고리의 다른 글

[C#] Generic  (0) 2018.06.06
[C#] IEnumerator  (0) 2018.06.06
[C#] Interface  (0) 2018.06.06
[C#] Delegate , Event  (0) 2018.06.06
[C#] Out vs Ref  (0) 2018.06.06


제네릭 (Generic)


미결정 상태의 데이타 타입을 클라이언트 코드에서 클래스 또는 메서드로 선언하고 인스턴스화할 때

지정하는 유연한 타입 지정방식이다. (.NET Framework버전 2.0 이후 형식 매개변수(Type Parameter)라는 개념으로 새롭게 도입되었다.)


제네릭 도입 이전에는 일반화된 알고리즘을 정의하기 위해서 모든 멤버들을 object 데이터 타입으로 다루어야만 했다.

값 타입의 객체를 object 데이터 타입으로 전달 할 때 내부적으로 박싱이 수행되는데 

이것은 Garbage Collection을 유발하므로 성능에 악영향을 미치게 된다.

제네릭 알고리즘을 이용하면 원하는 타입을 지정하여 값 타입의 인스턴스를 참조 형태(by reference)가 아닌 

값 그 자체(by Value)로 전달할 수 있으므로 내부적으로 더이상 박싱을 수행하지 않아도 된다. 


제네릭 example (swap)

output :

100 and 200

200 and 100

유니티 and 언리얼

언리얼 and 유니티

(0.0, 0.0) and (3.0, 9.0)

(3.0, 9.0) and (0.0, 0.0)


형식 매개변수를 두 개 사용하는 새로운 클래스를 만들어서 사용해보자.

output:

상품 :weapon 가격 :450 상품 :potion 가격 :100

상품 :potion 가격 :450 상품 :weapon 가격 :100


'Programming > C++, C#' 카테고리의 다른 글

[C#] Lambda Expression  (0) 2018.06.07
[C#] IEnumerator  (0) 2018.06.06
[C#] Interface  (0) 2018.06.06
[C#] Delegate , Event  (0) 2018.06.06
[C#] Out vs Ref  (0) 2018.06.06

IEnumerable 컬렉션

namespace System.Collections{ public interface IEnumerable IEnumerator GetEnumerator(); }

GetEnumerator()라는 하나의 메서드를 포함, foreach 구문 등에서 개체를 하나씩 넘겨주는 역할을 한다.

이 메서드는 System.Collections.IEnumerator 인터페이스를 구현하는 Enumerator 개체를 돌려준다.

Enumerator 개체는 컬렉션의 요소들을 살펴보기 위해 사용된다.

Enumerator는 목록의 요소들을 가리키는 포인터라고 생각하자. 처음 포인터는 첫 번째 항목의 <앞부분>을 가리킨다.

(Enumerator가 가지는 state의 초깃값은 -1) MoveNext 메서드를 호출하면 현재 위치의 다음인 첫 번째 항목으로 이동한다.

메서드 호출 후 가리키는 항목이 존재하면 true를 반환하고 그렇지 않은 경우엔 false를 반환한다.

Current 속성은 현재 가리키는 항목에 접근할 때 사용하며, Reset 메서드는 목록에서 포인터가 첫 번째 항목의 앞부분을 재 지시하도록 설정해준다.

컬렉션의 GetEnumerator 메서드를 사용하여 Enumerator를 생성하고 MoveNext 메서드를 통해 반복 호출하여 

Enumerator 의 Current 속성 값을 읽어들이면 한 번에 하나씩 다음 컬렉션의 구성 요소들로 이동할 수 있다.

(이것은 foreach 구문과 기능적으로 동일하다.)

직접 나열 가능한 컬렉션 클래스를 새로 만들고자 한다면 컬렉션 클래스에서 IEnumerable 인터페이스와 IEnumerator 인터페이스를 함께 구현해야 한다.


foreach 문과 유사한 IEnumerator 기본 동작 예제


'Programming > C++, C#' 카테고리의 다른 글

[C#] Lambda Expression  (0) 2018.06.07
[C#] Generic  (0) 2018.06.06
[C#] Interface  (0) 2018.06.06
[C#] Delegate , Event  (0) 2018.06.06
[C#] Out vs Ref  (0) 2018.06.06

인터페이스는 상속받는 새로운 클래스가 기본 클래스로부터 함수를 구현해주는 약속이다.

메서드, 속성, 이벤트, 인덱서 또는 네가지 멤버 형식의 조합이 포함되며 구현 내용없이 서명만 정의한다.

제약 조건
  • 상수, 필드, 연산자, 인스턴스 생성자 소멸자 또는 형식이 포함될 수 없다.
  • 인터페이스(구현할 내용 지정)를 제외한 <구체적 구현 내용이 포함된>다른 어떠한 클래스로부터도 상속받지 않는다. 
즉 인터페이스에는 상속받을 클래스가 제공해야 하는 메서드와 속성들을 지정할 뿐이다.   
이것은 자식 클래스의 확장 가능한 프로그래밍 프레임 워크를 구성할 수 있는 좋은 방법을 제시해준다.

인터페이스 목적

다수의 프로그래머들이 참여하여 코드를 작성한다면 복잡성이 전반적으로 증가하게 될 것이다.

코드의 기본적인 일관성을 유지하기 위한 방편으로 이 점을 완화할 수 있다. (협업단계에서 필요)
-> 기본적인 구현 구조에 대한 방식을 통일, 그것을 시스템화하여 코드의 일관성과 안정성을 높일 수 있다.

인터페이스 구현

구현 클래스 또는 구조체의 해당 멤버가 공용이고 비정적이어야 하며 
인터페이스 멤버와 동일한 이름 및 서명을 사용하며 선언한 모든 항목에 대하여 구현부를 정의해야 한다.

'Programming > C++, C#' 카테고리의 다른 글

[C#] Generic  (0) 2018.06.06
[C#] IEnumerator  (0) 2018.06.06
[C#] Delegate , Event  (0) 2018.06.06
[C#] Out vs Ref  (0) 2018.06.06
[C#] Const vs Readonly  (0) 2018.06.06


델리게이트(delegate)

선언 형식delegate키워드 반환타입 델리게이트이름 (파라미터) delegate void delName(int input); 

쉽게 말해 메서드의 포인터 같은 개념이다. 참조할 수 있는 메서드의 형태를 정의하여 고유 식별자와 일치하는 메서드만 가리키도록 한다.

델리게이트가 지정하는 특정 타입의 인스턴스는 마치 추상 메서드를 정의하는 인터페이스의 역할과 닮아있다.

output

4 + 9 : 13

4 × 9 : 36

4 -9 : -5



이벤트(Event)

이벤트 멤버는 특정 타입으로 하여금 다른 객체에 뭔가 특별한 일이 발생했음을 알리는 용도로 사용한다.

즉 델리게이트 타입으로 선언을 하여 타입 안정성을 유지한 채로 콜백 메서드를 호출하기 위한 방법이다.

output

골드 : 10

골드 : 20

골드 : 30



'Programming > C++, C#' 카테고리의 다른 글

[C#] IEnumerator  (0) 2018.06.06
[C#] Interface  (0) 2018.06.06
[C#] Out vs Ref  (0) 2018.06.06
[C#] Const vs Readonly  (0) 2018.06.06
[C#] 박싱과 언박싱  (0) 2018.06.06


out 키워드

참조를 통해 메서드에 인수를 전달할 수 있다. (제한된 범위로 변수를 생성하는 경우 Out 키워드가 유용하다.)

output : 

37

큰 값: 37 작은 값: 13


Ref 키워드

ref는 참조로 전달되는 값을 나타낸다.

변수를 전달하기 전에 초기화해야 한다. (하나 이상의 함수에서 변수에 접근이 필요한 경우 유용)

output :

40


-> 메서드 시그니처 및 메서드 호출에서 인수를 메서드에 참조로 전달한다.

-> 메서드 시그니처에서 값을 호출자에게 참조로 반환한다.

-> 멤버 본문에서 참조 반환 값이 호출자가 수정하려는 참조로 로컬에 저장됨을 의미한다.
즉 인수를 참조로 전달하는 경우 호출된 메서드의 인수 변경 내용이 호출 메서드에 반영
메서드 매개 변수는 값 형식이든 참조 형식이든 관계없이 ref를 통해 수정할 수 있으며, 참조로 전달되는 경우 값 형식은 Boxing 되지 않는다

'Programming > C++, C#' 카테고리의 다른 글

[C#] Interface  (0) 2018.06.06
[C#] Delegate , Event  (0) 2018.06.06
[C#] Const vs Readonly  (0) 2018.06.06
[C#] 박싱과 언박싱  (0) 2018.06.06
[C#] 암시적 변환 vs 명시적 변환  (0) 2018.06.05

+ Recent posts