박싱과 언박싱

박싱(Boxing)은 포장, 언박싱(Unboxing)은 포장풀기를 뜻한다. 박싱은 값형을 포장에서 참조형처럼 쓰일 수 있도록 해주고, 언박싱은 포장 안에 들어있는 데이터의 포장을 풀어서 값형으로 꺼내주는 일을 한다. 값형을 참조형으로 변환할 필요가 있으면 박싱을 통해 참조형으로 변환해 주고 언박싱을 통해 다시 값형으로 변환하면 된다.


결론부터 말하자면,

박싱을 하면 단순히 참조에 할당하는 것보다 20배까지 시간이 소모되며, 언박싱은 할당에 4배정도 소모된다.
(출처 : MSDN)

박싱과 언박싱에는 많은 시간이 소모된다. 되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 어쩔 수 없이 사용하려면 그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 한다.


박싱(Boxing)

값타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것을 말한다.

기존에 저장된 스택영역에서 힙영역에 값형식을 저장한다.


위에서 int의 값형식을 Object라는 참조형식으로 형변환을 시도한다.  그 목적는 여러가지가 있을 수 있는데,

보통 파라미터로 전달되거나, List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용될 수 있다.

위의 코드는 메모리상에서 아래와 같이 메모리가 할당이 된다.


스택영역에 있는 i 값이 o로 변환이 되면서 힙영역에 object 형식으로 선언이 되고, 값이 복사 된다.

o는 스택영역에 존재하며 boxed된 i의 주소값을 가지고 있다.


박싱은 보통 암시적으로 되며, 명시적으로도 가능합니다.


언박싱(UnBoxing)
Object 형식에서 값형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것을 말한다.

 

언박싱 과장은 두가지의 절차를 거친다.
1.개체 인스턴스가 지정한 값 형식을 boxing한 값인지 확인
2. 인스턴스의 값을 값 형식 변수에 복사

위의 그림에서 보면, int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있다.

언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려면 오류(InvalidCastException)가 발생 한다. 이때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야한다. is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.


박싱과 언박싱 사용 예제






'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

DB 백업의 종류

DB 백업에는 3가지 백업 방식이 있는데 대표적으로 완전백업, 차등백업, 로그백업 총 세 가지가 있다.



1) Full Backup

하나부터 열까지 모든 것을 백업하는 방식이다. mdf 파일에 들어있는 모든 데이터를 백업을 받는다.

그런데 풀 백업이 이루어지는 동안에도 트랜잭션이 계속 진행되기 때문에 실제로는 아직 Commit되지 않은 작업이 백업 시 포함될 수 있다. 나중에 이 백업을 Restore 했을 때 Commit되지 않은 데이터가 들어있다면 데이터가 이상해 질 것이다. 그래서 실제로 풀 백업을 받을 때는 현재 진행중인 트랜잭션에 대한 트랜잭션 로그도 함께 백업된다.

풀 백업이 중요한 것은, 풀 백업이 보관되어 있지 않다면 Differential Backup이나 트랜잭션 로그 백업을 아무리 열심히 받았어도 아무 소용이 없기 때문이다.


2) Differential Backup (차등 백업 or 차분 백업)

이건 OS 백업 받을 때의 Differential Backup과 유사하다. "가장 마지막에 Full Backup 받은 이후의 변경 부분에 대한 백업"이다. 마지막에 받은 Differential Backup 이후의 변경사항을 백업 받는 것이 아니다. (SQL Server에는 Incremental Backup이란 개념이 없다.) 만약 10월 1일에 풀 백업을 받은 후 10월 5일, 10일 15일에 Differential 백업을 받았다면 DB를 15일자로 되돌리기 위해서는 10월 1일 풀 백업을 Restore한 후 15일자Differential 백업을 Restore하면 된다. (Intremental Backup과 달리 5일, 10일, 15일자를 모두 Restore할 필요가 없다.)


3) Transaction Log Backup (로그 백업)

트랜잭션 로그 백업에 대해 이해하려면 먼저 트랜잭션 로그란 놈에 대해서 알아보자

트랜잭션 로그란 SQL Server에서 실행되는 모든 SQL문을 기록한 로그이다. 어느 세션이 어떤 SQL을 실행했는지가 순차적으로 기록된다. 우리가 트랜잭션을 Rollback 시켰을 때 Begin Tran 시점 이전으로 되돌릴 수 있는 것은 트랜잭션을 시작한 이후의 모든 작업내용이 트랜잭션 로그에 기록되어 있기 때문이다 


로그 백업은 위의 데이터 백업과는 다른 몇 가지 특성이 있다.


① 일단 백업된 트랜잭션 로그는 자동으로 삭제된다. 이때 ldf파일 사이즈가 줄어들지는 않지만 ldf 내에서 로그가 삭제되기 때문에 해당 ldf 파일에는 새로운 로그를 기록할 수 있는 빈 공간이 확보된다. 따라서, 주기적으로 트랜잭션 로그를 백업 받으면, 별도로 로그를 삭제하지 않더라도ldf 파일이 계속 커지는 것을 방지할 수 있다.


② 트랜잭션 로그는 가지고 있는 최신 풀 백업 혹은 풀 백업 + DifferentialBackup 세트로부터 복원을 원하는 시점까지의 모든 백업 본이 존재하지 않으면 아무 의미가 없다. 백업 받은 로그 중 한 세트라도 분실하면 소용 없다는 의미다.  물론 풀 백업을 한번도 받은 적이 없다면 트랜잭션 로그는 소용없다.


③ 트랜잭션 로그가 온전하다면 Fault가 발생한 Database를 Fault 발생 직전의 시점으로 복원할 수 있다. 또한, 특정 시점으로의 Rollback 등 미세한 복원이 가능하다.

using

using 의 사용 용법은 2가지가 있다.


1.지시문(Directive)


다른 네임스페이스에 정의된 타입을 Import 하거나, 네임스페이스에 대한 별칭을 만들때 사용한다.


2.문장(Statement) 


개체의 범위를 정의할때 사용한다. 그 범위를 벗어나면 자동으로 Dispose 된다.


File이나 Font, DB Connection 관련 클래스들은 관리되자 않는 리소스에 액세스 한다. 다 사용후 적절하게 Dispose해서 자원을

반납해야 한다. 하지만 종종 Dispose를 하지 않아서 리소스가 낭비되거나 DB Connection 같은 것을 Open만하고 Close하지 않으면

문제가 발생한다. 


이때, 일일이 Close하지 않고 Using을 이용하면 그 범위를 벗어나면 자동으로 Dispose 되서 관리가 쉬워진다.




위처럼 Connection을 Using 구문으로 사용하면 {} 범위를 벗어나면 자동으로 Dispose가 된다.

using 문은 개체의 메서드를 호출하는 동안 예외가 발생하는 경우에도 Dispose가 호출되도록 한다. 

try 블록 내에 개체를 배치한 다음 finally 블록에서 Dispose를 호출해도 동일한 결과를 얻을 수 있다. 



using문을 사용한 리소스 관리는, 좋고 나쁨을 따질수 있는 선택적인 사항이 아니라, 반드시 숙지하고 활용해야 할 사항이다. 

 

기본적으로 닷넷은 가비지 컬렉터에 의해서 모든 리소스를 자동으로 관리한다고 소개하였고 실제로도 그렇다. 하지만 중요한 맹점이 하나 있는데, 닷넷 프레임워크 외부의 비관리 영역상의 자원에 대해서는 해당되는 부분이 없다. 파일 핸들, 메모리 핸들, 데이터베이스 연결, 소켓 핸들, 스레드 핸들, 세마포어 등의 모든 비관리 자원들에 해당되는 것이다.

 

단순히 가비지 컬렉터에 의하여 처리되기를 기다린다면 이들 자원들은 사용량이 집중될 경우 고갈되어 시스템에 문제가 생길 수 있다. 따라서 이를 사전에 예방하고 효율적으로 관리하기 위해서 명시적인 소멸자를 직접 구현할 수 있는데, 이것이 IDisposable 인터페이스를 통해서 가능하다.

 

본디, IDisposable 인터페이스로 소거를 시도하기 위해서는 아래와 같은 모양의 문법을 사용한다.



'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

String, StringBuffer, StringBuilder 




모두 문자열을 저장하고, 관리하는 클래스 이다. char와 String의 가장 큰 차이점도 이점에 있다.


char는 문자 함수이고 

String은 클래스라는 차이를 알아야 한다.


char와 String의 차이는 다음 기회에 다시 안내하기로 하겠다.

 

먼저 String 과 다른 클래스(StringBuffer, StringBuilder)의 차이점을 알아보겠다. 

두 문자열 클래스의 아주 기본적인 차이는 String은 immutable(불변함)하고, StringBuffer는 mutable(변함,변하기쉬움)하다는 것이다.


결론부터 말하자면, 

단순하게 성능으로 따지면 StringBuilder > StringBuffer >>> String 이지만

각 문자열 클래스들은 성능 이슈 외에도 사용 편의성, 멀티스레드 환경 등 여러가지 고려해야할 요인이 있으므로 이에 적합한 것을 사용하면 될 것이다.

한마디로 StringBuilder와 StringBuffer는 사용 목적에 따라 다르다라는 것이다.


먼저 스트링은  

String 객체는 한 번 생성되면 할당된 메모리 공간이 변하지 않는다. + 연산자 또는 concat 메서드를 통해 기존에 생성된 String 클래스 객체 문자열에 다른 문자열을 붙여도 기존 문자열에 새로운 문자열이 붙는 것이 아니라, 새로운 String 객체를 만든 후, 새 String 객체에 연결된 문자열을 저장하고, 그 객체를 참조하도록 한다. (즉, String 클래스 객체는 Heap 메모리 영역(가비지 컬렉션이 동작하는 영역)에 생성되며, 한 번 생성된 객체의 내부 내용을 변화시킬 수 없다. 기존 객체가 제거 되면 Java의 가비지 컬렉션이 회수한다.)

 

String 객체는 이러한 이유로 문자열 연산이 많은 경우, 그 성능이 좋지 않지만, Imuutable한 객체는 간단하게 사용가능하고, 동기화에 대해 신경쓰지 않아도 되기 때문에(Thread-Safe), 내부 데이터를 자유롭게 공유할 수 있다.

 

StringBuffer 와 StringBuilder 차이점

기본적으로 두 클래스가 제공하는 메소드는 동일하지만 StringBuffer는 멀티 쓰레드 상태에서 동기화를 지원한다. (각 메소드 별로 synchronized 키워드가 존재)

String 을 + 를 활용해 합치는 경우 매번 인스턴스를 생성하기 때문에 성능상에 이슈가 많다. 이런 성능 이슈를 개선하기위해 JDK 1.5 버전 이후에는 컴파일 단계에서 StringBuilder로 컴파일 되도록 변경되기 때문에 + 를 활용해도 성능상에 큰 이슈는 없다.


사실 두 클래스의 가장 큰 차이점은 동기화 여부이다.

 

StringBuffer는 각 메서드 별로 Synchronized Keyword 가 존재하여, 멀티스레드 환경에서도 동기화를 지원한다. 하지만, StringBuilder는 동기화를 보장하지 않는다.

그렇기 때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일스레드환경에서 StringBuffer를 사용한다고 문제가 되는 것은 아니지만, 동기화 관련 처리로 인해 StringBuilder에 비해 성능이 좋지 않다.


 


'Develop > Java' 카테고리의 다른 글

자바 reflection  (0) 2018.05.17
Quick sort  (0) 2016.11.21
자바 reflection  (0) 2016.11.17
문자열 "ABCDEFG"를 역순으로 출력  (0) 2016.11.17
JAVA의 접근제한자  (0) 2016.11.15

퀵소트 정렬

자바로 코딩한 정렬



'Develop > Java' 카테고리의 다른 글

자바 reflection  (0) 2018.05.17
String, StringBuffer, StringBuilder  (0) 2016.12.01
자바 reflection  (0) 2016.11.17
문자열 "ABCDEFG"를 역순으로 출력  (0) 2016.11.17
JAVA의 접근제한자  (0) 2016.11.15

자바 reflection




리플렉션(reflection) 자바 프로그래밍 언어의 기능 하나다. 리플렉션을 사용하면 자바 프로그램을 실행해서 해당 프로그램을 조사하거나 스스로를 살펴볼(introspect) 있다. 또한 프로그램의 내부 프로퍼티를 조작할 수도 있다. 예를 들어 리플렉션을 사용하면 자바 클래스에서 해당 클래스의 멤버의 이름을 모두 획득해서 표시할 있다.

자바 클래스에서 스스로를 조사하고 조작하는 이러한 기능이 그리 대단해 보이지 않을 수도 있다. 하지만 이러한 기능을 지원하지 않는 프로그래밍 언어도 있다. 예를 들어 파스칼, C, C++ 프로그램에서는 해당 프로그램 안에 정의된 함수에 대한 정보를 얻을 있는 방법이 없다.

실제로 자바 (JavaBeans)에서 리플렉션을 적용했다. 자바 빈을 사용하면 소프트웨어 컴포넌트를 빌더 툴을 사용해서 시각적으로 조작할 있다. 이러한 빌더 툴은  자바 컴포넌트(클래스) 동적으로  로드될 , 리플렉션을 사용해서 해당 컴포넌트의 프로퍼티를 획득한다.

간단한 예제
리플렉션이 어떻게 동작하는지 아래의 간단한 예를 통해 살펴보자:

   import java.lang.reflect.*;
 
   public class DumpMethods {
      public static void main(String args[])
      {
         try {
            Class c = Class.forName(args[0]);
            Method m[] = c.getDeclaredMethods();
            for (int i = 0; i < m.length; i++)
            System.out.println(m[i].toString());
         }
         catch (Throwable e) {
            System.err.println(e);
         }
      }
   }


아래와 같이 실행해 보면

java DumpMethods java.util.Stack


결과는 다음과 같다:

public java.lang.Object java.util.Stack.push(java.lang.Object)
public synchronized java.lang.Object java.util.Stack.pop()
public synchronized java.lang.Object java.util.Stack.peek()
public boolean java.util.Stack.empty()
public synchronized int java.util.Stack.search(java.lang.Object)


보다시피 java.util.Stack 클래스의 메서드 명이 출력된다. 메서드의 파라미터와 리턴 타입 또한 패키지 명을 포함해서 출력된다.

프로그램은 Class.forName 사용해서 기술된 클래스를 로드한 getDeclaredMethods를 호출해서 해당 클래스에 정의된 메서드 목록을 얻는다. java.lang.reflect.Method는 클래스에서 단일 메서드를 나타내는 클래스다.


리플렉션 사용을 위한 설정
Method
같이 리플렉션을 위한 클래스는 java.lang.reflect 패키지에서 찾을 있다. 패키지에 있는 클래스를 사용하려면 단계를 거쳐야만 한다. 단계로 조작하려는 클래스에 해당하는 java.lang.Class 객체를 얻어야 한다java.lang.Class는 실행 중인 자바 프로그램에서 클래스 또는 인터페이스를 나타내기 위해 사용한다.

Class
객체를 얻을 있는 가지 방법은 다음과 같다:

Class c = Class.forName("java.lang.String");


같이 사용하면 String 대한 Class 객체를 얻을 있다. 또는 다음과 같이 사용할 수도 있다:

Class c = int.class;   // 또는
Class c = Integer.TYPE; 


같이 사용하면 기본형에 대한 Claass 정보를 얻을 있다. 번째 방법의 경우, 기본현에 대한 래퍼 클래스(Integer 같이) 미리 정의된 TYPE 필드에 접근한다.

번째 단계는 getDeclaredMethods와 같은 메서드를 호출하는 작업으로, getDeclaredMethods를 호출하면 해당 클래스에 선언된 메서드의 목록을 모두 얻을 수 있다.

이러한 정보를 모두 얻고 나면, 번째 단계로 리플렉션 API 사용해서 해당 정보를 조작할 있다. 예를 들어 아래와 같은 일련의 문장을 실행하면,

Class c = Class.forName("java.lang.String");
Method m[] = c.getDeclaredMethods();
System.out.println(m[0].toString());


String
선언된 번째 메서드를 텍스트 형식으로 표시하게 된다.

이후에 다룰 예제에서는 지금 설명한 단계를 결합해서 사용한다. 이를 통해 특정한 목적에 맞게 리플렉션을 활용하는 방식을 효과적으로 처리하는 예제를 한꺼번에 보여주고자 한다.

결론
자바 리플렉션을 사용하면 클래스와 데이터 구조에 대한 정보를 이름을 기반으로 동적으로 얻을 있다는 점에서 매우 유용하다. 뿐만 아니라 리플렉션을 사용하면 자바 프로그램을 실행하는 동안에 해당 클래스를 조작할 있다. 기능은 믿을 없을 정도로 강력하며, C, C++, 포트란, 파스칼과 같은 자바 이외의 언어에서는 리플렉션에 해당하는 기능이 전혀 없다.

'Develop > Java' 카테고리의 다른 글

String, StringBuffer, StringBuilder  (0) 2016.12.01
Quick sort  (0) 2016.11.21
문자열 "ABCDEFG"를 역순으로 출력  (0) 2016.11.17
JAVA의 접근제한자  (0) 2016.11.15
오버로딩 vs 오버라이딩  (0) 2016.11.14

문자열 "ABCDEFG"를 역순으로 출력


void ReversString()





'Develop > Java' 카테고리의 다른 글

Quick sort  (0) 2016.11.21
자바 reflection  (0) 2016.11.17
JAVA의 접근제한자  (0) 2016.11.15
오버로딩 vs 오버라이딩  (0) 2016.11.14
Java Collection Framework  (0) 2016.11.14

서비스 port 리스트


  ▲ 21번: FTP

  ▲ 22번: 보안 텔넷(SSH)

  ▲ 23번: 텔넷

  ▲ 25번: SMTP(메일 발송)

  ▲ 42번: 호스트 네임 서버

  ▲ 53번: 도메인 메인 서버

  ▲ 70번: 고퍼(Gopher)

  ▲ 79번: 핑거(Finger)

  ▲ 80번: 웹(HTTP)

  ▲ 88번: 커베로스 보안 규격

  ▲ 110번: POP3(메일 수신)

  ▲ 118, 156번: SQL 서비스

  ▲ 137~139번: NetBIOS(파일 서버)

  ▲ 161번: SNMP(네트워크 관리)

  ▲ 220번: IMAP3(일부 메일 서비스)

  ▲ 812, 987번: 버디버디

  ▲ 1214번: 카자

  ▲ 1720번: 넷미팅

  ▲ 1863, 6891~6900번: MSN 메신저

  ▲ 3389번: 터미널 서비스(원격 데스크톱)

  ▲ 4000번: ICQ

  ▲ 4000, 6112번: 배틀넷(디아블로, 스타크래스트, 워크래프트)

  ▲ 4662번: e동키(기본값)  ▲ 5500, 5800, 5900번: VNC

  ▲ 6257, 6699번: 윈MX(기본값)

  ▲ 6346번: 그누텔라

  ▲ 6699번: 냅스터

  ▲ 7674, 22321번: 소리바다 2

  ▲ 9292, 9999번: 구루구루

  ▲ 28290번: PDBOX

 

 

 

 

-  각종 P2P 및 서버 포트번호

 

1. eDonkey : tcp 4661, 4662, 4242, udp 4665, 4672

2. iMash : tcp 5000

3. BitTorrent : tcp 6881, 6889

4. 소리바다 : tcp 9001-4, udp 22321, 7674(검색), 7675(다운)

5. WinMX : TCP 6699, udp 6257

6. Direct -Connect : tcp 411-412, udp 411-412

7. KaZaA : tcp 1214

8. Gnutella : tcp 6346-6347, udp 6346-6347

9. 구루구루 : tcp 9292, 9999, 8282, 31200

10. 파일구리 : tcp 9493

11. Madster-Aimster : tcp 23172, 9922

12. HotLine : tcp 5497-8, 5500-5503, udp 5499

13. V-Share : tcp 8401번에서 8404까지 4개

14. Maniac : tcp 2000, 2222, udp 2010

15. Mirc : tcp 6667, 6665-6670, 7000

16. Shareshare : tcp 6399, 6777

17. Bluster : udp 41170

18. GoToMyPc : tcp 8200

19. Napster : tcp 6600-6699, 4444, 5555, 6666, 7777, 8888, 8875

20. 버디버디   tcp : 812,987

21. 윈엠프     tcp : 8000

23. 넷미팅     tcp : 1720

25. 원격데스크탑 연결 : TCP: 3389  udp : 3389

 

==========================================================================================

 

특정 포트번호 죽이는 건

그 포트를 오픈하고 있는 프로그램을 죽여야한다.


일단 443 포트와 80 포트는 apache와 같은 웹서버가 사용하는 포트이다.

(이 확인은 /etc/service 파일을 열어 보시면 

각 포트가 어떤 프로토콜에 의해 사용되는지 보실 수 있다)

22 포트는 ssh가 사용한다.


포트를 사용하는 프로그램을 확인하는 방법은

lsof -i TCP:port 번호 하시면(ex: lsof -i TCP:22)

그 포트를 사용하는 프로그램명이 나온다.


간단히 프로그램을 죽이는 방법은

fuser -k -n tcp port번호 하면 된다.(ex: fuser -k -n tcp 22)


나중에 다시 살리는건 프로그램을 다시 구동하면 된다.


리눅스니깐

/etc/rc.d/init.d/httpd start 하시면 80포트와 443 포트가 다시 살고

/etc/rc.d/init.d/sshd start 하시면 22 포트가 다시 산다.

역으로 

/etc/rc.d/init.d/httpd stop 하시면 역시 httpd 를 죽일 수 있다.

 

------------------------------------------------------------------

/sbin/iptables -A INPUT -p tcp --dport 443 -j DROP

/sbin/iptables -A INPUT -p tcp --dport 22 -j DROP

/sbin/iptables -A INPUT -p tcp --dport 80 -j DROP



443은 https

22은 ssh

80은 http 포트이다.

'Develop > Web' 카테고리의 다른 글

Web server vs WAS  (0) 2016.12.20
[HTML 속성] id와 name 속성의 차이  (0) 2016.11.03
Web - http method  (0) 2016.10.31

프로젝트 exe 파일(Release 버전) 생성


1. 속성 변경 후 빌드할 것이므로 솔루션 정리  


2. 프로젝트 속성 창



3. 속성 응용 프로그램 탭

  - 대상 프레임워크(3.5/4) 버전 선택

  - 출력 형식 : Window 응용 프로그램



4. 빌드 탭으로 이동

  - 구성 : Release

  - 플랫폼 대상 : Any CPU 또는 x86(솔직히 요즘 다 64bit라서 상관없다)

변경 완료 후 Ctrl + S 로 저장



5. 솔루션 다시 빌드



6. 일괄빌드 

  - 일괄 빌드 후 exe 파일 추출 예정



7. exe 파일 추출

  - Release 부분 체크박스 체크 후 빌드



8. 프로젝트가 저장된 폴더로 이동

  - workspace로 이동

  - 따로 지정하지 않았다면 C:\Users\사용자명\문서\Visual Studio\Projects\해당프로젝트명\bin폴더\Release 폴더\프로젝트명.exe 



'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
ListBox items Random 함수 사용  (0) 2016.11.15

ListBox items Random 함수 사용


간단하게 매칭하는 시스템을 설계 중에 어떻게 매칭을 시킬까 고민하다가 리스트 박스를 사용하기로 했다.


ListBox에 아이템들을 담고 아이템들을 랜덤하게 분류하여 기준이 되는 데이터 리스트 박스 와 랜덤함수를 돌린 리스트 박스를 비교하여 매칭하기로 했다



리스트박스에 담아 랜덤함수를 돌린 코드는 다음과 같다.




'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
박싱과 언박싱  (0) 2016.12.07
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15

+ Recent posts