Tumgik
target-on-it-blog · 6 years
Text
Linq 예제
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
namespace ConsoleApp2 {    class Program    {        static void Main(string[] args)        {            Car[] arrCar =            {                new Car() { Cost = 56, MaxSpeed  =120},                new Car() { Cost = 70, MaxSpeed  =150},                new Car() { Cost = 45, MaxSpeed  =180},                new Car() { Cost = 32, MaxSpeed  =200},                new Car() { Cost = 82, MaxSpeed  =280},            };
           // cost 50이상, maxspeed 150이상인 레코드만 조회
           var recordCar = from costCar in arrCar                            where (costCar.Cost >= 50 && costCar.MaxSpeed >= 150)                            orderby costCar.Cost                            select new {Cost = costCar.Cost, MaxSpeed = costCar.MaxSpeed };
          foreach(var costCar in recordCar)            {                Console.WriteLine("cost : {0}, max spee : {1}", costCar.Cost, costCar.MaxSpeed);            }                  }    }    public class Car    {        public int Cost { get; set; }        public int MaxSpeed { get; set; }    } }
8 notes · View notes
target-on-it-blog · 6 years
Text
델리게이트는 왜 쓰는가?
코딩을 하다 보면 값이 아닌 코드 자체를 매개변수로 넘기고 싶을 때가 생긴다.
 이때 델리게이트를 이용한닷!
예제
namespace ConsoleApp9 {    delegate int Compare(int a, int b);
   class Program    {        static int AscendCompare(int a, int b)        {            if (a > b)                return 1;            else if (a == b)                return 0;            else                return -1;
       }        static int DesendCompare(int a, int b)        {            if (a < b)                return 1;            else if (a == b)                return 0;            else                return -1;        }        static void BubbleSort(int[] DataSet, Compare compare)        {            int i = 0;            int j = 0;            int temp = 0;
           for (i = 0; i < DataSet.Length - 1; i++)            {                for (j = 0; j < DataSet.Length - (i + 1); j++)                {                    temp = DataSet[j + 1];                    DataSet[j + 1] = DataSet[j];                    DataSet[j] = temp;                }            }        }
       static void Main(string[] args)        {            int[] array = { 3, 7, 4, 2, 10 };            Console.WriteLine("Sorting ascending...");            BubbleSort(array, new Compare(AscendCompare));
           for(int i=0; i<array.Length;i++)                Console.WriteLine("{0}",array[i]);            int[] array2 = { 7, 2, 8, 10, 11 };            Console.WriteLine("\nSorting descending...");            BubbleSort(array2, new Compare(DesendCompare));
           for(int i=0; i < array2.Length; i++)            {                Console.WriteLine("{0}",array2[i]);            }            Console.WriteLine();        }    } }
위의 코드를 보면 bubblesort메소드에서 매개변수를 델리게이트로 받는다.
왜? 이유는  원하는 상황에 맞는 메소드를 참조 받아 쓰면 
bubblesort메소드하나만 있어도 2가지의 기능을 구현이 가능하당.
즉 AscendCompare, DesendCompare를 이용하여 
 오름차순 내림차순으로 정렬이 가능하당.
오름차순으로 정렬하고픔
AscendCompare을 델리게이트에 넣고(참조) 
버블솔트 시키면 오름차순 정렬
내림차순은
DesendCompare를 델리데이트에 넣고(참조)
버블솔트 시키면 내림차순 정렬~
유용하지 않은가
0 notes
target-on-it-blog · 6 years
Text
델리게이트 예제
public delegate int myDelegate(int a, int b);
class Program    {
       static int Plus(int a, int b)        {            return a + b;        }
       static int Minus(int a, int b)        {            return a - b;        }
       static void Main(string[] args)        {
           myDelegate MDelg; // 선언만
           MDelg = new myDelegate(Plus);            Console.WriteLine(MDelg(5,7));
           MDelg = new myDelegate(Minus);            Console.WriteLine(MDelg(7,3));
       }    }
0 notes
target-on-it-blog · 6 years
Text
델리게이트2
예제를 보자
delegate int MyDelegate (int a, int b);
int Plus(int a, int b)
{
    return a+b;
}
int Minus (int a, int b)
{
   return a - b;
}
메소드 plus와 minus를 델리게이트로 참조 해보것다.
MyDelegate CallBack; //선언만 하고 메모리 할당 안함
CallBack = new MyDelegate(Plus); // Plus메소드를 델리게이트에 참조.
Console.WriteLine(CallBack(3,4)); //7출력
CallBack = new MyDelegate(Minus); //Minus 메소드를 델리게이트에 참조.
Console.WriteLine(CallBack(7,5)); //2출력
Tumblr media
델리게이트 구현 과정 요약
델리게이트를 선언
델리게이트의 인스턴스 생성
인스턴스 생성 할 때는 델리게이트가 참조할 메소드를 매개변수로 넘김
델리게이트 호출
0 notes
target-on-it-blog · 6 years
Text
델리게이트 Delegate
델리게이트란?
대리자, 사절 이라는 뜻
예시
사원인 나는 보스에게 전할 말이 있었다. 
그래서 보스에게 전화를 걸었다.
그런데 보스말고 “비서”가 대신 전화를 받았다.
나는 비서에게 보스 오면 나에게 연락줘 라고 이야기했다.
얼마 뒤 보스에게 전화가 왔다.
Tumblr media
이런 예시에서 델리게이트는 비서와 같은 역할을 한다.
전화 해달라는 메모를 영어로 콜백(call back)이라 하는데
이러한 콜백은 프로그래밍에서도 사용된다.
객체의 주소를 가리키는 “참조”
메소드를 가리키는 “델리게이트”!
선언 법
한정자 delegate 반환형식 델리게이트이름 (매개_변수_목록);
delegate빼고 메소드랑 똑 닮음
다만 델리게이트는 메소드에 대한 참조다.
따라서 참조할 메소드의 반환 형식 및 매개변수를 명시해줘야 한당
ex)
delegate int MyDelegate (int a, intb);
주의사항
델리게이트는 인스턴스가 아닌 형식 Type 이다.
 int, string 과 같이.
즉 int a 처럼 델리게이트도 인스턴스를 따로 만들어야 함.
0 notes
target-on-it-blog · 6 years
Text
try-catch-finally
예외처리
try 문에서 자원해제 xx.close, delete, 등등 메소드가 있을 때,
예외가 발생했다. 그러면 바로 catch문으로 이동하게된다.
이때 try문 마지막에 있는 자원해제문은 실행이 되지 않는다.
이는 버그의 시발점이 될수있다.
그렇다고 catch문에 쓰는것도 문제다. catch문이 많으면 다써야 하자나..
이런 상황에서 우아하게~ finally문을 써보자 (c#은 아름답다)
finally
{
  dbconn.Close();
}
요런 식으로..
try에서 catch 뭐가 실행되든 마지막은 finally문이 무조건 실행된닷.
0 notes
target-on-it-blog · 6 years
Text
Tumblr media
0 notes
target-on-it-blog · 6 years
Text
일반화 컬렉션
전에 배운 컬렉션의 기본 형은 object.
따라서 다른 데이터 형의 데이터를 담을 수 있지만 
형변환이 엄청나게 일어나서 성능문제를 야기함.
이를 일반화 컬렉션으로 막을 수 있음!
일반화 컬렉션?
컴파일 시 컬렉션에서 사용할 형식이 결정되고,
쓸데없는 형식 변환을 일으키지 않음.
System.Collections.Generic 네임스페이스는 VS에서 using문으로 선언됨
여기에 다양한 컬렉션이 있음.
그중에 4가지만 다뤄보자
List<T>
Queue<T>
Stack<T>
Dictionary<TKey,TVaule>
1. List<T>
using System.Collections.Generic;
   class Program    {        static void Main(string[] args)        {            List<int> list = new List<int>();
           for(int i =0; i < 5; i++)            {                list.Add(i);            }        }    }
2. Queue<T>
using System.Collections.Generic;
   class Program    {        static void Main(string[] args)        {            Queue<int> queue = new Queue<int>();
           queue.Enqueue(1);            queue.Enqueue(2);            queue.Enqueue(3);            queue.Enqueue(4);            queue.Enqueue(5);        }    }
3. Stack<T>
using System.Collections.Generic;
   class Program    {        static void Main(string[] args)        {            Stack<int> stack = new Stack<int>();
           stack.Push(1);            stack.Push(2);            stack.Push(3);            stack.Push(4);            stack.Push(5);        }    }
4.Dictionary<TKey,TValue>
using System.Collections.Generic;
   class Program    {        static void Main(string[] args)        {            Dictionary<string, string> dictionary = new Dictionary<string, string>();            dictionary["하나"] = "one";            dictionary["둘"] = "two";            dictionary["셋"] = "three";            dictionary["넷"] = "four";            dictionary["다섯"] = "five";        }    }
0 notes
target-on-it-blog · 6 years
Text
형식 매개변수 제약시키기
T를 이용해 모든 데이터를 일반화하여 사용해봤다
하지만 필요에 따라 T에 제약을 두어야 할 때 가 있다. 다음과 같이
class MyList<T> where T :  MyClass
{
}
에제 
일반화 메소드
void copyArray<T> ( T[] source, T[] target) where T : struct
{
   ... 
}
정리하자면 
where 형식매개변수 : 제약조건 
요렇게 제한하다
where T : struct   /T는 값 형식 이어야 한다
where T : class    /T는 참조 형식 이어야 한다
where T : new()   /T는 반드시 매개 변수가 없는 생성자가 있어야 한다
where T : 기반_클래스_이름  /T는 명시한 기반 클래스의 파생 클래스여야 한다
where T : 인터페이스_이름 /T는 명시한 인터페이스를 반드시 구현해야한다. 
                인터페이스_이름에는 여러개의 인터페이스를 명시할 수 있다.
where T : U / T는 또 다른 형식 매개 변수 U로 부터 상속 받은 클래스
0 notes
target-on-it-blog · 6 years
Text
일반화 프로그래밍2
일반화 클래스
데이터 형식을 일반화한 클래스
class 클래스이름<형식매개 변수>
{
}
class Array<T>
{
   private T[] array; // 필드
   ...
   public T GetElement (int index) //메소드
   {
            return array[index];
   }
}
사용법
Array<int> intArr = new Array<int>();
Array<double>dblArr = new Array<double>();
0 notes
target-on-it-blog · 6 years
Text
일반화 프로그래밍
특수한 개념으로부터 공통된 개념을 찾아 묶는 것을 
일반화 Generalization 라함.
일반화 프로그래밍은 이 일반화를 이용한 프로그래밍으로
대상은 “데이터 타입”
why? 
어떠한 기능을 하는 메소드가 있다.
이때 메소드는 int형 변수를 매개변수로 받는당.
코딩하다보니 같은 기능이지만 string형 변수를 받아야 하는 메소드가 필요해 졌다. 이러면 위의 메소드를 오버로딩하면 된다.
그런데 같은 맥락의 데이터형만 다른 메소드가 30개가 필요해 졌다면?
sol) 특수한 형식을 사용하는 코드를 일반화 한다면?
일반화 메소드
데이터 형식을 일반화한 메소드
선언 형식
한정자 반환형식 메소드이름<형식매개 변수>(매개 변수 목록)
{
}
사용법
메소드이름<형식매개변수 타입>(매개변수);
예제
void CopyArray<T>(T[] source, T[] target)
{
     ...
}
int [] so ={1,2,3,4};
int [] ro = {1,2,3,4};
string[] so2 ={”안녕”,”target”,”on it”};
string[] ro2={”happy”,”new”,”year”}
CopyArray<int>(so, ro);
CopyArray<string>(so2, ro2);
0 notes
target-on-it-blog · 6 years
Text
인덱서
인덱서(Indexer)
인덱스를 이용해서 객체 내의 데이터를 접근하게 해주는 프로퍼티라 생각!
객체를 마치 배열 처럼 사용!
Class 클래스이름
{
한정자 인덱서형식 this[형식 index]
{
    get
    {
    //index를 이용하여 내부 데이터 반환
    }
    set
    {
    //index를 이용하여 내부 데이터 저장 
    }
}
}
0 notes
target-on-it-blog · 6 years
Text
컬렉션 2
Stack 
스택은 queue와는 반대로 먼저 들어온 데이터가 나중에 나가고, 나중에 들어온 데이터는 먼저나가는 Last in - First out 구조이다.
stack 메모리 구조처럼 작동한당
메소드
Push()
Pop()
Stack stack = new Stack();
stack.Push(1);  1
stack.Push(2);  1 - 2
stack.Push(3);  1 - 2 - 3 
stack.Pop();      1 - 2   
stack.Pop();      1  
stack.Pop();      null
와 같이 맨 마지막에 넣는 데이터가 맨 마지막에 들어가고,
 데이터를 뺄 때 첫번째로 나온다 last in First out의 뜻은 이렇다.
Hashtable
키(key)와 값(value)의 쌍으로 이루어진 데이터를 다룰 떄 사용
ex 사전 -> “book” : key , “책” : value 
해쉬테이블은 탐색속도가 빠르고 사용도 편리한 멋진 구조당
예제
Hashtable ht = new Hashtable();
ht[”book”] = “책”;
ht[”cook”] = “요리사”;
ht[”tweet”] = “지저귀다”;
Console.WriteLine( ht[”book”] );
Console.WriteLine( ht[”cook”] );
 Console.WriteLine( ht[”tweet”] );
해쉬테이블 -> 키 데이터를 그대로 사용
int , float, class 어떤 형식이든 키로 사용 가능!
Hashtable은 배열에서 인덱스를 이용해서 배열 요소에 접근하는 것에 준하는 탐색 속도를 자랑해유. ArrayList에서 원하는 데이터를 찾으려면 정렬해서 탐색함 혹은 순차적으로 리스트를 탐색해야 해유.하지만 Hashtable은 키값을 이용해 단번에 데이터가 저장되어 있는 컬렉션 내의 주소를 계산해내유. 이 작업을 hashing 해싱이라고 해유.
Hashtable ht = new Hashtable();
ht[”하나”] = “one”;
ht[”둘”] = “two”;
ht[”셋”] = “three”;
ht[”넷”] = “four”;
ht[”다섯”] = “five”;
Console.WrieteLine(hr[”하나”]) // one 출력
0 notes
target-on-it-blog · 6 years
Text
컬렉션
컬렉션(Collection)이란?
같은 성격을 띄는 데이터의 모음을 담는 자료 구조
(배열도 컬렉숀)
.NET프레임워크는 배열 말고도 멋진 컬렉션 클래스들을 제공해유
ArrayList
Queue
Stack
Hashtable
ArrayList 
배열과 가장 유사하지만, 생성 시 용량을 미리 지정할 필요가 없이,
필요에 따라 자동으로 용량을 늘리거나 줄임.
중요한 메소드 
Add(데이터) : 컬렉션의 맨 뒤에 있는 요소에 데이터 추가
RemoveAt(인덱스) : 지정한 인덱스의 요소 삭제
Insert(데이터, 인덱스) : 지정한 인덱스에 데이터 삽입
ArrayList나 다른 컬렉션이 다양한 형식의 객체를 담을 수 있는 이유
-> 매개변수 인자를 object로 받음. 
if int, string데이터를 삽입하면 해당 형식이 아닌 object로 박싱함.
이후 접근시에서는 object에서 언박싱하여 원래 형식의 데이터를 반환함.
박싱과 언박싱은 작지 않은 오버헤드를 요구하는 작업으로 부하가 일어남.
-> 성능 저하
but 나중에 일반화 컬렉션에서 해결책을 찾아보자
Queue
queue는 대기열 즉 기다리는 줄 이라는 뜻
큐는 데이터나 작업을 차례대로 입력해뒀다가 입렫된 순서대로 하나씩  꺼내 처리하기 위해 사용.
입력은 오직 뒤에서 출력은 앞에서만 이루어짐.
메소드 
Enqueue()
Dequeue()
예제 
Queue que = new Queue();
que.Enqueue(1);
1
que.Enqueue(2);
1 - 2
que.Enqueue(3);
1 - 2 - 3
int a = que.Dequeue();
2 - 3
int b = que.Dequeue();
3
int c = que.Dequeue();
null 
0 notes
target-on-it-blog · 6 years
Text
가변배열
가변배열(Jagged Array): 배열을 요소로 갖는  배열
들쭉날쭉한 배열!
데이터형식 [] [] 배열이름 = new 데이터형식 [가변배열용량][ ];
int [][] jagged2 = new int [3][];
jageed2[0] = new int [5] {1,2,3,4,5};
jageed2[1] = new int [] { 1, 2 };
jajgeed2[3] = new int [] {  4, 5 };
0 notes
target-on-it-blog · 6 years
Text
다차원 배열
다차원 배열이란, 차원이 둘이상인 배열 ex) 2차원, 3차원...n차원 배열
!!3차원 이상의 배열을 사용하지 말 것을 권유 한다해유!!
3차원 배열의 예제를 봅시당
int [ , , ] array = new int [4, 2, 5 ] 
{ {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10} },
{ {11, 12, 13, 14, 15}, {16, 17, 18, 19, 20}},
{ {21, 22, 23, 24, 25}, {26,27, 28, 29, 30} },
{ {31, 32, 33, 34, 35}, {36, 37, 38, 39, 40} }
};
Tumblr media
배열 구조를 그릴 수 있는건 3차원 배열 까지...
그 뒤로는 그림으로 생각하는건 힘들다. 따라서 2차원 까지만 쓰는게 좋아유.
3차원 배열 만드는 것도 귀찮고 보기도 안좋아유
0 notes
target-on-it-blog · 6 years
Text
2차원 배열
앞에서 설명한 배열은 1차원 배열이닷
이번엔 2차원 배열을 설명한닷
Tumblr media
위와 같이 생긴 배열을 2차원 배열이라 한다.
1차원 배열이 int [] a = new int [5];  요렇게 선언하고
a[2]=3; 요런식으로 사용한다면,
2차원 배열은 
데이터형식[ , ] 배열이름 = new 데이터형식[2차원 길이, 1차원 길이];
int [ , ]a = new int [ , ]; 요렇게 선언한당
위 그림처럼 선언 하려면
int [ , ] a = new int [2, 5 ];
a[0, 0] = 1, a[1, 0] = 6;
a[0, 1] = 2,  a[1, 0] = 7;
a[0, 2] = 3,  a[1, 0] = 8;
a[0, 3] = 4,   a[1, 0] = 9;
a[0, 4] = 5,  a[1, 0] = 10;
Tumblr media
선언과 동시에 초기화 하는 방법
ex) 
int[ , ] arr = new int [ 2, 3 ] { { 1,2, 3 }, {4, 5, 6 } };
int[ , ] arr2 = new int [ , ] { { 1,2, 3 }, {4, 5, 6 } };
int[ , ] arr3 = { { 1,2, 3 }, {4, 5, 6 } };
3가지 방법이 있다
2차원 배열은 1차원 배열을 원소로 갖는 배열이라 생각하자
0 notes