“우리 대부분은 초라한 옷차림과 엉터리 가구들을 부끄럽게 여기지만, 초라한 생각과 엉터리 철학을 부끄럽게 여길 줄 알아야 한다.” – Albert Einstein

19800103
csharp

– xml 기본적인 내용

html처럼 태그를 사용하여 데이터를 구조화 할 수 있는 마크업 언어. 텍스트로 되어있어 사람도 읽을 수 있고 임의의 태그를 지정 할 수 있어서 확장성이 좋다. 다른 시스템끼리 데이터를 주고 받기가 쉽다.

– using

파일이나 폰트의 경우 사용후 데이터 해제를 직접 해줘야 하지만 using 문을 사용하면 자동으로 해제해 준다.

// 비사용시
Font font1 = new Font("arial", 10.0f);

// 처리

if(null != font1)
    ((IDisposable)font1).Dispose();

// 사용시
using(Font font1 = new Font("arial", 10.0f)) {
    // 처리
}

– cpp c# 장점

c#

컴파일시 il(Intermediate Language)로 컴파일되어 플랫폼 상관없이 JIT 컴파일러만 있다면 어디서든 실행 할 수 있다.

보다 발전한 인텔리센스. cpp도 인텔리센스를 지원하지만 한계가 있다. c#은 cpp의 비쥬얼 어시스트와 비교해서 손색이 없다.

안정성. 강제로 사용하지 않는 이상 포인터를 사용할 일이 없으며 이로 인해 런타임중 메모리를 침범하거나 오류가 발생할 상황이 적어진다.

cpp

컴파일이 완전히 기계어로 되기 때문에 c#과 같이 중간과정이 없어 속도가 빠르다.

더 나은 퍼포먼스. c#은 편의성과 안정성을 중시하기 때문에 프로그래머에게 모든 것을 맡기는 cpp보다 성능면에서 떨어진다.

포인터 사용가능. 주소를 직접 접근 하기 때문에 단점 일 수도 있으나 정확히 사용만 한다면 속도가 빠르다.

– serialization?

클래스를 파일이나 db 형태로 저장하는 것을 말함. c#은 xml, soap, binary serialization을 제공

xml 방식은 public class의 public 멤버만 저장하며 이를 shallow serialization 이라고 한다. deserialization을 위해 빈 parameter constructor가 필요.

SoapFormatter 방식은 웹 서비스를 통해 데이터를 주고 받을 때 많이 사용되며 class에 [Serializable()]이라는 attribute을 붙여야 한다. xml 방식과 달리 모든 멤버를 serialize 한다. generic 형은 저장 할 수 없다.

BinaryFormatter 방식은 .net에서만 사용되며 타 시스템과 호환성이 없다. class에 [Serializable()]이라는 attribute을 붙여야 한다. 속도는 다른 방식에 비해 빠르며 generic 형도 저장 할 수 있다.

– attribute?

메서드나 필드 같은 대상 요소에 특성을 지정하는 것. Obsolete 특성을 지정해서 메서드가 곧 사라질 것이라고 알리거나 클래스에 Serializable 특성을 지정해서 해당 클래스를 직렬화 할 수 있게 만들거나 조건을 정의해서 해당 함수 실행 여부를 조작하거나 외부 DLL에 있는 함수를 사용 할 수 있다. 미리 정의된 시스템 정보나 사용자 지정 정보를 대상 요소와 연결 하는 것으로 대상에는 어셈블리, 클래스, 생성자, 대리자, 열거형, 이벤트, 필드, 인터페이스, 메서드, 파일 실행 모듈, 매개 변수, 속성, 반환 값, 구조체 또는 다른 특성이 있습니다.

클래스의 일종으로 Conditional, DllImport, Custom attribute로 나누며, 해당 클래스나 멤버에 속성을 지정한다. Conditional의 경우 ifdef처럼 define 되어 있으면 해당 함수나 실행하며 정의 되어 있지 않으면 실행하지 않는다. DllImport의 경우 닷넷 프레임워크 이외의 dll 코드를 사용할 수 있게 해준다.

– abstract 클래스와 interface 차이

abstract 클래스는 abstract 함수가 포함된 클래스이며, interface는 abstract 함수로만 구성된 클래스 각각 해당 키워드를 붙여서 만든다.

– nullable?

int? aaa = null; // 이런식으로 사용

기존 값 타입에 null도 할당 가능

– cpp와 컨테이너 비교 ( c# – cpp )

List – std::vector

Dictionary<TKey, TValue> – hash_map<Key, Data> (비표준)

HashSet – hash_set (비표준)

SortedDictionary<TKey, TValue> – std::map<Key, Data>

SortedList<TKey, TValue> – std::vector와 동일하지만 요소 추가시 이진 탐색 + 삽입을 해야됨

SortedSet – std::set

Queue – std::queue

Stack – std::stack

LinkedList – std::list

– Hashtable

non-generic

key와 value 모두 object형으로 입력 받는다

자료 입력시 boxing, 꺼낼때(꺼내서 값 타입에 할당 할 때) unboxing 일어남

– Dictionary

hash 기반 맵

generic

key와 value 모두 strong형만 가능

struct도 strong형이기 때문에 key로 사용가능

object형을 사용하지 않기 때문에 boxing 없음

– 상속을 막는 방법

sealed 키워드를 지정해서 해당 클래스의 상속을 막는다.

– struct와 class의 차이?

c#에서는 struct는 상속이 불가능하며 값 호출로 전달되고 stack에 저장 됨. class는 이와 반대

– 네임스페이스 중복시 특정 스페이스 지정하기

using Random = UnityEngine.Random;

– boxing, unboxing?

간단히 말해 값 형식의 변수를 보고 참조 형식의 변수를 새로 만들어 값을 할당하는 것.

값 형식 변수를 object 형 변수에 할당하면 암시적으로 boxing 진행.

변수를 새로 만들기 때문에 boxing된 변수의 값이 변하더라도 원본의 값은 변하지 않음.

unboxing은 이와 반대의 작업을 하는 것을 의미하며 할당시 명시적으로 해야 됨.

– 한정자의 차이점?

public : 모든 외부 객체로부터 접근을 허용한다

protected : 상속되는 파생클래스(derived class)에서만 접근할 수 있다

private : 해당 클래스 내에서만 사용된다. 외부 혹은 파생클래스에서 접근 불가

internal : 어셈블리(.NET Assembly)내에 있는 다른 클래스들에서 접근할 수 있다

한 어셈블리의 internal class를 다른 어셈블리 DLL에서 호출하여 사용할 수 있는가? 있다면 어떻게 할 수 있는가?

가능하다. 한 어셈블리에 InternalsVisibleTo 속성(Attribute)를 지정하여 다른 어셈블리의 접근을 허용하면, 지정된 다른 어셈블리에서도 외부의 internal 클래스를 사용할 수 있다. Test Automation 프로그램에서 특히 많이 사용한다.

– 예외처리?

C#에서 try…catch…finally 블럭은 예외(Exception)가 발생했을 때, 지정된 예외처리를 실행하는데 사용된다. try블럭에서 예외가 발생하면 catch블럭이 있는 경우 catch 블럭을 실행한다. catch블럭은 특정 Exception별로 다르게 처리하기 위해 여러 catch블럭을 둘 수 있다. finally블럭은 예외가 발생하든 하지 않든 상관없이 반드시 마지막에 실행하게 된다. 즉, 예외가 발생하지 않은 경우는 try블력과 finally블럭이 실행되고, 예외가 발생한 경우는 try블럭, 해당 Exception을 처리하는 catch블럭, 그리고 finally블럭의 코드가 실행된다.

– string? string builder?

string변수 s에 숫자를 추가할 때, 해당 변수 s의 값을 수정하는 것이 아니라 별도의 새 string객체를 만들고(물론 이름은 s로 똑같지만 Heap상의 메모리는 다르다) 이전 s의 문자값을 새로운 문자열 객체에 복사하게 된다는 점이다. 이러한 새 객체 생성및 기존 데이타 복사가 루프에서 만번 일어 나기 때문에 성능은 저하되고 필요 이상의 많은 메모리를 쓰게 된다.

이러한 문제점을 막기 위해 string 대신 StringBuilder를 사용한다. StringBuilder는 새로운 객체를 생성하지 않고 자신의 내부 버퍼 값만 변경함으로써 값을 추가하게 된다. 따라서 불필요한 객체 생성과 매번 일어나는 데이타 복사 과정이 없어지게 된다. (주: StringBuilder도 해당 객체의 버퍼 용량(Capacity)을 넘는 데이타가 들어올 경우 새로운 버퍼를 현재 Capacity의 2개 크기로 재할당하고 기존 데이타를 복사하게 된다.)

– abstruct? sealed?

추상클래스(Abstract Class)란 클래스가 완전하게 구현되어 있지 않아 해당 클래스로부터 객체를 생성할 수 없는 클래스를 가리키며, 일반적으로 다른 파생클래스의 기본 클래스로 사용된다. 추상클래스는 하나 이상의 abstract 메서드를 갖는다.

봉인클래스(Sealed Class)는 해당 클래스로부터 다른 파생클래스를 생성할 수 없는 클래스를 말한다. 봉인클래스는 C#에서 sealed라는 키워를 class앞에 붙여 만들며, 기본클래스/추상클래스가 될 수 없다.

– Debug? Trace?

System.Diagnostics.Debug클래스와 System.Diagnostics.Trace클래스는 프로그램 실행중 중요한 디버깅 혹은 디테일정보를 출력하기 위한 클래스들이다. 차이점은 Debug 클래스는 Debug빌드에서만 작동하고, Trace는 Debug 빌드와 Release 빌드 모두에서 작동한다는 점이다.

csharp에 댓글 닫힘 | cat > 사락사락