C#에서는 데이터 타입을 쉽게 변환 할 수 있도록 하는 문법을 제공해 줍니다.


알아두면 편리합니다.


C#에서 String 타입에 문자열을 int형으로 변환하는 방법입니다.

int.Parse를 이용하여 아래와 같이 사용하면 됩니다.


1
2
3
String str = "12345";
int number = int.Parse(str); //변환
Console.WriteLine(number);  //출력




하지만 아래와 같이 String 타입의 문자열에 숫자가 아닌 문자가 들어있을 경우엔 에러가 발생하게 됩니다.


1
2
3
String str = "1a2";
int number = int.Parse(str);    //에러발생
Console.WriteLine(number);
cs


Unhandled Exception: System.FormatException: Input string was not in a correct format. 

이와같은 에러가 발생하게 됩니다.


이와 같은 에러발생을 방지하려면 TryParse() 함수를 이용하면 됩니다.

정상적으로 변환이 되면 true가 반환되고 실패하면 false가 반환이 됩니다.

함수의 원형은 아래와 같습니다.

bool int.TryParse(String s, out int number);




아래는 사용 예제입니다.


1
2
3
4
5
6
7
8
9
10
String str = "1a2";
int number;
if(int.TryParse(str, out number))
{
    Console.WriteLine(number);
}
else
{
    Console.WriteLine("fail");
}




int형 말고도 소수를 저장할 수 있는 double 형 역시 같은 방식으로 사용하면 됩니다.


1
2
3
4
5
6
7
8
9
10
String str = "123.4";
double number;
if(double.TryParse(str, out number))
{
    Console.WriteLine(number);
}
else
{
    Console.WriteLine("fail");
}
cs


날짜와 시간을 저장하는 자료형인 DateTime형 역시 아래와 같이 사용하면 됩니다.


1
2
3
4
5
6
7
8
9
10
String str = "17 april 2017";
DateTime dateTime;
if(DateTime.TryParse(str, out dateTime))
{
    Console.WriteLine(dateTime);
}
else
{
    Console.WriteLine("fail");
}

cs



Posted by 꿈만은공돌
,

C#에 언어가 업데이트 자주 되는 편이라 새로운 문법들을 학습해야 하는데 이런 새로운 내용들을 잘 정리해놓은 사이트이다.


최신 C#에 문법들을 설명한 사이트 주소


링크 : http://www.csharpstudy.com/Latest/CS7-new-features.aspx



Posted by 꿈만은공돌
,

 

C#, 닷넷에서 변수에 값이 null 인지를 제대로 체크하지 않고 사용하면 NullReferenceException 예외가 발생할 수 있다. 생각보다 자주 발생하는 에러이다.

 

java에서도 nullpointerexception은 가장 쉽게 만나볼 수 있는 친근한 에러이다.

 

그래서 C#에서는 이를 잘 처리 할 수 있도록 다양한 문법들을 제공해주고 있다.

어려운 문법들도 있으나 아래의 예시정도만 정확히 알고 적재적소에 사용한다면 안정적인 코드를 작성할 수 있을 것이다.

 

우선 int나 double 과 같은 일반적인 변수에는 null을 대입할 수 없다.

그러나 아래 코드와 같이 변수 타입 뒤에 ? 를 붙이면 null값을 대입할 수 있다.

int? 와 같은 변수는 Nullable 타입이다. int? test2 는 컴파일 단계에서 Nullable<int> test2로 변경된다.

 

 

아래 코드와 같이 null값 뿐만 아니라 다른 데이터도 넣을 수 있다.

 

 

 

 

 

1
2
3
4
5
6
7
int? test2 = null//정상             
if(test2 == null//참
    Console.WriteLine("null");
 
test2 = 3;
if(test2 == 3//참
    Console.WriteLine(test2);
cs

 

변수의 필드나 속성을 구할때 null이 반환되는 경우도 있다. 이때 아래 코드와 같이 ?. 연산을 사용하여 처리하면된다. str이 null이라면 에러를 발생시키지 않고 null을 리턴하게 된다.

 

1
2
3
4
string str = null;
int? strLen = str?.Length; // int에 null 대입
if (strLen == null//참
    Console.WriteLine("null"); //출력
cs

 

 

위에 코드에서 해당 결과값이 null일때 null을 변수에 대입하는 대신 다른 값을 넣고 싶을 때는 ?? 연산자를 사용해서 아래 코드와 같이 사용하면 된다. str이 null이라면 에러를 발생시키지 않고 0을 대입하란 의미이다.

 

1
2
3
4
5
6
string str = null;
int strLen = str?.Length ?? 0//str이 null이면 0반환
if(strLen == //참
    Console.WriteLine("zero"); //출력
else  //거짓
    Console.WriteLine("not zero"); 
cs

 

항상 변수나 객체를 선언할 때 null이 참조되지 않도록 하는 습관이 중요하고 혹시라도 null에 가능성이 있다면 변수나 객체 선언을 할 때 ? 연산자를 사용하고 사용할때에는 if문으로 null값인지 검사하는 코드를 넣는 습관을 들이자.

 

Posted by 꿈만은공돌
,




C#/닷넷에 자료형에는 소수를 저장하는 변수가 double과 decimal 두가지가 존재


double은 부동소수점 방식을 이용하고 


decimal은 고정소수점 방식을 이용


부동소수점 방식 장점으론 작은 메모리공간에 큰 소수를 저장 가능하나 정확성이 떨어진다.


고정소수점 방식은 연산 속도가 빠르고 수의 정확성이 높은데신 큰수를 저장할때 메모리를 많이 잡아먹게 된다. 


C#에서 double은 8byte 메모리를 사용하며 decimal은 16byte에 메모리를 사용한다.


- 부동소수점의 원리를 잘 설명한 블로그 : https://blog.naver.com/chdb57/221146120811


- 고정소수점의 원리를 잘 설명한 블로그 : https://chogahui05.blog.me/221246891984




- 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//부동소수점 double 사용
double double1 = 0.1;
double double2 = 1;
 
if (double1 + double2 == 1.1)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");
   
 
//고정소수점 decimal 사용         
decimal decimal1 = 0.1M;
decimal decimal2 = 1.1M;
 
if (decimal1 + decimal2 == 1.1M)
    Console.WriteLine("값 일치");
else
    Console.WriteLine("일치하지 않음");



위의 예제처럼 부동 소수점은 == 연산을 사용해서 비교를 하면 안된다.


Posted by 꿈만은공돌
,

Visual Studio 2017 에서 자동 서식을 이용하여 코드 들여쓰기나 간격 등을 자동으로 맞춰준다.


아래 코드와 같이 들여쓰기가 전혀 안된 코드에서 Ctrl +K, D를 눌려주면 된다.




아래와 같이 정렬된 코드를 볼 수 있다.




Posted by 꿈만은공돌
,

Visual Studio 2017 에서 닷넷 코어(.NET Core) 프로젝트 생성하기


1. 파일 > 프로젝트 클릭




2. 왼쪽 창에서 Visual C# > .NET Core 클릭 > 오른쪽 창에서 콘솔 앱(.NET Core) 클릭 > 이름을 입력후 확인




3. 코드를 확인 후 Ctrl+F5 클릭




4. 결과창 확인









Posted by 꿈만은공돌
,

닷넷 네이티브(.NET Native)란

 

보통의 C#은 CLR(Common Language Runtime)이 C#의 소스코드를 컴파일 해서 생성된 IL(Intermediate Language) 코드를 만든다. 그리고 이 IL 코드를 가지고 런타임에 JIT(Just In Time) 컴파일러가 네이티브 소스코드를 만든다.


이런 방식에 장점은 개발자가 코드를 작성해서 배포할 때 사용자의 실행환경(OS, CPU 등)을 고려하지 않아도 된다.


하지만 이러면 단점이 메모리를 많이 사용하게 되고 속도 또한 떨어지게 된다.

그래서 이를 해결하기 위해 나온 것이 닷넷 네이티브 이다.


닷넷 네이티브는 AOT(Ahead of time) 컴파일을 사용해 대상에 CPU와 OS에 맞는 네이티브 코드가 생성이된다.


그러면 실행 속도가 빨라지고 메모리 사용량 역시 감소 한다.


이미지 출처 : https://www.slideshare.net/AlexThissen/net-core-new-platform-bern-lucerne-2016-final



자세한 사용 방법 및 내용은 아래 출처 참고

https://blogs.msdn.microsoft.com/dotnet/2014/04/02/announcing-net-native-preview/



참고 자료 : 크로스 플랫폼 개발을 위한 C#7 과 닷넷 코어 2.0 책


Posted by 꿈만은공돌
,


.NET Framework(닷넷 프레임 워크)

 - 윈도우 전용

 - 다양한 기능과 확장을 지원


.NET Core(닷넷 코어)

 - 윈도우, 리눅스, macOS 에서 사용가능

 - 경량화 하여 매우 가볍움

 - Docker 사용 가능


Xamarin 

 - 모바일 환경에 제한된 기능

 - 안드로이드, IOS, 윈도우 모바일 등을 지원


공통적으로 .NET Standard Library 2.0 을 공유한다. 




출처 : 크로스 플램폼 개발을 위한 C# 7과 닷넷 코어 2.0 책, 

https://blogs.msdn.microsoft.com/cesardelatorre/2016/06/27/net-core-1-0-net-framework-xamarin-the-whatand-when-to-use-it/


Posted by 꿈만은공돌
,



int arr[10][30]; 와 같이 다차원 배열에 값을 -1이나 0으로 초기화 할때 for문을 이용할 수도 있지만 번거롭고 불편할 수 있다.

그럴땐 메모리를 특정 값으로 셋팅하는 memset() 함수를 이용하면 된다.


1
2
int arr[10][10];
memset(arr, -1sizeof(arr));




위와 같이 입력하면 -1로 해당 배열에 값을 초기화 할 수 있다.

배열에 인자들을 출력해보면 -1로 출력되는것을 볼 수 있다.

0으로 초기화 하고 싶으면 -1대신 0을 입력하면 된다.

Posted by 꿈만은공돌
,

1부터 n까지 합을 구하는 방법을 for문으로 하는 방식과 단순 재귀함수를 이용하는 방식을 이전 블로그(http://hijuworld.tistory.com/3)에서 다뤘는데 이번에는 분할 정복 방식을 이용해서 구하는 함수에 대해서 알아 보겠습니다.



1
2
3
4
5
6
7
8
int divSum(int n) {
    if (n == 1)
        return 1;
    if (n % == 1)
        return divSum(n - 1+ n;
    else
        return divSum(n / 2)*+ (n / 2)*(n / 2);
}
cs


1부터 n까지 합을 반으로 쪼개면 다음과 같습니다.

뒷부분에 공통적으로  이 개 존재합니다. 이를 하나로 묶으면


 이 공통적으로 존재하기 때문에 하나로 묶으면 아래와 같이 정리가 됩니다.





앞부분  은 처음 구하려고 한 1 부터 N까지에  절반인 1부터  까지의 합니다.


그래서 아래와 같은 점화식을 구할 수 있습니다.





해당 점화식을 코드로 옮긴 것은 위의 코드 입니다.


해당 함수의 빅오는  와 같습니다.

for문을 이용해서 합을 구하는 방식은 O(n) 입니다.

아래 코드를 가지고 테스트를 해보면 해당 분할 정복 방식이 코드는 복잡해 보이지만 속도 면에서는 월등히 압서는 것을 볼 수 있습니다.


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
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <time.h>
using std::cout;
using std::endl;
 
int divSum(int n)  //분할 정복 방식
{
    if (n == 1)
        return 1;
    if (n % == 1)
        return divSum(n - 1+ n;
    else
        return divSum(n / 2)*+ (n / 2)*(n / 2);
}
int forSum(int n) // for 이용 방식
{
    int sum=0;
    for (int i = 1; i <= n; i++)
        sum += i;
    return sum;
}
int main() {
    clock_t start, end;
    double result;
    //분할 정복 방식
    start = clock(); 
    divSum(200000000);
    divSum(200000000);
    divSum(200000000);
    divSum(200000000);
    divSum(200000000);
    divSum(200000000);
    divSum(200000000);
    end = clock(); 
    result = (double)(end - start);
    printf("분할정복 시간 측정 : %f\n", result);
 
    //for문 이용방식
    start = clock();
    forSum(200000000);
    forSum(200000000);
    forSum(200000000);
    forSum(200000000);
    forSum(200000000);
    forSum(200000000);
    forSum(200000000);
    end = clock();
    result = (double)(end - start);
    printf("for 시간 측정 : %f\n", result);
    return 0;
}
cs


-실행 결과 - 

분할정복 시간 측정 : 0.000000

for 시간 측정 : 2746.000000

계속하려면 아무 키나 누르십시오 . . .


측정 결과를 보면 분할정복 방식은 1ms 미만이라 0으로 나오며 for문을 이용한 방식은 2746ms로 시간차이가 많이 나는 것을 알 수 있습니다.


많은 양의 숫자를 더할때는 분할 정복을 이용하는 것을 추천 합니다.



참고 서적 : 프로그래밍 대회에서 배우는 알고리즘 문제해결전략 (저자 구종만 지음, 인사이트 출판)


Posted by 꿈만은공돌
,