1. 델리게이트 (delegate )



- 사용자 정의형

- 대리자

- C, C++의 함수포인터와 동일한 기능


어떤 일을 대신 해주는 사람 이라고 생각하자.



예시)


// 매개변수로 string type의 값을받으며 반환은 하지 않는 함수를 대리하는 Log_Event라는 이름을 갖는자료형을 정의

public delegate void Log_Event(string msg);


// func라는 함수가 있다. string을 입력받으며 입력받은 값을 콘솔창에 출력하여 준다.

public void func( string msg )

{

    Console.WriteLine("{ 0 }", msg); 

}


// Log_Event형 log_msg라는 변수를 생성.

public Log_Event log_msg;


// log_msg가 func를 앞으로 대신하여 줄 것이다.

log_msg = func;


// func의 기능을 대신하여 준다. 따라서 입력값을 콘솔창에 출력해준다.

log_msg("text");



- delegate는 반드시 메서드를 참조 시켜야 한다.

- 또한 정의한 형식에 맞아야 한다.



- += 연산자를 통하여 1개의 delegate 변수에 여러 메서드를 참조 시킬 수 있으며 호출은 
  참조 순서대로 호출 된다. 이것을 델리게이트 체인 이라고 한다.

- -= 연산자를 통해 참조했던 함수를 더이상 참조하지 않겠다는 의미로 사용 할 수 있다.











2. 이벤트 ( Event )


- 델리게이트를 통하여 구현


- 하나의 이벤트는 여러개의 작업들이 추가 될 수 있어야 한다.


- 어떤 사건이 일어났을때 특정 함수나 작업을 수행 하는 것.


- 이벤트는 Delegate를 캡슐화 시킨것이라고 생각하자!!


사용 절차 )


1. 델리게이트 선언


2. 클래스 내에 선언한 델리게이트의 선언 앞에 event 한정자를 수식


3. 메소드 형식과 일치하는 이벤트 핸들러 작성


4. 인스턴스 생성 후 3번에서 작성한 이벤트 핸들러 등록


5. 이벤트 발생 -> 이벤트 핸들러 호출





3. 델리게이트 와 이벤트 차이 



Delegate는 클래스 외부에서 임의로 직접 사용 가능

Event는 외부에서 직접 이벤트를 임의로 일으킬 수 없음.







Singleton이란?


객체의 인스턴스가 하나만 만들어 질 수 있고, 어디서든 인스턴스에 접근 할 수 있도록 하는 디자인 패턴




싱글톤에서의 객체의 인스턴스는 반드시 하나만 존재하게 된다. ( 외부에서 인스턴싱 X, 생성자가 private )

또한 이 인스턴스는 전역적으로 접근 할 수 있다.




자 그럼 이제 어떻게 구현하는지 알아보자.



1. 기본형 ( 멀티스레드 환경에서 안전하지 않음, 멀티스레드 환경에선 가급적 사용 X )



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public sealed class Singleton
{
    private static Singleton instance;
    private Singleton()
    {
    }
 
    public static Singleton GetInstance()
    {
        
        if (instance==null)
        {
            instance = new Singleton();
        }
        return instance;
        
    }
}




- 생성자를 private으로 생성하여 외부에서 생성자 호출 X

- GetInstance() 함수를 통하여 반환된 인스턴스 사용

- staitc 인스턴스변수 







2. 스레드 동기화 형




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public sealed class Singleton
{
    static Singletone Instance;
    static readonly object sync = new object();
 
    private Signeton()
    {
    }
 
    public static Singleton GetInstance()
    {
       lock(sync)
       {
          ifnull == instance )
          {
              instance = new Singleton();
          }
          return instance; 
       }
 
    }
 
}




- 한 스레드가 인스턴스에 대한 접근을 끝내기전까지 다른 스레드는 대기상태여야 한다.





2019년 3월 12일


infragistics 라이브러리, EZSoft 라이브러리 등 관련 라이브를 설치하면, Help에서 Sample, 사용법 등을 지원해준다. 구글링하여 찾는 것도 좋지만

사용법을 먼저 참고할수 있도록

'일반 > 개인일지' 카테고리의 다른 글

2019년 5월 28일 개인일지  (0) 2019.05.28
2019년 4월 11일 개인일지  (0) 2019.04.11
개인일지  (0) 2019.02.27


함수오버로딩에 대하여 설명하여라

 

C++에서 함수호출 시 전달되는 인자를 통해서 호출하고자 하는 함수의 구분이 가능하기 때문에 매개변수가 다른 동일한 이름의 함수를 허용한다.

C의 경우 함수의 이름만으로, C++의 경우에는 함수의 이름과 매개변수로 함수를 구분

매개변수의 개수와, 자료형이 다른 같은 이름의 함수를 중복 정의 하는 것.

 

 

객체지향언어 vs 절차지향언어

 

절차지향언어 : 순차적 실행, 컴퓨터의 작업처리방식과 유사하여 객체지향보다 빠른 처리가능

계산중심언어, 함수가 중심이 되고, 데이터는 보조기능

 

객체지향언어 : 실제 세계를 모델링 또한 추상화, 캡슐화, 상속, 다형성의 특징

 

- 추상화 : 불필요 정보는 숨기고 중요 정보만을 표현

- 캡슐화 : 코드 재활용 목적, 캡슐화를 지켜야 상속과 다형성이 성립

- 상속 : 하나의 클래스가 가지고 있는 특징을 그대로 다른 클래스에게 물려줌

- 다형성 : 하나의 변수에 여러 종류 데이터를 대입 할 수 있는 성질

 

변수와 메모리에 대해서

 

프로그램을 실행시키면 운영체제는 우리가 실행시킨 프로그램을 위해 메모리 공간을 할당 해준다. 메모리 공간은 스택, , 데이터 영역으로 나누어 진다.

 

데이터 영역 -> 전역변수와 STATIC 변수가 할당되는 영역, 프로그램 시작과 동시 할당

되고, 프로그램이 종료 되어야 메모리에서 소멸

 

스택 영역 -> 함수 호출시 생성되는 지역변수와 매개변수가 저장되는 영역, 함수 호출시 사라짐

 

힙 영역 -> 필요에 의해 동적으로 메모리를 할당 할 때 사용

할당해야 할 메모리의 크기를 프로그램이 실행 동안 결정해야 하는 경우 유용하게

사용 되는 공간이다.

Call by Value Call by Reference에 대해 설명하여라

 

Call by Value :

우리말로하면 바로 "값에 의한 호출"이란 뜻으로, 어떤 함수를 호출할때에 전달인자로 그 데이터 값 자체를 전달하는 호출 방법이다

Swap의 예로 함수가 끝날 때 stack의 값도 날아가므로 값을 바뀌지 않음.

 

Call by Reference :

우리말로 "참조에 의한 호출"라는 뜻으로, 어떤 특정한 데이터 값이 아닌 그값에 대한 정보를 전달하는 호출방법이다. 주소(값에 대한 정보)를 매개 변수로 전달하여 swap

실제 값이 변경 된다.

 


 

깊은 복사와 얕은 복사에 대해서 설명하라

 

디폴트 복사 생성자는 멤버 대 멤버를 단순히 복사만 하므로, 문제가 된다.

포인터 멤버 변수의 경우 복사 생성된 객체의 변수의 포인터 또한 동일하기 때문.

이는 하나의 변수를 두 개의 객체가 참조하는 꼴을 만든다.

이후에 객체를 소멸할 때 문제가 발생 한다.

따라서 깊은 복사의 코드로 복사생성자를 구현을 해주어야 한다.

 

 

오버라이딩에 대해서 설명하여라.

 

오버라이딩(Overriding)이란 상위 클래스에 있는 메서드와 똑같은 메서드를 하위 클래스에서

재정의 하는 것을 말한다.

 

 

연산자 오버로딩

 

멤버함수에 의한 연산자 오버로딩 :

다항 -> pos1.operator+(pos2)와 같은 방식

단항 -> pos.operator++()와 같은 방식

 

전역함수에 의한 연산자 오버로딩 :

다항 -> operator+(pos1,pos2)와 같은 방식

단항 -> operator++(pos)와 같은 방식

전위 -> pos.operator++() // 후위 -> pos.opertator++(int)

동시 오버로딩 될 경우 멤버함수가 우선시 되어 호출.


Static

 

전역 변수에 선언된 static의 의미

: 선언된 파일 내에서만 참조를 허용하겠다는 의미

 

함수 내에 선언된 static의 의미

: 한번만 초기화되고, 지역변수와 달리 함수를 빠져나가도 소멸되지 않는다.

 

static 멤버 변수

: 클래스 변수라고도 한다. 메모리 공간에 딱 하나만 할당이 되어서 공유되는 변수.

멤버 변수 접근하듯 접근은 할 수있지만, 객체 내에 존재하는 것이 아니라, 객체 외부에 있 는 변수이다. 다만 객체에게 멤버변수처럼 접근 할 수 있는 권한을 줬을 뿐

ClassName::Val -> 와 같이도 접근 할 수 있다.(public의 경우)

 

static 멤버 함수

: 선언된 클래스의 모든 객체가 공유, public 선언시 이름을 통해 호출가능, 객체의 멤버로 존재 하는 것이 아니다.

 

의 할 것. 객체의 멤버가 아니기 때문에 함수 내에서 일반 멤버 변수의 값에 접근 하면 안됨

객체생성 이전에도 호출이 가능하기 때문에 static 멤버 변수만 접근 가능하다.

 

가상함수

 

C++ 컴파일러가 실제로 가리키는 객체의 자료형을 기준으로 하는게 아닌, 포인터 변수의 자료형을 기준으로 판단하기 때문에 실제로 가리키는 객체의 자료형에 따라 멤버 함수가 호출 되도록 해주는 장치.

 

한 개 이상의 가상함수를 포함하는 클래스에 대해서는 컴파일러가 가상 함수 테이블을 만든다.

가상함수 테이블을 keyvalue로 구성 되어있다.

keyvalue key는 호출하고자 하는 함수, value는 주소정보를 알려주는 정보이다.

무조건 가장 마지막에 오버라이딩을 한 자식 클래스의 멤버함수가 테이블에 포함 된다.

 

클래스에 가상 함수가 포함되면 가상함수 테이블이 생성되고, 이 테이블을 참조하기 때문에

실행 속도가 감소 한다. 하지만 미미 한 정도이다.

 

순수가상함수

 

함수의 선언만 있고 정의는 없는 것으로, 자식 클래스에서 반드시 재정의 해주어야 하고 뒷 부분에 =0을 덧붙여 인스턴싱 할 수 없도록 만드는 장치. 순수 가상 함수를 포함하는 클래스를 추상 클래스 라고 한다.

 

 

 

가상소멸자

 

상속을 받은 클래스의 생성과 소멸 과정을 보자. 생성자는 부모 클래스의 생성자가 먼저 불려지고, 소멸자는 자식 클래스의 소멸자가 먼저 불려지고 나서 부모 클래스의 소멸자가 불려진다. 그런데 다형성 이용을 위해 부모 클래스의 포인터로부터 자식 클래스를 호출할 때, 가상 함수로 정의되지 않은 자식 클래스의 오버라이딩된 함수를 호출하면 부모 클래스의 멤버 함수가 호출된다. 소멸자도 자식 클래스에서 오버라이딩된 함수라고 볼 수 있기 때문에 만약 부모 포인터로 객체를 삭제하면 부모 클래스의 소멸자가 호출된다.

따라서 소멸자를 가상 함수로 선언하지 않으면 이 경우 자식 클래스의 소멸자는 결코 호출되지 않는다. 가상 함수 키워드 virtual이 사용되었다면 이것은 자식 클래스에서 재정의될 수 있음을 명시하기 때문에 포인터의 종류에 상관없이 항상 자식 클래스의 메서드가 호출된다. , 자식 클래스의 소멸자가 호출되고 나서 부모 클래스의 소멸자가 호출된다.

따라서 상속 관계가 있고 소멸자에서 리소스를 해제해야 하는 경우 반드시 소멸자를 가상 함수로 선언해야 한다.

 

 

대입연산자

 

복사생성자와 마찬가지로 동적 할당으로 인해 깊은 복사가 필요 할 때 프로그래머가 구현

A a;

A b;

a = b; 와 같이 이미 생성 및 초기화가 진행된 객체를 대상으로 operator=를 호출하여

대입 하는 경우를 말한다.

 

자식클래스의 대입연산자를 정의해야 하는 상황에 놓이게 되면, 부모 클래스의 대입연산자를 명시적으로 호출해야 한다.


스마트포인터

 

똑똑한 포인터의 역할을 하는 객체

적은버그, 자동청소, 자동 초기화, 댕글링포인터 등에 대한 이점이 있다.

unique_ptr : 소유권을 독점하기 때문에 복사 생성이 안됨 그러나 이동은 가능(소유권 이전)

shared_ptr

 



 

형 변환 연산자

 

dynamic_cast

: 상속관계에 놓여 있는 두 클래스 사이에서 자식 클래스의 포인터 및 참조형 데이터를

부모클래스의 포인터 및 참조형 데이터로 형 변환 하는 경우

반대로, 다형적 변수의 경우 EX) base* a = new Sub; 의 경우

자식클래스의 포인터로 형변환 할 수 있다.

 

static_cast

: A에서 B타입으로 바꿔주는 형변환 연산자, 그러나 책임을지지(런타임 타입검사 X) 않는다.

void 포인터를 다른 타입의 포인터로 변환 가능, 상속 관계 게층 간 변환 가능

실수형과 정수형 등 기본 데이터 타입간 변환 가능.

 

const_cast

: const를 제거 하는 용도로 쓰인다.

 

reinterpret_cast

: C스타일의 캐스팅과 가장 비슷한 기능을 한다. 런타임 오류가 나는 것처럼 컴파일러가 뒷감당을 해주지 않기 때문에 최대한 사용하지 않는 것이 좋음

 

volliatile

 

외부적인 요인으로 해당 값이 언제든지 바뀔 수 있음을 뜻한다. 해당 변수에 대해서는

최적화를 수행하지 않는다.


싱글톤 패턴에 대해 설명하시오

 

하나의 인스턴스만을 생성하고 사용 할 수 있다.

 

생성자를 private으로 두고. 자기 자신을 얻는 함수를 만들어 미리 만들어 두었던

자기 자신 객체를 반환 하는 방법으로 사용.

 

프로그램 내에 단 하나만 존재해야 하는 객체가 필요 할 때 사용

 

단점 : 객체가 static으로 선언되기 때문에 싱글톤 객체를 사용하지 않더라도

일단 메모리에 올려두기에 메모리 낭비가 될 수 있다.

 

 

제네릭 프로그래밍이란 무엇인가?

 

데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는

기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식으로 템플릿은 STL 제네릭

프로그래밍의 핵심이다.

 

 

 

함수객체

 

함수호출연산자를 오버로딩 하여 객체가 함수처럼 동작하도록 구현 한 것

함수와 달리 객체를 사용하면 속성을 지닐 수 있는 것이 가능하고, 함수 객체가

일반적인 함수보다 ᄈᆞ르기도 하고 각각의 함수객체는 서로 다른 타입을 지닌다는 장점을 가진다.



'프로그래밍 > C++언어' 카테고리의 다른 글

환형 연결리스트  (0) 2019.02.05


 

메모리 단편화에 대해 설명하시오

 

 

메모리 단편화란?

- 메모리의 빈공간 또는 자료가 여러개의 조각으로 나뉘는 현상이다. 쉽게 말해 할당한 메모리를 해제를 하게되면 그 메모리공간이 빈공간(사용하지않는 공간)이 되고 그 빈공간의 크기보다 큰 메모리는 사용 할 수 없다. 그리하여 이 공간들이 하나둘 쌓이게되면 수치상으로는 많은 메모리공간이 남았음에도 불구하고, 실제로 사용 할 수 없는 메모리가 발생한다.

 

 

내부단편화(Internal Fragmentation)

 

- 분할된 영역이 할당된 프로그램의 크기보다 커서 사용되지 않고 남아 있는 빈 공간

ex) 메모장을 생성해서 아무것도 치지 않고 공백인 채로 속성을 확인해보면?

실제 용량은 1kb도 안되는데 4kb로 할당되는 것과 같은 현상

 

 

외부단편화(External Fragmetation)

 

- 분할된 영역이 할당될 프로그램의 크기보다 작아서 할당할 수 없어 모두 빈 공간으로 남아 있는 전체 영역

ex) 일반적으로 응용프로그램은 메모리를 연속적으로 할당하므로.. 연속적으로 할당될 그 크기보다 작은 곳에는 할당 될 수가 없다.

 

- 해결방법 -

메모리 압축 : 디스크 조각 모음

 

메모리 통합 : 단편화가 발생된 공간들을 하나로 통합시켜 큰 공간으로 만드는 기법

 

세그멘테이션 : 가상기억장치(가상메모리)를 서로 크기가 다른 논리적 단위인 세그먼트로 분할하고 메모리를 할당하며 주소변환을 하는 기법이다. 세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법에서처럼 미리 크기를 잡아둘 수 없고, 메모리에 적재될 때 빈공간을 찾아 할당하는 사용자 관점의 가상 메모리 기법이다. 내부단편화는 없지만 외부단편화가 발생한다.

 

 

페이징 : 페이징은 가상기억장치(가상메모리)를 모두 같은 크기의 블록으로 편성하고 이 일정한 크기인 블록을 페이지라고 한다. 주소공간을 페이지 단위로 나누고 실제 기억공간(RAM)은 페이지 크기와 같은 크기의 블록을 프레임으로 나누어 사용한다. 그리하여 사용하는 메모리는 프레임에 올리고 사용하지 않는 메모리는 페이지에 저장한다. 필요한 메모리는 페이지 단위로 프레임에 올리고 사용하지 않는 프레임은 페이지로 옮기는 기법이다. 외부단편화는 해결하지만 내부단편화가 발생한다.

 

 

 

 

스레드와 프로세스에 대해 설명하시오

 

프로세스

: 현재 실행중인 프로그램을 말하며 CODE, DATA, HEAP, STACK으로 구성되어 있다.

 

스레드

: 프로세스 안에서 CODE, DATA, HEAP을 공유하고 STACK만 별도로 갖고 있다.

프로세스간 이동시에 비해 STACK만을 스위칭 하면 되므로 전환 속도가 빠르다.

스레드간 자원공유가 가능하여 편리하다, 반면 공유자원에 대한 관리 문제가 있다.

 

 

컨텍스트 스위칭에 대해 설명하시오

 

하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전 프로세스의 상태를 보관하고 새로운 프로세스의 상태를 적재하는 작업.

 

 

스레드 스케줄링, CPU 스케줄링

 

 

메모리 단편

커널에 대해서 설명하시오

 

 

커널은 운영체제의 핵심 부분으로 운영체제의 다른 부분 및 응용프로그램 수행에 필요한 여러 가지 서비스를 제공 한다. 커널에는 종료된 입출력 연산 등 커널의 서비스를 경쟁적으로 요구하는 모든 요청들을 처리하는 인터럽트 처리기와 스케쥴러, 수퍼바이저 등이 포험되어 있다.

메모리나 저장장치 내에서 운영체계의 주소공간을 관리하고, 이들은 모든 주변장치들과 커널의 서비스들을 사용하는 다른 사용자들에게 고루 나누어주는 메모리 관리자를 갖고 있다.

 

보안, 자원관리 추상화 등의 역할을 한다.

 

 

 

사용자 수준 스레드 vs 커널 수준 스레드

 

 

1. 커널 모드와 유저 모드

 

-메모리 영역은 사용자에 의해서 할당되는 메모리 공간인 유저 영역과 운영체제라는 하나의 소프트웨어를 실행시키기 위해서 필요한 메모리 공간인 커널 영역으로 나뉜다.

 

-사용자가 사용하는 메모리 영역은 유저 영역이지만 C언어는 메모리 참조가 용이하기 때문에 안정성 제공 측면에서 커널 모드와 유저 모드가 사용된다.

 

-기본적으로 유저 모드로 동작하다가 Windows 커널이 실행되어야 하는 경우에 커널 모드로의 전환이 일어난다.

 

-커널 모드와 유저 모드의 차이는 유저 모드에서 동작할 때 커널 영역으로의 접근이 금지된다. 커널 모드일 때는 모든 영역의 접근이 허용된다.

 

 

 

 

-Windows 에서 운영체제 차원에서 제공되는 시스템 함수들 중 일부는 호출시 커널 모드로 동작한다.

 

-주의할 점은 모드의 전환은 시스템에 부담을 준다.

 

-커널 모드와 유저 모드를 제공하는 대상은 Windows운영체제가 아닌 프로세서(Process)이다. 즉 메모리 보호 기능이 CPU에 달려있다.

 

 

 

 

2. 커널 레벨 쓰레드와 유저 레벨 쓰레드

 

-커널 레벨 쓰레드와 유저 레벨 쓰레드는 생성 주체가 누구냐에 따라 구분된다.

 

-프로그래머 요청에 따라 쓰레드를 생성하고 스케줄링하는 주체가 커널이면 커널 레벨(Kernel Level) 쓰레드라고 한다.

 

-커널이 쓰레드 모델을 지원하지 않거나 제공하는 쓰레드 모델이 마음에 들지 않을 경우, 커널에 의존적이지 않은 형태로 쓰레드의 기능을 제공하는 라이브러리를 활용할 수 있는데 이러한 방식으로 제공되는 쓰레드가 유저 레벨(User Level) 쓰레드이다.

 

-커널 레벨 쓰레드의 장점은 커널이 직접 제공해 주기 때문에 안정성과 다양한 기능이 제공된다.

 

-커널 레벨 쓰레드의 단점은 유저 모드에서 커널 모드로의 전환이 빈번하게 이뤄져 성능 저하가 발생한다.

-유저 레벨 쓰레드의 장점은 커널은 쓰레드의 존재조차 모르기 때문에 모드 간의 전환이 없고 성능 이득이 발생한다.

 

-유저 레벨 쓰레드의 단점은 하나의 스레드가 커널에 의해 블로킹 되면 프로세스 전체가 블로킹되고, 이를 해결하려면 프로그래밍이 어려워지고 커널 레벨 쓰레드에 비해 결과 예측이 어려워진다



'프로그래밍 > 운영체제' 카테고리의 다른 글

[2] 운영체제 소개  (0) 2019.02.07
[1] 컴퓨터 시스템 소개  (0) 2019.02.07
쓰레드란?  (0) 2019.02.05



TCPUDP의 차이점을 설명하라

 

TCP = 연결지향형 전송규약으로 연결 설정 후 통신 가능

데이터를 재전송하여 신뢰성 있는 데이터 전송

일대일 통신, 데이터 경계 구분 X(바이트 스트림 서비스)

 

UDP = 비연결 지향형 전송규약으로 연결 설정 없이 통신 가능

데이터 재전송을 하지 않아 신뢰성이 떨어진다.

일대다 통신, 데이터 경계 구분(데이터 그램 서비스)

 

 

TCP/IP 프로토콜 구조

 

네트워크 접근 계층 : 물리적 네트워크를 통한 실제 송수신 담당

네트워크 하드웨어, 운영체제가 제공하는 장치 드라이버

하드웨어적으로 정의된 물리주소 사용

인터넷 계층 : 논리 주소인 IP주소를 사용하여 데이터를 목적지 호스트 까지 전달

전세계적으로 유일성 보장

라우팅) 데이터를 목적지 까지 전달하는 작업

전송 계층 : 최종 통신 목적지를 지정하고 오류 없이 데이터를 전송하는 역할 포트 번호 사용

전송 계층에 해당하는 TCP/IP 프로토콜로는 TCP, UDP가 있다.

응용 계층 : 프로토콜을 사용하는 응용프로그램 포괄

 

 

SOCKET

 

1. 데이터 타입

2. 통신 종단점

3. 네트워크 프로그래밍 인터페이스

 

 

 

 

 

 

OSI 7계층

 

리계층 : 단말 시스템 간의 물리적 링크를 가동, 유지, 전기적, 기계적 기능적 절차 정의 계층

데이터링크 계층 : MAC 주소를 이용하여 호스트에서 다른 호스트로

네트워크 계층 : 두 단말 간의 논리적 주소로 경로 선택 및 라우팅 제공

트랜스포트 계층 : 신뢰성 있는 서비스 제공 하기 위해 논리적 연결 수행

세션 계층 : 두 응용프로그램 간의 연결 설정, 이용 및 연결 해제 등 대화를 유지하기 위한 수행

프레젠테이션 계층 : 데이터를 표준 포맷으로 교환, 암호화 복호화, 압축과 복원 수행

어플리케이션 계층 : 유용한 작업을 할 수 있도록 지원하는 계층

 

 

TCP 동작

 

1. Client

Socket함수를 통하여 소켓을 생성 후 Connect 함수를 통하여 연결 요청을 한다.

서버에서 승인이 되면 서버와 통신 후 소켓을 닫는다.

 

2. Server

Socket함수를 통하여 소켓 생성 후 Bind함수로 지역IP주소와 지역 포트번호를 결정

Listen 함수를 통하여 대기 상태로 변경 한다음. 클라이언트로부터 요청시

Accept 한 후 통신 후 소켓을 닫는다.

 

 

블로킹 소켓과 논블로킹 소켓

 

블로킹 소켓 : 버퍼의 여유공간 보다 작을 경우 프로세스는 대기 상태

크기만큼 데이터 복사가 일어난후 send가 리턴을 한다.

 

넌 블로킹 소켓 : 실제 복사한 만큼 바이트 수를 리턴 한다. 최소 1 최대 len


스레드 동기화 기법

 

임계영역(cs)

: 공유 자원에 대해 오직 한 스레드의 접근만 허용 한다.

( 한 프로세스에 속한 스레드 간에만 사용 가능 )

단점 :어떤 스레드가 먼저 진행 될지 모르기 때문에 프로그래머가 제어 불가능.

 

뮤텍스

: 공유 자원에 대해 오직 한스레드의 접근만 허용 한다. 대기열 구조

( 서로 다른 프로세스에 속한 스레드 간에도 사용 가능 )

 

세마포어

: 한정된 개수의 자원에 여러 스레드가 접근 할 때, 자원을 사용 할 수 있는

스레드 개수를 제한 한다.

세마포어 에서는 카운트가 하나씩 줄어들게 되며 리소스가 모두 사용중인 경우 카운트 0

그 다음 작업은 대기




'프로그래밍 > 네트워크프로그래밍' 카테고리의 다른 글

TCP / IP 란?  (0) 2019.02.05
2018-09-13

  SVN 커밋 할 경우에 항상 각 파일을 확인하자.
프로젝트 참조추가 부분을 수정후 커밋, 커밋을 하는 경우에서 svn은 수정되었다고 인지하여 커밋과정에서 프로그램이 정상적으로 돌지 않았음

2018-09-19

c++에서 _w로 시작하는 함수는 유니코드, _t로 시작하는 함수는 유니코드, 멀티바이트( 프로젝트 속성에 따라 변함), 동일한 부분은 변수로 뺄 것
구글검색시 MSDN을 보는 습관을 들여라,
꼭 돌려 보고 죽지 않도록 만들 것,
파일을 읽는 부분을 구현 할 경우, 파일 내용과 파일의 없을 경우를 대비 할 것
->  bool값을 읽을경우 true, false 의외의 값이 데이터 파일에 저장 될 수 있음
true, false의 경우 true를 제외한 나머지 값은 false로 읽도록 하게끔 만들어라
처음부터 완벽하려고 하지 말 것, 실행이 우선 리팩토링, 변수 정리는 구현하고자 하는 내용이 수행이 문제 없이 될 떄 할 것

2018-09-20

모든 변수는 초기화 할 것
문자열에선 가급적이면 비교연산자를 사용하지 않는다 -> 동작이 의도와는 다를 수 있음

2018-09-21

SVN 리비전 정보가 날라간 상황, SVN 서버상 버전은 #116 내 로컬 버전은 #119, 커밋을 하려고하니까 117,118을 찾는다, 그래서 되지 않음
이 방법을 해결 할 경우 SVN 서버 상의 #116을 커밋하고 #119버전에서 export 버튼을 눌러 #116에 덮어 씌운다. 그러면 체크아웃 받은 #116 버전은
파일이 내 로컬 버전과 일치하게 된다. 그 상태로 커밋을 하면 #118로 새로운 버전이 로드된다.

2018-10-19

UI를 만들때는 사용자의 편의를 고려 한다. 또한 UI의 기본성질을 고려하여 제작한다. 예를들어 경로를 입력하는
경우 경로외의 입력을 차단하여 준다. 숫자 입력의 경우 최저, 최대숫자를 입력 할 수 있도록하고 숫자를 제외한 나머지 문자는 입력불가능 하도록
수정 한다.

2018-11-01

옵션 값은 항상 min, max 값을 정하고 그 외의 값은 default 값으로 read, write가 되도록 하여라
작업자는 내 생각을 벗어난 자가 많다.

2018-11-13

내가 수정한 코드는 반드시 디버깅을 통하여 원하는 값이 들어가는지, 결과에 맞는 순서로 호출이 되는지 확인
Log를 통해 확인하는 습관을 들여라.
내가 생각하는 알고리즘도 좋다, 그러나 이미 작성된 프로그램의 경우 프로그램의 구조에 따라 좀 더 효율적인 방법이
있을수 있다. Single Cap -> Map Click
for문을 최소화 하는 방법이 있다면 써라 코드는 아래와 같다
 short[] arrayTray = null;

                if (0 == title.CompareTo("MODULE X1"))
                {
                    arrayTray = Map.csTRAY1;

                }
                else if (0 == title.CompareTo("CAP"))
                {
                    arrayTray = Map.csTRAY2;
                }
                else if (0 == title.CompareTo("UNLOADER X3"))
                {
                    arrayTray = Map.csTRAY3;
                }

                ////[2018-10-08 swkim]
                if (arrayTray != null)
                {
                    for (int index = 0; index < arrayTray.Length; index++)
                    {
                        arrayTray[index] = Tool.csEmpty;
                    }
                }

2018-11-14

특정 동작을 실행중일때 다른동작이 수행되면 안될경우 반드시 조건문으로 처리를 해준다.
예를들어서 장비가 가동중일때 reset 버튼을 누르면 안되기에 reset에서 프로그램이 정상작동중일때를 체크 한다.
체크옵션을 저장했을때 기존에 업데이트 되어야 하는 부분을 잘 생각하여 코드를 수정한다.
Ex) cap cleaner 사용 옵션에서 상태 정보를 바뀌었을때 출력되는 UI가 있다면 그 부분도 수정한다

2018-11-19

txt, ini 등의 레시피를 읽어오는 부분을 수정 할때에는 디버깅을 통해 정상적으로 값이 들어오는지를 확인한다.

2018-11-21

소프트웨어적인 버튼과 하드웨어적인 버튼에 대한 제어를 위해 현재 상태에 대한 변수가 필요하다.
프로그램상에서 현재 상태에 대한 것을 모르면 제한되는 부분이 많다.
로그를 남기는건 기본중에 기본이다 각함수 호출 순서라도 남기자

2018-12-14

Count을 하는 경우 Count상황과, max 카운트에 도달하였을때 0으로 reset 해주는 것을 잊지말자. 행업으로 이어졌다.
행업 -> 해당 코드에서 다음으로 넘어가지 않는 현상
내 생각 ? -> 교착상태, 해당 조건이 reset이 되지 않는 경우.

2018-12-18

에러코드 발생조건을 확인하지 않고, 에러코드 0에 새로운 에러메세지를 넣었다. 그러나
에러코드 발생조건중 errCode != 0이 아닐때 에러메세지를 출력하는 경우에 걸려 행업이 발생하였다.
발생조건 확인하자

2019-01-04

다국어번역 할 때, 컨트롤에 개수에 따라 단순 노가다가 더 빠를수 있다. 나같은 경우 UI상 모든 컨트롤을 찾아 content를 바꾸는 방법을 사용했지만,
canvas의 경우 header에 텍스트를 넣기 때문에 이를 생각하지 못해 더 어려움을 겪었다. 그리고 파일 변환시 언어가 깨질수 있으니
이를 대처하는 방법도 중요했다

2019-01-09

다국어 파일을 번역자에게 맡길때는 최신 파일인지 확인 할 것.
각 버튼 컨트롤의 이름은 중복이 되지 않도록 이름을 잘 넣어준다. 다국어 변환시 버튼 컨트롤의 이름을 Key로 사용 하였는데
동일한 이름을 가져, 같이 검색되었고 이름이 바뀌었다.

2019-01-25

Azin 관련 모터제어 함수는 펄스 출력시 반환과 펄스 완료시 반환이 있다. 펄스 완료에 대해서는 처리 할 필요가 없지만, 펄스 출력시에 대한 처리를 할 경우 해당 함수 완료에 대한 처리를 해주어야 한다 그렇지 않다면, 모터가 완전히 움직이지 않았는데 다른 일을 처리 할 경우가 생긴다.

2019-01-31

Muilti Thread를 사용 할때 CPU 점유율 문제로 프로그램이 효율적이지 못한 경우가 있다. 이럴때 Sleep을 조금씩 호출해주어
컨텍스트 스위칭이 일어 날 수 있도록 해준다.
 스레드 3개가 사용된다고 가정하자. 스레드 할당 시간은 총 10초이고, 스레드 1이 5초를 쓰면 스레드 2,3은 총 5초밖에 사용 할 수없다.

2019-01-31

실린더 관련하여 제어를 할 경우 실린더가 정상적으로 동작하고 관련 센서가 켜졌을떄 유지되는 시간을 통해 비교를 하자


'일반 > 개인일지' 카테고리의 다른 글

2019년 5월 28일 개인일지  (0) 2019.05.28
2019년 4월 11일 개인일지  (0) 2019.04.11
2019년 3월 12일 개인일지  (0) 2019.03.12

2019.02.16


WPF의 Mainwindow에서 버튼을 누르면 기존 창이 가려지고, 

새로운 창이 나와야 하는 작업을 하는 과정에서 생각보다 시간을 많이 쓰게 되었다.

내가 같은 실수를 하지 않기 위해,

나와 같은 어려움을 겪은 분들을 위해 글을 남긴다.




1. DLL 생성



DLL 추가하고자 하는 솔루션에서 마우스 오른쪽 버튼을 눌러 [ 새 프로젝트 추가 ]를 누르고 [ 클래스 라이브러리 ] 를 생성 한다.




생성된 클래스라이브러리에서 나는 wpf 사용자 컨트롤을 사용 할 것이니 사용자 정의 컨트롤(WPF)를 눌러 생성한다.



시작 프로젝트의 참조에서 마우스 오른쪽 버튼을 눌러 [ 참조 추가 ]로 들어간다.



해당 DLL을 체크하고 확인을 누른다. 이후에 생성한 DLL 프로젝트에서 마우스 오른쪽 버튼을 눌러 시작프로젝트로 설정하여 주고

빌드하여 준다. 그렇게 하면 bin\debug 경로에 DLL 파일이 생성된다.


그런데 만약 빌드가 되지 않고 아래 이미지와 같은 에러가 뜬다면



위에서 참조추가 했던것과 마찬가지로 system.xaml을 참조추가하면 해결된다.



이제 DLL은 생성이 완료되었다. 메인윈도우에서 해당 버튼을 눌렀을때 방금 만들었던 사용자컨트롤 창을 띄우게 하면된다.




나는 유저 컨트롤이 생성되는 시점에서 Visibility를 hidden으로 두고 메인윈도우에서 해당 창을 띄우는 버튼을 눌렀을때 창이 visible 상태가 될수있도록 Show 함수를 작성하였다. 이제 메인에 사용자 컨트롤을 컨트롤 할 수 있는 변수를 생성하고 메인 canvas에 해당 childwindow를 add해주면 된다. 아래의

이미지를 참고하자









끝!

+ Recent posts