프로그래밍 관련 정보들

[ 관련 글 시리즈 보기 ]

상위 문서: [Software 개발] - 프로그래밍 관련 정보들

관련 문서:

[손으로는 IT] - Java 프로그래밍

[Software 개발] - C# vs JAVA - 1~5

[손으로는 IT] - Web 작업 관련 정보 모음

 

배경화면용: 네덜란드

 

Visual Studio

경험상 win10와 vs깔려면 os공간 최소 41-56G는 필요하다

 

C#

Scope

웹폼과 MVC비교
    http://blog.jakeymvc.com/five-reasons-to-use-mvc/
    mvc는 10 December 2007에 등장했따 현재버전 MVC6

c#에서 public readonly fields가 가능하여
    java처럼 getter만 추가하는식보다 쓰는면에서 간편할수있다.
    그런데 client입자에서 이게 readonly 인지 아닌지가 명시가안되는 단점일지도?

C#의 경우 Private method naming convention처럼 public과 private을 구분하는 명명법은 바람직하다

delegate와 event

C#의 delegate와 event는 콜백 처리를 간단하게 포장한 것이며, 실체는 Observer 패턴을 활용하는 함수자다.

데이타 타입

http://www.csharpstudy.com/CSharp/CSharp-datatype.aspx

C# 데이타 타입은 컴파일 후 .NET 데이타 타입으로 변경하게 된다.

숫 자형 데이타 타입의 최대값 혹은 최소값을 알아내기 위해서는 .NET 데이타 타입 클래스들의 MaxValue, MinValue 프로퍼티를 사용한다. C# 데이타 타입 키워드 뒤에서도 이러한 프로퍼티를 직접 호출할 수 있다. 즉, int.MaxValue 혹은 Int32.MaxValue 처럼 사용할 수 있다.


ASP, ASP.net 차이점을 설명

이 둘은 완전히 다른언어임.. 이름으로 혼동하지 말자!

ASP는 인터프리터 방식.

ASP.net은 컴파일러 방식.

C/C++

C++가상함수

핵심은 이렇다.

Super클래스에서 가상함수를 호출하면 Sub클래스에서 오버라이딩했을때는 Sub클래스의 함수가 불려집니다.

즉, Super클래스가 Sub클래스의 함수를 부른다는 것이죠. 가상함수로 하지 않으면 Super클래스에서 새로 정의한 Sub클래스의 함수를 부를 방법이 없습니다. 

class B : A  일때

즉 A aa = new B();

aa.print(); 하면
B의 print()가 불리는것임.

 

이렇게 하는 이유!는

factory pattern처럼 객체생성을 다른데 위임하거나 분기할경우이다.

new B로 할수도있고, new A(), new C()등 문맥에 맞게 일단 생성시킨후,

구현쪽에서는 그에 무관하게 다 aa.print()로 호출시키고 실제 내부 로직은 각 class에 맞게 내부적으로 분기되어 일을 수행하게끔하는것이다.

 

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=70009649

 

기타

디스크 용량 구하는 방법 API GetDiskFreeSpaceEx

 

http://digipine.com/1599

 

VC 에서 extern "C"를 선언, 실행, 되는 예를 한번 들어주세요.

간단하게 아래와 같은 프로그램이 있다고 할 때
( 파일 확장자는 .cpp로 하여 CPP style로 compile 해야 합니다. )

add_1(), fadd_2(), add_3() 가 compile되어 어떻게 이름이 바뀌는지 보면
왜 extern "C" 가 필요한지 알 수 있습니다.




#include "stdio.h"

int add_1(int a, int b);
float fadd_2(int a, int b);
extern "C" int add_3(int a, int b);

int main()
{
int a = 2, b = 3;
int c;
float fc;

c = add_1(a, b);
fc = fadd_2(a, b);
c = add_3(a, b);

return 0;
}

/********* 시험삼아 여기를 막는다
int add_1(int a, int b)
{
return a + b;
}

float fadd_2(int a, int b)
{
return (float)(a + b);
}

int add_3(int a, int b)
{
return a + b;
}
********/

################### compile/link 결과 ###############################

naver.obj : error LNK2001: unresolved external symbol _add_3
naver.obj : error LNK2001: unresolved external symbol "float __cdecl fadd_2(int,int)" (?fadd_2@@YAMHH@Z)
naver.obj : error LNK2001: unresolved external symbol "int __cdecl add_1(int,int)" (?add_1@@YAHHH@Z)

compile/link 하면 위와 같이 link error가 발생합니다.

자세히 보면
add_1 -> ?add_1@@YAHHH@Z
fadd_2 -> ?fadd_2@@YAMHH@Z
add_3 -> _add_3
와 같이 compile과정에서 이름이 바뀌어집니다.
add_1(), fadd_2()는 CPP style의 decorated name(?) 으로 바뀐 것이며
add_3()는 prototype에서 extern "C" 를 주었으므로 C style로 '_'만 앞에
붙은 것이 차이점입니다.

이상의 실험에서
CPP는 argument, return value에 따라 이름을 바꾸게 하여 반드시 protype과 일치하는 function이 link되도록 합니다. argument가 틀린 경우에는 같은 이름의 function이 여러개 존재할 수 있으며 argument에 따라 적당한 function이 link됩니다.
C는 단순히 이름앞에 '_' 만 추가되므로 argument가 틀리던 return value type이 틀리던 link는 될 수 있습니다. 심하게 잘못되면 compile/link는 되는데 오동작을 할 수도 있겠지요.

이렇게 같은 이름의 function이라도 C style, CPP style로 compile되면서
이름이 바뀌므로 C에서 CPP로 작성된 function을 참조하거나 CPP에서 C로
작성된 function을 참조할 수가 없습니다.
이럴때 extern "C" 를 사용하여 CPP에서 정의/참조 되는 function 이름을 C style로 강제로 바꾸는 것입니다.
보통 *.h file에 아래와 같이 하여 *,c, *,cpp 에서 공용할 수 있는
protype 선언을 합니다.

#if defined(__cplusplus)
extern "C" {
#endif

int func1();
int func2();
.
.
.

#if defined(__cplusplus)
};
#endif

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=65467503

+ Recent posts