엔티티 타입의 종류


- 강한 엔티티 타입  

우리가 사용하는 95%이상 
독자적으로 존재
실선 직사각형으로 표현 
독자적인 키 애트리뷰트를 가짐


- 약한 엔티티 타입 

독자적인 키 애트리뷰트가 없음
특정 강한 엔티티타입에 속함
두줄 실선 직사각형으로 표현
회사 데이터 베이스를 구축 하는 예
직원들의 자녀학비지원, 데이터베이스에서
부양가족을 관리를 해야됨
그렇게 중요한 정보는 아니지만 확실한 정보
를 관리해야됨


관계와 관계타입


관계 :  

두 개 이상의 엔티티들을 특정한 의미로  
연관 짓는 것 


관계 타입 : 


동일한 의미를 가진 관계들의 틀  
고용자들과 프로젝트들이 참여하는 works_on
관계 타입
마름모로 표현 한다.

 

관계타입에 대한 제약조건 



카디날리티 제약조건 


1:1
1:n
n:1
n:M


참여 제약조건 


의무적으로 참여해야하는지
선택적으로 참여해야하는것인지 여부


ER모델 -> 관계형데이터 모델로 변환하기 위해 배운다.

 

관계제약조건 4가지 



도메인 제약조건, 키제약조건, 참조무결성 제약조건, 엔티티무결성 제약조건


1. 도메인 제약조건 : 도메인 값을 넘어가는 값이 들어가면 안된다.
                                  

2. 키 제약조건 :  키 애트리뷰트에는 중복 된 값이 들어가면 안된다.
                       핵심 애트리뷰트(candidate)를 찾는 것이 중요 하나씩 지워나간다. 
                       

3. 참조무결성 제약조건 : 참조 받는 릴레이션에 참조하는 값을 가진 튜플이 존재 해야 한다.

4.  엔티티무결성 제약조건 : 기본 키 애트리뷰트에 null 값이 들어가면 해당 데이터를 찾을 수가 없다.
                                     

 

 



DBMS에서 일어나는 효율적으로 일어나는 연산
Search, Insert, Delete, Update

위의 4가지 관계조건은 
사용자 만족을 위한것이 아니라, 사용자가 잘못되거나, 깨지는 작업을 하더라도
DBMS가 원천적 봉쇄를 하거나 그런 일이 일어나지 않도록 하는 작업이다.
 


관계형데이터 모델의 가장 큰 장점 : 
                                    포인터 없이 값만을 갖고 포인터의 역할을 할 수 있는 매커니즘

null은 특수마크라고 알면 된다. 값이 아님.

엔티티 무결성 제약조건 : 
                              기본 키 애트리뷰트에 null 값이 들어가면 해당 데이터를 찾을 수가 없다.


하나의 릴레이션에 두개의 애트리뷰트 키가 들어가고 하나가 캔디데이트 키면 
CANDIDATE 키는 NULL이 들어갈수 있다. 


참조라고 하는 것은 하나의 릴레이션 R에 있는 속성 F의 값으로 다른 릴레이션 S의 기본 키 P값을
참조 하는 것.
-> 한쪽에선 기본키 다른쪽에선 기본키가 아닌 애트리뷰트에 있을떄
     이때 기본키가 아닌 것이 기본키를 참조한다. 얘는 외래키라고 한다.
부서번호 5 -----------------------> research 5를 참조하여 5만써도 research부서
라는 것을 알 수 있음.


1. 외래키가 만족 시켜야 할 조건이 있을까?
-> 
부서번호 6 --------------------> X 6 예를들어 6번 부서가 없다면 큰 문제가 된다.
소개팅에서 산기대 의대다녀요! -> 산기대 의대가 없다. 이런일이 발생되면 안된다!
라는 것이 참조 무결성 제약 조건이다.
참조 되는 릴레이션에 반드시 참조 되는 튜플이 있어야 한다. 

2. 외래키인 애트리뷰트는 null값이 들어 갈 수 있을까?
-> 게임공학과 의 창설 예
     학과 입장에선 학생이 없을 수도 있다.
     학과와 학생은 선택적 참여를 하는 관계다.
     이 부서엔 반드시 존재 해야만 한다면 의무적 참여 관계로 표현
     이 때에는 null값이 들어 갈 수 없다.
     참조 관계는 두개의 엔티티 타입을 외래키 관계를 통해서 표현을 한다.
     있느냐 없느냐는 이 참조 관계가 선택적참여이냐, 의무적 참여이냐에 따라서 달라 질 수 있다.

3. DBMS가 어떻게하면 무결성 제약조건을 보장할 수 있을까?
-> 

1. 검색 -> 도메인 제약조건이 위반되는 내용이 있을까? 읽기 연산으로는 도메인 제약조건이 위반되는 X
                키 제약조건에 위반되는 내용은? 갑자기 중복이 되는 경우는 X
                엔티티 제약조건은? 없다.
                참조 무결성 제약조건은? 없다. 읽기는 없다 읽기는!!
               = 검색은 없다.

2. 삽입 -> 도메인 제약조건 위반 ? -> 생길수 있다. 내가 도메인 값을 넘어가는 값을 집어 넣는 경우
                키 제약조건 위반? -> 키 애트리뷰트 중복 값을 넣으면 위반 할 수 있다. 
                엔티티 제약조건은? 내가 null을 넣음으로
                참조 무결성 제약 조건은? 있다. 
               = 4가지 모두 발생 시킬 수 있다.
                 사용자가 이런 값을 넣게 하려고 하면 해당 값을 Insert 할 수 없다고 팝업창을 띄워준다.
3. 삭제 -> 도메인 제약조건 위반? 없음.
                키 제약 조건 위반? 내가 삭제한다고 중복이 생기진 않는다. 따라서 없음
                엔티티 제약 조건 위반? 발생 하지 않는다.
                참조 무결성 제약 조건 위반? 생길 수 있다.  -> 게임공학과가 없어진다. 그럼 학생들은 
                                                                              소속 학과가 없다.

                = 참조 무결성 제약조건만 일으 킬 수 있다.
                   1. 게임공학과 폐과 -> 컴공으로 학생들을 옮긴다. 또는 원하는 과로 보낸다.
                   2. 삭제를 거부.
                   3. 삭제되는 투플을 참조하는 투플들까지 삭제 = 줄줄이 삭제되는 경우가 생긴다.
                                                                                  참조에 참조에 참조가 연쇄삭제 되는 경우
                 
4. 갱신 -> 기존에 있는 내용의 값을 바꾸는 연산  
                Insert Delete를 한다.
                삽입, 삭제를 생각하면 되므로 따로 생각 할 필요가 없다.


 

 

 

 

 




ER모델

            : Entity Relationship Attribute

            를 가지고 이 세상을 모델링 함. 

            모든 언어에는 표현력이 있다.(강한 표현력)

            인간에 가깝다(고도의추상화)           



            

엔티티

             : 이단어는 이거야!라고 머릿속에 떠오르는 것

            대부분의 경우 구체적 명사 

            독립적으로 존재하면서 고유하게 식별가능한 객체

            ex) 사람, 인간, 토끼, 의자



관계 

         : 두개 이상의 엔티티들을 연관짓는 것 

          

         ex) 결혼, 수강, 소속

            



애트리뷰트 

                 : 엔터티를 구성하는 속성 

                 ex) 이름, 학번, 위치, 강사

         = 데이터베이스의 스키마 정보에 해당





동일한 엔티티 타입에

학생이라는 엔티티타입에 30개의 엔티티

교수라는 엔티티타입에 1개의 엔티티

동일한 에트리 뷰트를 갖는 엔티티들의 모임


ex) 자동차를 예로 들어보자

자동차 = 엔티티 타입


car1  엔티티 1  

car2  엔티티 2

car3  엔티티 3


애트리뷰트 = 차 넘버, 차종 등등


Car = {엔티티1, 2, 3} = 엔티티 집합.








애트리뷰트의 종류


: 단일값 <=> 다치

  저장된 <=> 유도된

  단   순 <=> 복   합





1. 단순 애트리뷰트 :


우리가 만드는 에트리뷰트의 90%이상이 단순 

더이상 다른 애트리뷰트로 나눌 수 없는 애트리뷰트

실선 타원으로 표시

실선 사각형 = 엔티티 타입

ex) Customer[엔티티타입] -

ID, Name, address[단순 애트리뷰트]


2. 복합 애트리뷰트 :

     

두개 이상의 애트리뷰트로 이루어진 애트리뷰트 

실선 타원으로 표시하지만 

단순애트리뷰트에 선으로 연결되어있음

Address[단순애트리뷰트] - 

       City, Ku, Dong, Zipcode[복합 애트리뷰트] 


Address는 단순일까 복합일까?

: 그때그때 다르다.


그럼 언제 단순이고 언제 복합일까?

: 단순일때는 회원가입할때 단순히 주소만 입력할때

  복합일때는 주소라는 필드가 있고 입력박스로

   경기도, 서울 막 나눠서 시군구를 선택하는방식. 

   각각을 나눴기 때문에 복합.

세부적으로 검색의 조건을 나누는 경우 = 복합

그런거 필요없고 입력된거 통째로 쓴다 = 단순


3. 단일값 애트리뷰트


: 각 엔티티마다 하나의 값을 갖는 애트리뷰트

  회원가입시 학과, 생년월일   

  실선 타원으로 표시  


4. 다치 애트리뷰트


: 각 엔티티마다 여러개의 값을 갖는 애트리뷰트

  특기, 취미

  실선 이중타원으로 표시


이름은 단일값일까 다치일까?

예를들어 개명을 한 친구들이 있다.

또는 가명. 연예인 하하(하동훈) 이름 적는 란에

조금 망설일 것 이다. 본명은 사람들이 잘모름.

이 사람은 하동훈(하하) 이렇게 쓰려고 할 수도 있다.

단일로 모델링한 경우 이름 칸에 이름 하나만 써라!

-> 강제의 의미

다치로 모델링한 경우 여러개를 넣어도 괜찮아요!


국가기관 주민등록 등본상의 등록 이름의 경우 : 단일

네이버-> 연예인이름 하하(하동훈) : 다치

결과적으로 필요에 따라 모델링 방법이 다르다


데이터 모델링은 처음 모델링을 할 경우

현실상황을 그대로 반영한다고 생각하지만

모델링을 해놓고 보면 우리의 삶은 그것에 종속 된다.

ex) 버스 카드 찍는 단말기에 우리가 버스카드를 찍는다.


5. 저장된 애트리뷰트

: 말그대로 실제 값을 하드디스크에 저장해놓는 애트리뷰트

  90% 이상의 애트리뷰트가 저장된 애트리뷰트

  실선 타원으로 표기됨. 


6. 유도된 애트리뷰트

: 다른 값으로 부터 유도해 내어 얻는 애트리뷰트 

  점선 타원형

  ex) 나이라는 필드가 있다. 1년이지나면.

        모든 레코드들의 나이를 업데이트 해주어야 함.

        현재 날짜와 계산해서 얻을 수 있다.

        어디서 부터 유도가 될 수 있는지도 생각해봐야함

        

        평점, 학생수, 재학생수





키 애트리뷰트 


:  중복이 없다.

   어떠한 두개이상의 필드에 해당 앤티티에 대해서

   동일한 값을 갖지 않는다.

   ex) 학번, 지문, 홍채인식

   아닌 ex) 이름(동명이인), 

   주소를 키 애트리뷰트로 만들면 큰일남. 

   -> 너네형이 작년에 입학해서 너는 못들어와!

   중복 값이 있어선 안된다. 라는 금지의 의미를 갖는다.

   많은 엔티티 중에서 특정 엔티티를 식별해내는 의미

   2012182037 나와 -> 한명이있던가 아무도 없던가

   여러개의 애트리뷰트가 모이면 식별해 낼 수 있음

   -> 경기도 부천에사는 25살 정OO씨!

   밑줄로 표기함-> ID에 밑줄이 그어져있다면 ID=식별자

   키 애트리뷰트가 여러개 있을 수 있다.

   ID도 학번도 될 수 있음

   하지만 둘다 밑줄을 긋는다면 둘중에 하나를 정해

   밑줄을 그어야한다. 둘다 긋는 경우 둘을 합친게

   식별자가 된다는 의미이기 때문에









현재 개인 프로젝트에서

입력 된 값만큼 텍스트 박스를 생성을 해야 하는 작업을 하다가 동적으로 텍스트 박스를 생성하는데 꽤나 긴 시간이 소비되어

다음에 같은 작업을 할 때 시간을 좀 더 덜어내고자 글을 쓰게 되었다.





작업 해야 할 프로그램 화면 구성은 아래의 이미지와 같다.



  





먼저 해당 객체에는

public List<TextBox> userNameBoxList; 와 같은 List 컨테이너를 통해서 TextBox를 저장했다.

TextBox를 그려줄 canvas가 필요했고 CNV_tb_cnv라는 변수명으로 Canvas를 생성했다.







Canvas.SetTop

Canvas.SetLeft


위의 두 함수와 간단한 수식을 통해서 그려줄 위치를 설정하였고. 리스트 원소에 접근하여 width, height를 설정하였고

CNV_tb_cnv의 Children으로 추가하여주었다.



참조코드 :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
            int startX = 100;
            int startY = 50;
 
            int maxCntinLine = 2;
            double offsetX = IMG_UserMap.Width / 2;
            double offsetY = 30 + IMG_UserMap.Height / 6 ;
 
            for ( int i = 0; i < maxUser; ++i)
            {
                userNameBoxList.Add(new TextBox());
                
                // 위치
                Canvas.SetLeft(userNameBoxList[i], startX + (i % maxCntinLine) * offsetX);
                Canvas.SetTop(userNameBoxList[i], startY + (i / 2* offsetY);
 
                // 높이 / 너비

userNameBoxList[i].Width = IMG_UserMap.Width / 4;
                userNameBoxList[i].Height = IMG_UserMap.Height/ 6;
 
                CNV_tb_cnv.Children.Add(userNameBoxList[i]);
                
 
 
            }

cs






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; 
       }
 
    }
 
}




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






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

 

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

+ Recent posts