728x90

- The Binary Tree Algorithm

 

- The Sidewinder Algorithm

 

- Kruskal Algorithm

 

- Prim

728x90

'Algorithm > Concepts' 카테고리의 다른 글

길찾기,다익스트라,PathFinding,Dijkstra  (0) 2021.08.19
길찾기,우수법,PathFinding,RightHand  (0) 2021.08.19
DFS,BFS,깊이우선탐색,너비우선탐색  (0) 2021.08.19
트리 logN 복잡도 도출  (0) 2021.08.18
Big-O,빅오  (0) 2021.08.13
728x90

https://unicode-table.com/en/

728x90

'메모 > ETC' 카테고리의 다른 글

알고리즘, 자료구조 체크리스트(C#,C++)  (0) 2021.08.13
캡쳐보드란? 그리고 쓰는 이유는?  (0) 2021.08.12
728x90

개념

- 로그함수는 지수함수의 역함수 관계.

- 역함수 그래프는 y = x에 대칭이다.

- 대수함수라고도 불림

- log라는 기호를 사용

 

 

원리

로그는 지수를 표현하기 위해서 만들어짐

2에 몇 x승을 해야 10이 될까?

2x = 10 이때 지수 x 값은 몇일까?

=> x = log210

 

 

 

 

특징

- 밑이 10인 로그를 상용로그라고 한다.

- 밑이 2인 로그 -> 이진로그 -> lb x로 표현

- 밑이 10인 로그 -> 상용로그 -> lg x로 표현

- 밑이 e인 로그 -> 자연로그 -> ln x로 표현

728x90

'수학과물리' 카테고리의 다른 글

Combination,조합  (0) 2021.08.22
Bezier Curve  (0) 2020.03.12
728x90

정의

- 알고리즘의 효율을 표현하기 위한 기준

- 알고리즘의 시간 복잡도를 수치화 하기 위한 수단

 

계산 방법

- 수행 되는 연산(산술, 비교, 대입 등)의 갯수를 대략적으로 판단

- 가장 영향력이 큰 대표 항목만 남긴다 (ex n^2+1 -> n^2)

- 상수 무시 (ex 2n -> n)

 

읽는 법

EX) O(n^2)

- order of n 제곱

- 빅오 n 제곱

 

의의

- N^2

- NLogN (대부분의 정렬 알고리즘 NLogN의 시간 복잡도를 갖는다.)

- N

- LogN

- 1

728x90

'Algorithm > Concepts' 카테고리의 다른 글

길찾기,다익스트라,PathFinding,Dijkstra  (0) 2021.08.19
길찾기,우수법,PathFinding,RightHand  (0) 2021.08.19
DFS,BFS,깊이우선탐색,너비우선탐색  (0) 2021.08.19
트리 logN 복잡도 도출  (0) 2021.08.18
Maze,미로  (0) 2021.08.13
728x90

- 표준 C++ 라이브러리 (Standard Template Library)

- 프로그램에 필요한 자료구조와 알고리즘을 Template로 제공하는 라이브러리

 

구성요소

Container

- 객체를 저장하는 객체, 자료구조라고도 한다. 클래스 탬플릿으로 구현되어 있다.

- Container는 크게 Sequence, Associative로 나뉜다.

- Sequence Container : Array, Vector, list, deque

- Associative Container : set, multiset, map, multimap

 

Iterator

- 포인터와 비슷한 개념으로 컨테이너의 원소를 가리키고, 가리키는 원소에 접근하여 다음 원소를 가리키는 기능, 원소를 순회하는 등의 역할을 한다.

 

Algorithm

- 정렬, 삭제, 검색, 연산 등을 해결하는 기능

 

Function Object

- 함수처럭 동작하는 객체로 연산자 오버로딩한 객체

- 컨테이너와 알고리즘 등에 클라이언트 정책을 반영?하게 한다.

 

Container Adaptor

- 구성요소의 인터페이스를 변경해 새로운 인터페이스를 갖는 구성요소로 변경한다.

- 종류 : stack, queue, priority_queue

 

Allocator

- 컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당자를 갖고 있다.

728x90
728x90

스택

 

 

다익스트라

 

트리

 

그래프

 

A* 알고리즘

- A* 알고리즘이란 무엇인지 아는대로 설명하시오

- 가중치 계산 하는 방법을 설명하시오

- dijkstra와 차이점을 설명하시오

- flow 작성하시오

- 샘플 코드에 a*를 구현하시오 - c# (대각선 이동 활성화/비활성화, 코너 가로지르기 활성화/비활성화)

- 샘플 코드에 a*를 구현하시오 - c++  (대각선 이동 활성화/비활성화, 코너 가로지르기 활성화/비활성화)

728x90

'메모 > ETC' 카테고리의 다른 글

참고사이트  (0) 2021.08.13
캡쳐보드란? 그리고 쓰는 이유는?  (0) 2021.08.12
728x90

39p~

47p~

 

참석자 : 김승제, 이용준

기간 : 21-08-13~21-08-14

리뷰 : 21-08-14

728x90
728x90

해커스 오픽 강의 내용을 정리한 내용입니다.

 

표현

- I was born and raised here

- Everything is with walking distance.

- She is my neighbor who lives right next to me. We are about the same sage and have a lot in common.

- She is a good listener. She gives me a pep talk.

- She is a butterfly.

- I lose track of time.

- I live in ---

- There are --- in my neighborhood

- My neighborhood is ----

- I recently had a(n) ---- experience in my neighborhood.

- It was --- ago.

- We talked about --- in our neighborhood

- When I was young, there was nowhere to --- in my neighborhood

 

Q1

You indicated in the survey that you live in an apartment. What is your neighborhood like? Where is it located? Please describe your neighborhood in detail?

A1

I live in the downtown of Seoul. There are many restaurants and supermarkets in my neighborhood. Also, it has a good transportation system. It's only a 5-minute walk to a subway station. My neighborhood is very clean and nice. I feel lucky to live in my neighborhood.

 

Q2

I would like to know about your neighbors. Who are they? What do they do? How often do you interact with them

A2

I am close with one of my neighbors. Her name is Pia. She lives right next to me. She is a teacher who lives alone. We have a lot in common. I think we get together at least once a week. We usually watch movies together. We also go grocery shopping and go for a walk when we have time. She is a good neighbor who became my friend.

 

Q3

Can you tell me about an interesting or memorable experience you have had in your neighborhood? Tell me about the experience in detail and explain what made it so memorable.

A3

Yes, I had a special experience. I was taking a walk in my neighborhood last year. When I was walking, I ran into an old friend of mine. My friend in my heighborhood! Can you belive it? We went to the same high school. He told me he was shopping with his family. We met for a drink that night. It was an amazing experience. We became even better friends after that.

 

Q4

How has your neighborhood changed from when you were young? Describe in detail how it was in the past, and how it is now?

A4

Well.. My current nighborhood is very different from my old neighborhood. When I was young, I lived in the countryside. It was very quiet all the time and it had Limited amenities[어메너티스]. It took more than 2 hours to a grocery store. But now, I live in the downtown. It's a busy city 24/7. Evertything is within walking distance so it's super convenient! I love my current neighborhood!

728x90
728x90

캡쳐보드란?

- 캡쳐보드는 PC 또는 콘솔등 비디오 출력만 가능하고 입력이 불가능한 장치에 비디오 입력이 가능하게 하는 장치를 말하는 듯 하다.

 

- 제품에 따라서 자체 인코딩이 가능한 경우도 있다.

 

원컴? 투컴? 캡쳐보드?

투컴에서 캡쳐보드가 갖는 의미는 비디오 입력을 가능하게 하는데 의미를 갖고,

원컴에서의 캡쳐보드는 자체 인코딩이 가능한 제품을 쓰는 경우 원컴의 자원을 아낄 수 있다.

 

결론은 원컴에서 캡쳐보드를 사용하는 이유와 투컴에서 캡쳐보드를 사용하는 이유는 다르다.

 

728x90

'메모 > ETC' 카테고리의 다른 글

참고사이트  (0) 2021.08.13
알고리즘, 자료구조 체크리스트(C#,C++)  (0) 2021.08.13
728x90

해커스 오픽 강의 내용을 정리한 내용입니다.

 

-시험장에서는 또박또박 하기 보다는 부분적으로 빠르게(자연스럽게) 대화하는 것이 중요.

-어려운 어휘보다는 쉬운 단어로 전달력을 높이는게 중요하다.

-단어를 열거할 떄는 문장이 끝나지 않았다는 의미로 단어 끝을 올려줘야 한다.

 

컨셉

- 한강 근처 아파트에 가족들과 산다

- 집 문에 들어오면 신발 벗을 공간이 있고, 더 들어오면 왼쪽이 거실과 내 방이 있다. 오른쪽에는 주방과 형방과 부모님방이 있다.

- 그 옆에 발코니와 화장실이 있다.

- 집은 깨긋하고 현대적이다.

 

 

스토리라인

- 집의 모습 묘사

- 집에서 가족들과 함께 하는 일

- 방에 있는 가구나 가전제품 묘사

- 최근에 집에 준 변화

 

표현

I live on the 2 floor of a 10 story apartment.

It gave a new atmosphere to my house.

I have lived here for all my life.

a comfy bed / a brand-new sofa / a second-hand sofa

It was worth the mony

a perfect fit for me

Theare are serveral reasons for my preference.

My house is clean and morden

My home has a living room and three bedrooms

I have a desk and a bed in my room

I recently redecorated my room

It made the room cozier

I usually spend time with my family on weekens

We usually have meals together at home 

 

 

Sample Question and Answer Scripts

 

Q1. You indicated in the survey that you live in an apartment. Tell me about your home. What dose it look like? What types of rooms dose it have? Please describe it in detail.

 

A1.

I live in a 3-bedroom apartment. When you walk[워크] in the front door, you can see a area[에리아] where you can take off your shoes. One the left, there is my room. The living room is also to the left. On the right is a kitchen. Next to the kitchen, you can see a bathroom and a balcony[밸커니]. My house is very clean and modern.

 

 

Q2.

Tell me about your bedroom. What dose it look like and what do you keep in it? Use as many details as possible to describe it.

 

A2.

I think my room is very clean and modern. I love my room because it's only for me. I can have quiet moment all by myself without any distractions. Another reason is that since my bedroom has large windows, I can enjoy breathtaking view and fresh air. When you walk in my room, you can see a bed. On the left there is a dressing table. A desk is also to the left. On the right is a bookshelf. I am very satisfied with my room.

 

 

Q3.

It is important for a family to spend time together. When do you spend time at home with your family? What dose your family usually do at home?

 

A3.

Well... I am very busy during the weekdays, so I usually spend time with my family on weekends. We usually prepare dinner together at home. I help my mother cook and my brother dose the dishes. While having our meal, we often talk about current events. After dinner, everyone relaxes[릴렉시스]. My house is very cozy[쿼우지], so we enjoy spending time there. My brother and I usually play video games together. My parent like to watch TV.

 

 

Q4.

Have you made any changes to your house within the last few years? If so, what kinds of changes have you made to your home? Are you satisfied with the changes?

 

A4.

I live in an apartment and I recently redecorated[리데코레이릿ㄷ] my living room. I replaced the[디] old pillow. The new pillow is soft and cozy. I also decided[디싸이릿ㄷ] to get new furniture. I purchased a new couch[카우치], and matching chair[체이얼]. Finally, I put up new curtain[커른] in the room. I am very happy with my living room now.

728x90
728x90

Rookiss님의 [c#과 유니티로 만드는 mmorpg 게임 개발 시리즈] part2 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

Rookiss님의 [c++과 유니티로 만드는 mmorpg 게임 개발 시리즈] part3 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

 

특징

- Enqueue 순서와 상관없이 중요도가 가장 높은 순서대로 Pop을 한다.

- 이진 힙트리를 이용 => 트리 정보를 선형자료구조로 관리할 수있다.

- 삽입/삭제 시간복잡도 : log2(n) -> 트리 높이를 따른다.

 

728x90
728x90

Rookiss님의 [c#과 유니티로 만드는 mmorpg 게임 개발 시리즈] part2 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

Rookiss님의 [c++과 언리얼로 만드는 mmorpg 게임 개발 시리즈] part3: 자료구조와 알고리즘 강의 내용을 정리했습니다.

 

특징

- 자식 노드가 최대 2개인 트리

 

이진 트리 종류

이진 검색 트리

- 좌측으로 가면 루트보다 값이 작아지고, 우측으로 가면 루트보다 값이 커지는 형태로 노드를 배치 해서 검색에 용이하다.

- 노드가 좌우 균형 잡혀 있으면 효율적이지만, 한쪽에 기울어지면 효율성이 떨어진다. 트리 재배치를 통해 균형을 유지하는 것이 관건이다. (AVL, Red-black)

 

이진 힙 트리

- 부모 노드 값이 자식 노드보다 커야 한다. (자식 노드의 순서는 상관없다)

- 마지막 레벨에 노드가 있을 때는, 항상 왼쪽부터 순서대로 채워야 한다. => 이렇게 규칙을 지정 하면 노드의 개수를 알면 트리 구조를 알수 있다. => 이로 인해서 트리 정보를 선형자료구조에 넣어 사용할 수있다.

- 새로운 값 추가

마지막 노드 위치에 노드를 추가하고, 부모 노드와 크기를 비교해서 부모 노드가 추가된 노드 값보다 작으면 교체 된다. 같은 방식으로 부모 노드가 자식 노드보다 값이 작아지도록 반복 탐색한다.

- 최대값 꺼내기

루트 노드를 제거하고 마지막 노드를 루트 노드에 위치한다. 새롭게 지정된 루트 노드를 자식중 더 큰 값과 비교해서 루트 노드가 자식보다 작으면 교체 된다. 같은 방식으로 자식 노드와 비교,교체를 반복해서 힙트리 법칙을 유지한다.

 

 

 

 

728x90

'DataStructure > Concepts' 카테고리의 다른 글

선형자료구조,배열,동적배열,연결리스트(양방향),스택,큐  (0) 2021.08.18
자료구조 종류  (0) 2021.08.15
우선순위큐,PriorityQueue  (0) 2021.08.11
트리(tree)  (0) 2021.08.11
Graph,그래프  (0) 2021.08.09
728x90

Rookiss님의 [c#과 유니티로 만드는 mmorpg 게임 개발 시리즈] part2 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

Rookiss님의 [c++과 언리얼로 만드는 mmorpg 게임 개발 시리즈] part3: 자료구조와 알고리즘 강의 내용을 정리했습니다.

 

특징

- 노드와 간선으로 이루어져 있다.

- 노드는 데이터를 표현

- 간선은 노드의 계층 구조를 표현

- 트리는 재귀적인 특성을 갖는다. (트리는 서브  트리로 이루어진다)

 

트리 용어

 

노드 출력하기

- 트리는 재귀적인 특성을 갖기 때문에 재귀함수로 구현

        static void PrintTree(TreeNode<string> root)
        {
            Console.WriteLine(root.Data);

            foreach(TreeNode<string> child in root.Children)
            {
                PrintTree(child);
            }
        }
void PrintTree(NodeRef root, int depth)
{
    for (int i = 0; i < depth; i++)
    {
        cout << "-";
    }

    cout << root->data << endl;

    for (NodeRef& child : root->childeren)
    {
        PrintTree(child, depth+1);
    }
}

 

트리 높이 구하기

- 자식 노드의 깊이가 다를 수 있다는 걸 주의 해야한다. (가장 깊은 자식과 루트의 거리가 깊이다)

- 재귀적인 특성을 이용해 재귀함수로 구현

        static int GetHeight(TreeNode<string> root)
        {
            int height = 0;

            foreach(TreeNode<string> child in root.Children)
            {
                int newHeight = GetHeight(child) + 1;
                height = Math.Max(height, newHeight); // 높이가 다른 경우 큰값으로 치환.
            }

            return height;
        }
// 깊이(depth) : 루트에서 어떤 노드에 도달하기 위해서 거쳐야하는 간선의 수(aka 몇층?)
// 높이(height) : 가장 깊숙히 있는 노드의 깊이 max(depth)
int GetHeight(NodeRef root)
{
    int height = 1;

    for (NodeRef& child : root->childeren)
    {
        height = max(height, GetHeight(child) + 1);
    }

    return height;
}

 

728x90
728x90

해커스 오픽 강의 내용을 정리한 내용입니다.

 

질문

Tell me a little about yourself

Let's start the interview now. Tell me a little about yourself.

 

컨셉

- 남, 24살

- 가족 구성원 : 아빠, 엄마, 형

- 사는 곳 : 아파트, 서울

- 취미 : 요리

- 전공 : 컴퓨터 게임

- 전공 선택 이유 : 게임 개발자가 되고 싶어서

- 신분 : 취업 준비 생

 

스토리라인

저는 24살 ㅇㅇㅇ 입니다.

컴퓨터 게임 전공을 작년 겨울에 졸업했습니다.

저는 이쪽 분야에서 일하고 싶어서 전공을 선택 했습니다.

지금은 취업 준비생이고 스펙을 만들어야 합니다.

그래서 요즘 제 자신을 한계까지 몰아 붙이고 있습니다.

저는 정말로 게임 개발자로 일하길 바래요.

저는 지금 가족들과 서울에서 살고 있습니다.

제가 가족은 아빠 엄마 형 그리고 저 입니다.

저는 사회성 좋은 사람이라고 생각합니다.

저는 여과시간에 친구들과 놉니다.

우리는 항상 즐겁습니다.

 

관련 표현

I graduated from university last ---.

My major was ---

I live with --- in ---

There are --- people in --- : --- , --- , ---, and me.

In my free time / when I have free time

My name is --- and I am -- years old

I think I am a --- person

I chose[초우즈] --- because ---

My father works for the goverment and my mother is a housewife.

I really enjoy haning out with my friend.

We alwasy have a lot of fun together.

I am currently looking for a job.

I try to push --- to ---

I need to imporve ---

 

 

 

샘플 스크립트

 

제 이름은 김승제이고, 나이는 24살입니다.

Hello, Let me introduce myself. My name is seung-je, kim and I am 24 years old.

 

저는 컴퓨터게임 전공을 했습니다.

My major was Computer Game.

 

저는 이쪽에서 일하고 싶어서 게임전공을 선택했습니다.

I chose[초우즈] this major because I wolud like to have a job in this field

 

저는 작년에 졸업했습니다.

I graudated from university last winter.

 

지금은 취업 준비 생이고, 스펙을 만들고 있습니다.

So I am looking for a job and I need to improve job qualifications.

 

그래서 요즘 저는 제 자신을 한계까지 몰아 붙이고 있습니다.

So currentlry, I try to push myself to the limits.

 

저는 정말로 게임화사에 가길 바래요.

I really want to work as game developer

 

저는 지금 가족과 서울에서 살고 있습니다.

I live with my family in seoul.

 

제 가족은 4명 입니다. 엄마, 아빠, 형제들 그리고 나.

There are 4 people in my family : mother, father, siblings and me.

 

저는 사교적인 사람입니다.

I think I am a people person.

 

그래서 여가시간에 친구들과 시간을 보냅니다.

So When I have free time, I really enjoy hanging out with friends.

 

우리는 항상 즐겁습니다.

We always have a lot of fun together.

 

 

728x90

'English > OPIC' 카테고리의 다른 글

OPIC_해커스인강_07_공연,콘서트 관람  (0) 2021.08.15
OPIC_해커스인강_06_영화관람  (0) 2021.08.14
OPIC_해커스인강_05_동네 및 이웃  (0) 2021.08.13
OPIC_해커스인강_04_사는곳[필수]  (0) 2021.08.12
OPIC_시험관련  (0) 2021.08.11
728x90

해커스 오픽 강의 내용을 정리한 내용입니다.

 

채첨방식

컴퓨터 상에 ava(여성)와 인터뷰함

녹음된 파일만 전송돼서 채점되는 방식

 

시험 등급

Advanced - Low (AL)

Intermediate - High ( IH)

Intermediate - Mid3 (IM3)

Intermediate - Mid2 (IM2)

Intermediate - Mid1 (IM1)

Intermediate - Low (IL)

Novice - High (NH)

Novice - Mid (NM)

Novice - Low (NL)

 

평가방식

Contents 50 % + Delivery 50%

Delivery가 좀더 고득점에 중요함

 

시험구성

OT 20 min

본시험 40min (빨리 끝나면 빨리 나감)

 

OT팁

1. 현재 귀하는 어느 분야에 종사하고 계십니까? -> 일 경험 없음

2. 현재 귀하는 학생이십니까? -> 아니오

3. 현재 귀하는 어디에 살고 계십니까? -> 가족과 함께 주택이나 아파트에 거주

 

총 12개 이상 항목을 선택 해야한다.

4. 귀하는 여가 활동으로 주로 무엇을 하십니까? (두개 이상) -> (영화보기, 공연보기, 콘서트 보기), (공원가기, 해변가기)

5. 귀하의 취미나 관심사는 무엇입니까?(한개이상) -> (요리하기,  음악감상하기)

6. 귀하는 주로 어떤 운동을 즐기십니까? (한개이상) -> (자전거, 하이킹/트레킹, 조깅, 걷기)   (걷기는 다른 항목에 있음)

7. 귀하는 어떤 휴가나 출장을 다녀온 경험이 있습니까? -> 집에서 보내는 휴가

 

난이도 설정

6단계로 난이도를 지정해서 시험 볼수 있다.

난이도 재설정하는 경우에 기존 난이도를 유지하는게 좋다. 난이도가 확 어려워지는 경우가 있다.

IM2 목표 : 3-3

IM3 목표 : 4-4

IH 목표 : 5-5

AL 목표 : 5-5

 

시험구성

15문제

1번 문졔 : 자기 소개

주제당 문제 : 2~3문제. 주제 5~6개 정도 나옴.

답변 제한 시간 : 없음(시험 끝나는 시간 똑같음) (한 주제에 40~1분정도가 적당) (전달력이 중요. 상대방이 집중할 수 있도록)

준비 시간 : 없음 => 질문 다시 듣기 1번 가능. 첫번째 들을 때는 질문을 듣고 두번째 다시 들을 때는 어떤 답변을 할지 생각하기

재시험 : 25일 후 => 면제권은 150일에 한번 사용 가능. 별도의 사용법이 없고 시험 보고 25일 이전에 시험을 보게되면 면제권이 사용됨

Survey주제(선택)+돌발주제(랜덤)

 

필수강의목차(취준생 컨셉이라면)

OT

1강

4강

5강

6-22강 : 12개 선택 서베이만 듣기

23강-27강 돌발 강의 : 전체 다 듣기

28강-30강 롤플레이 강의 : 전체 다 듣기

31강

 

공부순서

- 강의 수업 2번 듣기

- 수업시간 외 주 교재 추가 질문 도전 : 한국어로 스토리라인 정리. writing 하거나 첨삭하지 않기.

- 쉐도잉(수업 스크립트, 주 교재 스크립트, 미드 쉐도잉(2~3분 쉐도잉. 놓쳐도 따라가지 않기. 한사람만 따라가기))

 

추가 공부 방법

youtube ted, tbs 라디오 앱, 미드 쉐도잉

 

 

728x90
728x90

807p~

839p~

 

참석자 : 김승제, 이용준

기간 : 21-08-10~21-08-12

리뷰 : 21-08-12

 

Chapter 25  코드 최적화 전략

814p. 코드 최적화는 일반적으로 아키텍처, 알고리즘 선택과 같이 극적인 향상을 제공하지도 않고, 성능을 향상시키기 가장 쉬운 방법도 아니다.  하지만 진정한 프로그래머가 되는 통과 의례이다. 여러분과 다른 프로그래머들을 제외한 어느 누구도 일반적으로 여러분의 코드가 얼마나 엄격한지에 대해서 신경 쓰지 않는다. 그럼에도 불구하고 프로그래밍 문화에서는 아주 미세하게 효율적인 코드를 작성하는 것은 여러분이 훌륭한 프로그래머라는 것을 증명한다.

 

818p. 코드를 작성하면서 최적화해야 한다! - 거짓! : 세부적인 최적화를 하느라 너무 바빠서 중요한 전역적인 최적화를 뭇히나는 경우가 생긴다.

 

820p. 최적화 시기 : 고급 설계를 사용하라. 프로그램을 올바로 만들어라. 나중에 작업하기 쉽도록 모듈화하고 변경이 쉽도록 만들어라. 정확하게 완성되었을 때, 성능 검사하라. 만약 프로그램을 못 쓰게 하고 싶다면, 빠르고 작게 만들어라. 최적화가 필요하다는 것을 알게 될 때까지 최적화를 하지 않는다.

 

823p. 비효율성의 공통적인 원인 : 입/출력 연산, 메모리 페이징(page), 시스템호출(컨텍스트 스위칭 발생), 인터프리트 언어, 오류

 

831p. 만약 보다 효율적인지를 알기 위해서 측정할 가치가 없다면, 성능 도박을 위해서 명료함을 제물로 바칠만한 가치도 없다.

 

827p. 공통적인 연산의 상대적인 성능 비용 

 

Chapter26 코드 최적화 

 

논리구조

답을 알고 있을 때에는 테스트를 중단하라

- break문 사용

 

빈도에 따른 테스트 정렬

- 거의 항상 참인경우가 가장 먼저 수행되도록 정렬한다.

 

유사한 논리 구조의 성능을 비교해라

- case문과 switch문의 경우 언어보다 성능의 우위가 다르다. 간단히 말해서 결과를 측정할만한 신뢰할 수 있는 방법이 없다.

 

복잡한 표현식을 테이블 참조로 대체하라

- 테이블 참조가 복잡한 논리 구조를 따지는 것보다 더 빠른 경우가 있다.

 

소극적인 평가를 사용하라

 

루프

언스위칭

- 루프 검사를 밖에서 하는 것을 고려해라

 

재밍

- 결합가능한 루프를 하나로 묶어라

 

언롤링

- 루프의 보조 수단 코드의 양을 줄이는 것이다. 하지만 전체 코드량이 늘어나고 가독성이 떨어지는 단점이있다. 또한 코드 최적화에 대한 보증이 없다. 언어나 컴파일러에 따라 상이하기 떄문이다.

 

루프 내부 작업의 최소화

 

감시값

- 루프의 지속 중단 여부를 결정 짓는 감시값을 외부에서 정의해서 사용해라

 

가장 빈번한 루프를 안쪽에 작성해라

 

강도감소

- 곱셉과 같이 시간이 많이 걸리는 연산을 덧셈과 같이 시간이 적게 걸리는 연산으로 대체해라

 

데이터변환

부동소수점 대신 정수를 사용하라

 

가능한 적은 차수 배열을 사용하라

 

배열에 대한 참조를 최소화해라

 

보조 인덱스를 사용하라

- 독립적인 병렬 인덱스를 고려해라.

 

캐싱을 사용하라

 

표현식

대수 항등식을 사용하라

- 불필요한 연산이 들어가지 않도록 해라

 

강도 감소를 사용하라

- 강도 감소 비용이 많이 드는 연산을 피해라

 

컴파일 시간에 초기화하라

 

시스템 루핀을 주의하라

 

상수의 정확한 형을 사용하라

 

결과를 사전에 계산하라

 

공통적인 하위 표현식을 제거하라

 

루틴

루틴을 인라인으로 재작성하라

 

저급언어를 이용한 재구성

 

728x90
728x90
 

Welcome back to C++ - Modern C++

Describes the new programming idioms in Modern C++ and their rationale.

docs.microsoft.com

 

c++은 탄생 이후로, 세계에서 가장 넓게 사용되는 프로그래밍 언어입니다. 잘 작성된 c++ 프로그램은 빠르고 효율적입니다. 다른 언어보다 더 유연합니다. 높은 수준의 추상화와 저수준 실리콘? 작업이 가능합니다. c++ 높은 수준의 최적화 표준 라이브러리를 제공합니다. 이것은 저수준 하드웨어에 접근 가능하게하고 속도를 최대하 하고, 메모리 사용을 최소하 시킵니다. c++을 사용하면 당신은 다양합 앱을 만들 수 있습니다. 게임, 장치 드라이버, 고성능 과학 프로그램, 임베디드 프로그램, 윈도우 앱. 심지어 다른 언어를 위한 라이브러리나 컴파일러 까지 c++로 작성됩니다.

 

c++의 본래 요구사항 중 하나는 c언와의 역호환성이였습니다. 결과적으로, c++은 저수준 포인터, 배열, 널 제거 캐릭터 스트링?, 기타 등등 c언어의 프로그래밍 스타일을 항상 지원하고 있습니다. 그것은 훌륭한 퍼포먼스를 발휘할 수도 있지만, 또한 버그와 복잡성을 유발 시킬 수 있다. c++ 진화는 c 스타일의 관용어의 필요성을 크게 줄이는 것을 강조해 왔습니다. 오래된 c 프로그래밍 장치들은 당신이 필요할 때 사용할 수 있습니다. 그러나 모던c++ 쓸 때는 c를 사용을 최대한 줄여야합니다. 모던 c++코드는 간단하고, 안전하면서, 더 우아하고, 여전히 빠릅니다.

 

Resources and smart pointers

C스타일 프로그래밍 버그 중 가장 주요한 클래스중 하나는 메모리 leak 이다. leak은 new로 할당된 메모리에 대해서 delete 하는 것이 실패되었을 때 자주 발생한다. 모던 c++은 RAII(Resource acquisition is initialization) 원리를 강조한다. 그 생각은 간단한것 입니다. 자원(힙 메모리, 파일 처리, 소켓, 등)은 object에 의해 소유 됩니다. 그 object는 생성자에서 새로 할당된 자원을 생성하거나 받고, 소멸자에서 삭제합니다. RAII의 원리는 오브젝트 소유권이 범위를 벗어 났을때 운영체제에게 적절히 반환되도록 보장하는 것이다.

RAII 원리의 손쉬운 채택을 지원하기 위해서 c++ 표준 라이브러리는 세가지 스마트 포인터 타입을 제공 합니다. std::unique_ptr,std::shared_ptr, and std::weak_ptr. 스마트 포인터는 본인이 소유한 메모리의 할당과, 제거를 다룹니다. 다음 예제는 make_unique() 호출로 힙에 배열 멤버가 할당된 클래스를 보여줍니다. new와 delete의 호출은 unique_ptr 클래스에 내포되어 있습니다. widget 오브젝트가 범위를 벗어나면 유니크 포인터 소멸자는 호출되고 그것은 배열에 할당되어 있는 메모리를 release 시킵니다.

 

#include <memory>
class widget
{
private:
    std::unique_ptr<int> data;
public:
    widget(const int size) { data = std::make_unique<int>(size); }
    void do_something() {}
};

void functionUsingWidget() {
    widget w(1000000);   // lifetime automatically tied to enclosing scope
                // constructs w, including the w.data gadget member
    // ...
    w.do_something();
    // ...
} // automatic destruction and deallocation for w and w.data

가능하면, 힙메모리를 사용할때 스마트 포인터를 사용해라. 당신이 반드시 new, delete 연산을 명시적으로 사용해야 한다면 RAII 원칙을 따르세요. 더 많은 정보를 여기를 참고하세요.  오브젝트 수명과 자원 관리(RAII)

 

std::string and std:;string_view

C 스타일 문자열은 또다른 주요 버그 원인이다. std;;string and std::wstring을 사용하면 당신은 C스타일 문자열과 관련된 가상의 모든 에러들을 제거할 수 있다. 당신은 또 Searching, appending, prepending 등 멤버 함수의 이점을 얻을 수 있다. 둘다 매우 속도면에서 최적화 되어 있다. 읽기나 쓰기 전용으로 함수에 사용되면 c++17에서는 당신은 std::string_view 를 사용할 수있다. 이는 훨씬 더 강력한 이점을 갖는다.

 

std::vector and other Standard Library containers

표준 라이브러리 컨테이너는 모두 RAII 원칙을 따릅니다. 그들은 요소들의 안전한 순회를 위해 iterators를 제공합니다. 그리고 매우 최적화 되어 있으며, 철저하게 정확성에 대해 테스트 되었습니다. 이러한 컨테이너를 사용하면 당신은 커스텀 자료구조에서 제시되는 잠재적인 버그나 비효율성을 제거할 수 있습니다. raw array 대신에 c++ 선형 컨테이너인 vector를 사용하세요.

vector<string> apples;
apples.push_back("Granny Smith");

 

기본 관계형 컨테터인 map(unordered_map 아님)을 사용하세요. 비재생성과 다양한 경우에 set, multimap, multiset을 사용하세요.

map<string, string> apple_color;
// ...
apple_color["Granny Smith"] = "Green";

성능상 최적화가 필요할때, 다음을 고려해라

- 내장 배열 타입은 클래스 멤버와 같이 쓰일 때, 중요합니다.

- unordered_map은 비정렬 관계형 컨테이너이다. 요소당 더 적은 오버헤드와 더 적은 지속성 시간 조회를 같지만, 정확하고 효율적으로 사용하기 어렵습니다.

- 정렬된 vector. 더 많은 정보는, 참고 하세요 Algorithms.

 

C 스타일 배열을 사용하지 마세요.  데이터에 직접 접근이 필요로 하는 오래된 api인 경우 f(vec.data(), vec.size()); 와 같은 접근자 함수를 사용하세요. 컨테이너에 대한 더 많은 정보는 참고하세요 Standard Library Containers.

 

Standard Library algorithms

당신이 당신 프로그램에 자체제작 알고리즘을 작성하기 전에 먼저 C++ 표준 알고리즘 라이브러리를 검토해라. 표준 라이브러리는 탐색, 정렬, 필터, 램덤과 같은 많은 공통적인 연산에 대한 꾸준히 증가하는 알고리즘 모음입니다. 수학 라이브러리는 광범위합니다. C++17이 시작되면서 많은 알고리즘 버전 또한 제공됩니다.

 

아래 몇가지 중요한 샘플이 있다

- for_each, 기본적인 순회 알고리즘( for 반복 범위에 따라)

- transform, 컨테이너 요소의 not-in-place 수정용

- find_if, 기본 탐색 알고리즘

- sort, lower_bound, 그리고 다른 정렬, 탐색 알고리즘들

 

비교자를 쓰기 위해서는 <를 사용해라 그리고 명명 람다를 사용해라

auto comp = [](const widget& w1, const widget& w2)
     { return w1.weight() < w2.weight(); }

sort( v.begin(), v.end(), comp );

auto i = lower_bound( v.begin(), v.end(), comp );

 

auto instead of explicit type names(명시적인 타입 이름을 대신 하는 auto)

C++11 은 변수, 함수 그리고 템플릿 선언에 사용되는 auto 키워드를 소개 했습니다. auto는 컴파일러에게 오브젝트으 타입을 추론하도록 합니다. 그래서 당신은 타입을 명시하지 않아도 됩니다. auto는 특히 추론되는 타입이 nested 탬플릿일 때 유용합니다.

 

Range-based for loops

C 스타일의 배열이나 컨테이너에 대한 반복은 인텍스 에러를 발생시키기 쉽고, 또한 이걸 타이밍하는 것은 지루한 일이다. 이러한 에러를 제거하고 더 읽기 좋은 코드를 만들기 위해서 표준 라이브러리 컨터네이너와 기존 배열을 지원하는 범위기반 for 반복문을 사용해라. 더 많은 정보는 여기를 참고하세요 Range-based for statement.

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v {1,2,3};

    // C-style
    for(int i = 0; i < v.size(); ++i)
    {
        std::cout << v[i];
    }

    // Modern C++:
    for(auto& num : v)
    {
        std::cout << num;
    }
}

 

constexpr expressions instead of macros

C와 C++ 매크로는 컴파일전에 전처리기에 위해서 처리되는 토큰이다. 각각의 매크로 토큰은 파일이 컴파일 되기전에 정의된 값이나 표현식으로 교체된다. 매크로는 공통적으로 컴파일 타임에서 상수값을 정의하기 위한 c스타일 프로그래밍에서 사용되었다. 하지만 매크로는 에러를 일으키고 디버깅하기 어렵다. 모던 c++에서는 컴파일 상수를 위해 constexpr 변수를 사용하는것이 더 좋다.

#define SIZE 10 // C-style
constexpr int size = 10; // modern C++

 

Uniform 초기화

모던 c++ 에서는 당신은 어떤 타입이든 괄호 초기화를 사용할 수 있습니다. 이 초기화 형식은 특히 배열이나 벡터 또는컨테이너를 초기화할때 효과적입니다. 예를 들어 v2는 3개의 인스턴스로 초기화 됩니다. v3는 괄호를 사용해서 초기화된 S 인스턴스를 3개로 초기화됩니다. 컴파일러는 v3의 선언된 타입을 통해 각요소 타입을 추론합니다.

#include <vector>

struct S
{
    std::string name;
    float num;
    S(std::string s, float f) : name(s), num(f) {}
};

int main()
{
    // C-style initialization
    std::vector<S> v;
    S s1("Norah", 2.7);
    S s2("Frank", 3.5);
    S s3("Jeri", 85.9);

    v.push_back(s1);
    v.push_back(s2);
    v.push_back(s3);

    // Modern C++:
    std::vector<S> v2 {s1, s2, s3};

    // or...
    std::vector<S> v3{ {"Norah", 2.7}, {"Frank", 3.5}, {"Jeri", 85.9} };

}

더많은 정보는 괄호 초기화를 보세요.

 

Move semantices(이동 의미론?)

모던 C++은 move semantice를 제공합니다. move semantics는 불필요한 메모리 복사를 제거하는 것을 가능하게 합니다. 이전 버전 언어에서는 특정 상황에서 복사는 피할 수 없었습니다. move 연산은 자원의 소유권을 복사 없이 다른 객체로 전달합니다. 일부 클래스는 힙메모리, 파일 처리 등의 자원을 소유합니다. 당신이 자원 소유 클래스를 구현할 때, 당신은 move 생성자와 move 할당연산을 정의할 수 있습니다. 컴파일러는 복사가 필요하지 않는 상황에서 오버로드 해결책에서 특별한 멤버들을 선택합니다. 표준 컨테이너 유형은 정의 되어 있다면 move 생성자를 실행합니다. 더 많은 정보는 여기를 보세요. Move Consructors and Move Assignment Operators(C++)

 

람다 표현식

C스타일 프로그래밍에서 함수는 함수 포인터를 사용해서 다른 함수로 전달될 수 있습니다. 함수 포인터는 유지하고 이해하기 불편합니다. 그 함수는 그 함수가 실행되는 위치에서 매우 멀리 떨어진 소스코드에 정의되어 있을 것입니다. 그리고 그 함수들은 안전한 타입이 아닙니다. 모던 c++은 함수 객체, operator()를 오버라이드하는 클래스를 제공합니다. 그것은 그들을 함수처럼 불리는게 가능하게 합니다.함수 객체를 만드는 가장 편한 방법은 인라인 람다 표현식입니다. 다음 예제는 함수 객체를 전달하기 위해서 어떻게 람다 표현식을 쓰는지 보여줍니다. for_each 함수는 벡터의 각 요소를 실행 시킵니다.

std::vector<int> v {1,2,3,4,5};

int x = 2;
int y = 4;

auto result = find_if(begin(v), end(v), [=](int i) { return i > x && i < y; });

이 람다 표현식 [=](int i){return i > x && i < y; } 은 함수는 "하나의 int 매개변수를 갖고 매개변수가 x보다 크고 y보다 작은 것인지를 나타내는 boolean값을 반환합니다. "라고 해석됩니다. 여기서 주목할 점은 주변 켄텍스트 변수인 x,y는 람다 안에서 사용될수 있습니다. [=] 는 이러한 값들을 캡쳐 되도록 지정합니다. 즉, 람다 표현식은 이런한 값들의 복사본을 갖습니다.

 

Exceptions

모던 C++은 에러를 처리하고 보고하는 최고의 방법으로 에러코드 보다 예외를 강조합니다. 더 많은 정보는 여길 보세요. Morden C++ Best practices for exceptions and error handling.

 

std::atmoic

내부 스레드 통신 메커님에 대해서는 C++ 표준 라이브러리 std::atomic 구초제나 관련 유형을 사용하세요.

 

std:;variant(C++17)

유니온은 보통 C스타일 프로그래밍에서 다른 유형의 멤버타입을 같은 공간을 차지하게 함으로서 메모리 보존을 위해서 사용됩니다. 그러나 유니온은 안전한 방법이 아니고 프로그래밍 에러를 일으킵니다. C++17은 더 강력하고 유니온에 비해 비교적 안전한 클래스인 std:;variant를 제안합니다. std:;visit 함수는 안전한 방식으로 variant 유형 멤버를 접근하는데 사용될 수 있습니다.

See also

C++ Language Reference
Lambda Expressions
C++ Standard Library
Microsoft C/C++ language conformance

728x90
728x90

Rookiss님의 [c#과 유니티로 만드는 mmorpg 게임 개발 시리즈] part2 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

Rookiss님의 [c++과 유니티로 만드는 mmorpg 게임 개발 시리즈] part3 : 자료구조와 알고리즘 강의 내용을 정리했습니다.

 

개념

- [현실 세계의 사물이나 추상적인 개념] 간의 [연결 관계]를 표현한다.

- 정점(데이터, 사물 개념)과 간선(정점을 연결)로 이루어진다.

 

종류

 - 일반 그래프

 - 방향 그래프

 - 가중치 그래프

 

구현방법

- 노드 정의

: 정점이 간선 정보를 포함하는 형태.

struct Vertex
{
	vector<Vertex*> edges;
}

vector<Vertex> v;
v.resize(6);

v[0].edges.push_back(&v[1]);
v[0].edges.push_back(&v[3]);
v[1].edges.push_back(&v[0]);
v[1].edges.push_back(&v[2]);
v[1].edges.push_back(&v[3]);
v[3].edges.push_back(&v[4]);
v[5].edges.push_back(&v[4]);

- 리스트

 : 메모리는 절약. 접근 속도 느림. 정점수가 많고 간선이 적은 경우 유리.

        List<int>[] nodes = new List<int>[]
        {
            new List<int>() { 1, 3},
            new List<int>() { 0, 2, 3},
            new List<int>() { 1 },
            new List<int>() { 0, 1},
            new List<int>() { 5 },
            new List<int>() { 4 },
        };

- 행렬 사용

 : 메모리는 많이 사용하게 됨. 접근 속도 빠름. 정점수가 적고 간선이 많은 경우 유리.

        int[,] nodes = new int[6, 6]
        {
            {0, 1, 0, 1, 0, 0 },
            {1, 0, 1, 1, 0, 0 },
            {0, 1, 0, 0, 0, 0 },
            {1, 1, 0, 0, 0, 0 },
            {0, 0, 0, 0, 0, 1 },
            {0, 0, 0, 0, 1, 0 },
        };

 

 

 

728x90
728x90

666p~

 

참석자 : 김승제, 이용준

기간 : 21-08-09~21-08-10

리뷰 : 21-08-10

 

메모

666p. 어떤 방법을 사용하든지 간에, 모든 협력적인 구현 기법은 오류를 해결하기 위한 목적으로 여러분의 작업을 다른 사람에게 보여주는 것을 형식적으로 만들기 위한 시도이다.

 

667p. 협력적인 개발 방법의 개요 - 서로 간에 차이가 있을지라도 모든 협력적인 구현 기법은 개발자들이 자신의 작업에 있는 문제점들을 제대로 파악하지 못한다는 점과 다른 사람들은 제대로 파악할 수 있다는 점, 그리고 다른 프로그래머가 자신의 작업을 지켜보면 도움이 된다는 기본 개념에 기초하고 있다.

 

671p. 짝 프로그래밍 성공 요건 - 짝 프로그래밍을 강요하지 마라 : 매우 복잡한 코드를 작성할 때 짝 프로그래밍을 사용했던 한 그룹은 15분 동안 칠판에 상세 설계를 한 다음 혼자서 프로그램을 작성하는 것이 더 적절하다는 것을 발견 했다.

 

675p. 정밀 검사에 경영자가 참가하는 것은 일반적으로 좋은 생각이 아니다. 사람들은 검토를 하는 대신 평가를 받고 있다고 느낀다.

 

679p. 정밀 검사에서의 자존심 - 정밀 검사 자체의 핵심은 설계나 코드에 있는 결함을 발견하는 것이다. 다른 대안을 찾거나 누가 옳고 누가 그른지에 대해서 논쟁하는 것이 아니다.

 

680p. 정밀 검사에서의 자존심 - 그럼에도 불구하고, 작성자는 언급된 모든 결함을 인정하고 계속 진행해야 한다. 비평을 인정한다고 해서 작성자가 비평의 내용에 동의한다는 것을 의미하지는 않는다. 작성자는 검토중에 자신이 한 작업에 대해서 방어를 하려고 해서는 안된다. 각 검토자는 오류를 어떻게 해결할 것인지에 대한 작성자의 최종 결정권을 존중해 주어야 한다.

 

728x90
728x90
 

C++ Language Reference

Learn more about: C++ Language Reference

docs.microsoft.com

 

이 래퍼런스는 마이크로소프트 c++ 컴파일로 구현된 c++ 프로그래밍을 설명합니다. 그 기간은margaret eliis 와 bjarne stroustrup, 그리고 ANSI/ISO C++ 국제 표준(ISO/IEC FDIS 14882)에 의해 발표된 c++ 레퍼런서를 기본으로 합니다. 마이크로소프트만의 c++ 특징이 있습니다.

 

모던 c++ 프로그래밍 관행에 대한 개요는 Welcom Back to C++에서 확인 하세요.

 

키워드나 연산자를 빨리 찾으려면 아래 테이블을 보세요.

- C++ Keywords

- C++ Operators

 

이번 섹션에서

어휘 관습

C++프로그램의 기본적인 어휘 요소 : 토큰, 주석, 연산자, 키워드, 구두점, 리터럴. 또한 파일 번역, 연산자 우선순위, 연관성.

 

기본 개념

영역, 연결, 프로그램 시작, 종료. 저장 클래스 그리고 타입들

 

내장 타입들

C++ 컴파일러에 만들어져 있고 그들의 값 범위인 기본적인 타입들

 

표준 변환

내장 타입간의 타입 변환. 또한 산술적 변환, 포인터 변환, 레퍼런스 변환, 포인터와 멤버 타입의 변환

 

선언과 정의

변수, 타입, 함수의 선언과 정의

 

연산자, 우선순위와 연관성

C++ 연산자들

 

표현식들

표현식의 유형, 포현식의 의미, 연산자에 주 참고자료, 캐스팅, 연산자 캐스팅, 런타임 타입 정보.

 

람다 표현식

프로그래밍 기술은 암묵적으로 함수 객체 클래스를 정의하고 해당 클래스 타입의 함수 오브젝트를 생성한다.

 

구문들

표현식, 널, 복합, 선택, 반복, 점프, 선언문

 

클래스와 구조체

클래스, 구조체, 유니온에 대한 소개. 또한 멤버 함수, 특수 멤버 함수, 데이터 멤버, 비트 필드, this 포인터, nested 클래스에 대해서도 설명한다.

 

유니온

 

파생클래스

 

멤버 접근 컨트롤

 

오버로딩

 

에러 처리

 

어썰션과 사용자 제공 메세지

 

탬플릿

 

이벤트 처리

 

마이크로소프트 특정 수정자

 

인라인 에섬블러

 

컴파일러 COM 지원

 

마이크로 소프트 확장

 

비표준 동작

 

Welcome Back to C++

 

관련된 섹션들

런타임 플랫폼을 위한 확장 구성

.Net으로 타겟으로 하는 마이크로소프트 c++ 컴파일러 사용에 다한 참고 재료들

 

C/C++ 빌딩 참고자료

컴파일러 옵션, 링커 옵션, 다른 빌드 도구.

 

C/C++ 전처러기 참고자료

Pragmas, 전처러기 지시어, 미리 정으된 매크로 그리고 전처리기에 관한 참고 재료

 

Visual C++ 라이브러리들

다양한 마이크로소프트 c++ 라이브러리에 대한 시작 페이지 링크 리스트

 

더보기

C 언어 참조문서

728x90
728x90

777p~

 

참석자 : 김승제, 이용준

기간 : 21-07-31~21-08-09

리뷰 : 21-08-09

 

메모

779p. 구현중에 변경하는 것은 일반적으로 원래의 개발자가 수행하고, 보통 프로그램이 완전히 잊혀지기 전에 수행된다. 시스템이 아직 외부에 공개되지 않았기 때문에, 변경 사항을 끝내야 한다는 압박도 일정상의 압박일 뿐이지 시스템이 다운된 이유를 궁금해 하는 500명의 사용자가 아니다. 같은 이유로 구현중의 변경사항은 자유로울 수 있다.

 

787p. 전문가들은 미래의 요구 사항을 준비하는 가장 바람직한 방법은 이론적인 코드를 작성하지 않는 것이라고 말한다. 현재 필요한 코드를 분명하고 직관적으로 작성하여, 미래의 프로그래머가 그 코드가 무엇을 하고 무엇을 하지 않는지 대해서 알 수 있도록 하고 그에 따라 변경할 수 있도록 하는 것이다.

 

790p 데이터 수준 리펙토링 - 컬렉션을 캡슐화 한다 : 만약 클래스가 컬렉션을 리턴할 때, 고정되지 않는 여러 개의 컬렉션을 갖고 있다면 동기화 처리를 어렵게 할 수 있다. 클래스가 읽기만 가능한 컬렉션을 리턴하도록 하고, 컬렉션에 요소를 추가/제거하기 위한 루틴을 제공하도록 한다.

 

791p 명령문 수준 리펙토링 - 조건문을 다형성으로 대체 한다.

 

792p 루틴 수준 리팩토링 - 다운캐스팅을 캡슐화 한다 : 만약 루틴이 객체를 리턴하고 있다면, 일반적으로 루틴이 알고 있는 가장 구체적인 객체의 타입을 리턴해야 한다. 이러한 리팩토링은 특히 반복자(iterator), 컬랙션(collection), 컬렉션의 요소 등을 리턴하는 루틴에도 적용이 가능하다.

 

799p 안전한 리팩토링 - 주차장을 만든다 : 여러분이 리팩토링을 수행하고 있을 때, 때로는 다른 리팩토링을 해야 할 필요가 있을 것이다. 또한 새로운 리팩토링을 수행하고 있을 때, 또 다른 리팩토링이 도움이 된다는 것을 발견하게 될 것이다. 지금 당장 필요하지 않는 변경을 위해서 "주차장"을 만들어 놓는다. 즉, 지금 당장은 변경해야 할 필요가 없지만 어느 시점에서 변경해야 하는 변경사항에 대한 목록을 만들어둔다.

 

799p 안전한 리팩토링 - 빈번하게 체크 포인트를 설정한다 : 리팩토링을 하다보면 코드가 갑자기 엉뚱한 방향으로 가기 쉽다. 여러분이 시작한 코드를 저장하는 것뿐만 아니라, 리팩토링을 하면서 여러 곳에 체크 포인트를 저장하여 막다른 골목에 갔을 때, 작동하는 프로그램으로 돌아올 수 있도록 한다.

 

800p 안전한 리팩토링 - 컴파일러의 경고를 활용한다 : 컴파일러의 경고 수준을 가장 까다롭게 설정하면 많은 오류들을 즉시 잡는 데 도움이 될 것이다.

 

800p 안전한 리팩토링 - 변경 사항을 검토한다 : 작은 변경이 큰 변경보다 오류를 발생시킬 가능성이 더 높은 경향이 있다.

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

암시적 캐스팅

 

명시적 캐스팅

C스타일 캐스팅은 명확하지 못함.

1. static_cast :: 컴파일시 실수를 잡아줌. 값을 변경해준다. 값 또는 부모-자식관계의 포인터에 쓰임.

2. const_cast :: 형을 바꿀 수 없음. const또는  volatile 애트리뷰트를 제거할 떄 사용

3. dynamic_cast :: 매우 안전하지만 RTTI를 켜놔야 작동함. 켜놓지 않으면 static_const와 동일하게 작동한다. (좋은 기능이지만 성능을 중요시하는 경우에는 쓰기 어렵다.)

4. reinterpret_cast(가장 위험한 캐스팅)

 

 

캐스팅 규칙

 안전한것 -> 위험한것

 1. 기본적으로 static_cast

 2. reinterpret_cast :: 포인터와 비포인터사이의 변환. 서로 연관이 없는 포인터 사이의 변환은 그 데이터형이 맞다고 정말 확신할 때만 할 것

 3. const_cast :: 내가 변경권한이 없는 외부 라이브러리를 호춯할 때만 const_cast를 쓸 것

 

인라인함수

코드의 가독성과 성능을 둘다 잡는?

 

일반적인 함수호출 단계는 CPU캐시에 최적이 아닐수도 있다.

 

매크로와 비슷하나 매크로는 사전처리기에서 처리되는 반면 인라인함수는 컴파일도중 체크된다.

 

매크로는 디버깅하기 힘듦(콜스택에 함수이름 안보임, break point 설정 불가, scope준수(글로벌임) 안됨 등). 정말 매크로를 쓸 이유가 있지 않는 한 인라인 함수를 쓰자!

 

인라인은 항상 적용되는게 아니다! 인라인함수 구현체는 헤더에 있어야 한다.

 

간단한 함수에 적합.

 

실행파일의 크기가 증가하기가 쉬움 (실행파일이 작을수록 오히려 cpu캐시하고 잘 작동될 수도 있다.)

 

결론 : 인라인함수를 사용하여 함수호출의 오버헤드를 줄이고 코드 가독성을 높일 수 있으나, 오히려 실행파일의 크기를 증가시켜 속도가 느려질 수도 있다. 때문에 간단한 함수에 적당히 사용하는게 좋을것 같다.

 

static

-extern

-함수속정적변수 :: 함수 범위 밖에서는 접근 불가능

-정적멤버변수

-베스트프랙티스 :: 1. 함수안에 정적변수를 넣지 말것. 대신 클래스안에 (oop관점에서) 2.전역변수 대신 정적멤버변수 쓸것(범위scope 제한을 하기 위해)

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

상속

부모클래스 접근한정자 지정을 할 수 있다.

 

암시적 부모생성자호출

암시적 부모 생성자를 호출할 때는 기본 생성자를 호출한다. 따라서 부모에 기본생성자가 존재하지 않는다면 컴파일 에러가 발생한다.

소멸자는 하나밖에 존재하지 않으므로 자동으로 자식 소멸자 호출후 부모 소멸자가 호출된다.

 

함수도 메모리에 존재한다

 

정적바인딩, 동적바인딩

java는 기본적으로 부모 클래스는 가상함수이기 때문에 실체에 따라서 메소드를 호출하는 반면

c++은 virtual 키워드로 가상함수를 만들어 놓지 않으면 무늬에 따라서 호출된다.

java는 기본적으로 가상함수인걸 막기 위해선 final 키워드를 사용해야한다.(조금이라도빨라짐)

c++에서 virtual 키워드를 생략하면 정말 큰일 날 수 있다.

 

가상테이블(점프테이블,룩업테이블)

면접문제로좋음

 

가상소멸자

부모 클래스 소멸자를 virtual로 지정하지 않아서 자식 객체를 지울때 정상적으로 자식 객체의 소멸자가 실행되지 않아 메모리 누수가 발생할 위험이 있다.

부모 소멸자가 virtual이면 자식도 virtual이 되지만 습관적으로 부모 자식 둘다 virtual을 넣어두자. 누군가 또 자식을 상식 받게될 수도 있으니..

모든 클래스마다 가상 소멸자를 추가할것!!! 가상함수는 느리지만 혹시 모를 메모리 누수보다 낫다.

 

다중상속

c++만 유일하게 지원한다. 다중상속일 지원하기 떄문에 super키워드를 사용할 수 없다.

 

다중 상속 대신 인터페이스를 사용해라 (자바처럼)

 

추상클래스

순수 가상함수를 가지고 있는 클래스. 개체를 만들 수 없음

 

인터페이스

c++는 인터페이스를 지원하지 않음. 그래서 순수 추상클래스를 이용하여 흉내가능하다.

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

복사생성자

c,java(대신 클론함수 생성해서 구현하긴 한다)에는 없다

Vector(const Vector& other);

다른 개체를 이용하여 새로운 개체를 초기화

암시적 복사 생성자(얕은 복사) 기본 복사 생성자는 없으면 알아서 만들어준다.

 

얕은복사 , 깊은복사 String(const String& str)

클래스에 포인터형 변수가 있으면? 얕은 복사의 경우 문제가 된다. (데이터 공유로 인한.. 데이터 수정 데이터 삭제등)

이럴경우 직접 깊은복사 생성자를 구현해야한다.

 

연산자 오버로딩

 

friend 키워드

클래스나 함수시그니처에 지정 가능

다른 클래스나 함수가 나의 prviate 또는 protected멤버에 접근할 수 있게 허용

(약간 oop 안티패턴  friend를 남발하면 문제가될듯..)

자바는 유사하게 접근지정자를 지정안하면 한 package안에서 서로 클래스간에 접근가능하게 한다.

 

연산자 오버로딩과 const

기본적으로 매개변수 메소드에 전부 const를 붙이고 작업하는게 좋다. 컴파일시 문제가 될때 const를 제거하는 식으로

 

연사자 오버로딩 남용하지말것

모든 자유로운것에는 실수의 여지를 준다. 조심히 사용해야함.

차라리 함수를 만들어라.

 

대입연산자

대입연산자도 복사 생성자와 비슷역할을 하나 생성, 소멸되는 과정 처리가 안되어 있음

복사 생성자를 구현하면 대입연산자도 구현해야할 수 있음. 

대입연산자도 기본으로 생성된다.

 

암시적 함수들을 제거할 수 있다

기본함수들 생성자, 복사생성자, 소멸자,대입연산자

private 영역안에 선언해 놓는다. (전통적인 방식)

 

 

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

c++ OOP특징

 

클래스

개체

생성자

함수 오버로딩

힙에 개체 생성하기

 

(자바에서는 불가능)

스택에 개채 생성하기

복사 생성자

소멸자

연산자 오버로딩

 

 

oop 핵심 개념  == 사람들이 세상을 바라보는 방식

 

java,c#은 클래스 인스턴스화시 멤버를 초기화값 (정수는 0)으로 초기화한다.

c++는 멤버를 메모리할당만하고 가비지 값 상태로 그대로 둔다

 

c에 없는 기능이 다른 언어에 있다면 누군가 구현한 것이고 어떻게 구현했을까 생각해보기


new/delete  와 malloc/free 의 차이는?(스스로 찾아보기)

malloc은 메모리 동적할당만 가능하고 초기값을 지정할 순 없다.

new는 할당과 동시에 초기화가 가능하다. 대신 malloc은 realloc으로 재할당이 가능하다. 

 

C++는 초기화리스트를 통해 생성자에서 초기화한다

 

기본 생성자는 없으면 자동적으로 만들어준다. 생성자가 있으면 기본생성자 만들지 않는다.

 

C++에는 Destructor 소멸자가 있다! 객체 안에서 할당된 메모리를 직접 해제 해줘야한다.

 

메소드에 붙는 const :: 개체를 수정할 수 없다.

 

struct와 class 차이

c++에서 struct와 class는 완전히 똑같다. 다만 기본접근권한이 struct는 public class는 private이다. 

컴퓨터는 struct와 class를 구분하지 못한다. 컴파일러는 구분한다.

c++는 구조체를 클래스처럼 쓸 수 있지만 구조체는 c 스타일로 pod(plain old data) 형태로 쓰자.

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

fstream

파일 스트립에도 조정자 쓸 수 있음

 

close

ifstream(c++)의 경우 scope를 벗어나면 객체가 소멸되면서 알아서 close()된다.

명시적으로 표현하고 싶거나 scope내부에서 일찍 닫고 싶을때 close()를 해준다.

 

get(),getLine(),>> (문자,문장,단어)

 

stream을 읽을때 잘못된 케이스

테스트 케이스를 생각해야한다.

 

eof, failt bit 처리 신경써야함

 

Best practice

여러개의 상황을 가정하고 그 상황을 핸들링하는 역량이 필요.

훌륭한 테이스 케이스를 상정 잘 해야함

 

endl과 \n차이

endl는 flush 된다

 

>>를 getline과 같이 쓰지 말것

 

 

 

 

 

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

[C++/공부/강의/POCU3200/정리]string

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

string

string은 배열이 아니라 별도의 클래스다

char[] 을 이용한 string은 배열 크기를 지정해줘야하고

이로 인해 안정성면에서 문제가 생길 수 있다.

string은 이런 문제를 해결해준다.

 

string 관련 메소드

size()

주로 length보다 size를 씀

length()

lenght와 size 차이는 ??

c_str()

const char 배열(c 스타일 문자열) 첫번째 포인터를 반환한다.

c기반으로 돌아가는 경우 프로그램과 동작할 경우 중요한 함수다.

at()

배열 방식을 쓰지 생각보다 많이 안씀. 

 

sstream

string 이 많이 쓰이면 쓴다.

string stream 이라는 소리

 

console이 아니라 string 으로부터 데이터를 읽고 내보내는 스트림

cout,cin의 iostream과 비슷하나 잘 쓰이지 않음

 

C헤더 사용

c++프로젝트에서도 성능상의 이유로 c헤더를 많이 쓴다.

 

그래서 string과 char[] 차이는?

string이 동적으로 length 가 길어나는 과정에서 속도 저하가 생긴다.

 1. 힙메모리할당은 느림

 2. 힙메모리할당에의한 메모리 단편화

 3. 내부버퍼증가로인해 멀티 쓰레드 환경에서 lock처리를 잘못해서 문제가 될수도

 4. c++ 쓰는 업계가 어디인가?

 

c#,java 대신 c++공부를 하는 이유에 대해서 생각하고 편한 기능 이전에

기능의 원리를 이해하고 최적화된 방법을 공부해야겠다.

 

때문에 여전히 sprintf, char[] 를 매우 많이 사용

 

 

728x90
728x90

일련의 프로세스가 정형화 되어 있고 각 프로세스의 변경사항이 있을 경우

템플릿패턴 형태로 관리하면 효율적일 것 같다.

 

UML

https://www.youtube.com/watch?v=qr7I18Lhsl8

소스코드

using System;

namespace Template
{
    class Program
    {
        static void Main(string[] args)
        {
            //input data
            string clientInfo = "";
            string sendData = "";
            string resultData = "";


            //기본접속
            AbstConnectProcess connectHelper = new DefaultConnectHelper();
            connectHelper.Connect(out resultData, clientInfo, sendData);
            Console.WriteLine("default connect result :: " + resultData);

            //표준접속
            connectHelper = new StandardConnectHelper();
            connectHelper.Connect(out resultData, clientInfo, sendData);
            Console.WriteLine("standard connect result :: " + resultData);


        }
    }
}
namespace Template
{
    public abstract class AbstConnectProcess
    {
        //자식 클래스 외에는 접근하지 못하도록 projected 로!
        protected abstract void CheckServerState(string clinetInfo);
        protected abstract void CheckSecurity(string clientInfo);
        protected abstract void SendData(string sendData);
        protected abstract void ReceiveData(out string resultData);

        //override 되지 않도록 virtual 선언하지 않도록
        public void Connect(out string resultData, string clientInfo, string sendData)
        {
            CheckServerState(clientInfo);
            CheckSecurity(clientInfo);
            SendData(sendData);
            ReceiveData(out resultData);
        }

    }
}
using System;

namespace Template
{
    class DefaultConnectHelper : AbstConnectProcess
    {
        protected override void CheckSecurity(string clientInfo)
        {
            Console.WriteLine("기본 보안 체크");
        }

        protected override void CheckServerState(string clinetInfo)
        {
            Console.WriteLine("기본 서브 체크");
        }

        protected override void ReceiveData(out string resultData)
        {
            Console.WriteLine("기본 데이터 수신");
            resultData = "기본 연결 성공";
        }

        protected override void SendData(string sendData)
        {
            Console.WriteLine("기본 데이터 송신");
        }
    }
}
using System;

namespace Template
{
    class StandardConnectHelper : AbstConnectProcess
    {
        protected override void CheckSecurity(string clientInfo)
        {
            Console.WriteLine("표준 보안 체크");
        }

        protected override void CheckServerState(string clinetInfo)
        {
            Console.WriteLine("표준 서브 체크");
        }

        protected override void ReceiveData(out string resultData)
        {
            Console.WriteLine("표준 데이터 수신");
            resultData = "표준 연결 성공";
        }

        protected override void SendData(string sendData)
        {
            Console.WriteLine("표준 데이터 송신");
        }

       
    }
}

 

출력결과

728x90

'Skills > DesignPattern' 카테고리의 다른 글

[DesignPattern]FlyWeight  (0) 2020.03.12
728x90

https://ko.wikipedia.org/wiki/%EC%95%84%EB%84%A4%EB%A5%B4%EC%8A%A4_%ED%95%98%EC%9D%BC%EC%8A%A4%EB%B2%A0%EB%A5%B4

728x90
728x90

포큐아카데미 c++3200강의 내용을 개인학습용으로 정리한 내용입니다.

 

c++의 진짜 전문가는 사용하지 말아야할 기능을 아는 사람

 

Reference(참조)

포인터를 사용하는 좀 더 안전한 방법

c/c++은 포인터 변수를 사용해야 참조에 의한 접근이 가능하다.

c#,java 같은 경우는 기본자료형의 경우에는 값의 의한 접근, 객체(string도 객체타입)는 참조에 의한 접근을 한다.

오히려 c#,java가 포인터를 개념을 없애면서 편의성을 제공하려고 했지만

일관성은 없어 보인다. java는 함수매개변수로 참조의 의한 접근을 위해 ref 키워드를 사용하는 것으로 알고 있다.

c/c++는 함수에서 객체를 매개변수로 받아도 stack에 할당되어 값에 의한 참조가 된다.

 

c++에는 참조의 편의를 위한 int& 가 있다. 

'&변수' 와는 연관이 없으니 헷갈리지 않도록 하자.

실제로 참조와 포인터는 내부적으로 다르지 않다. 

단지 인간의 편의를 위한것.

참조를 별개의 개념으로 보지 않고 단순히 포인터 참조를 

안전하게(?) 가독성 좋게 쓸수 있는 용도? 뿐이라고 생각하는게 맞을거 같다.

참조의 사용은 null처리, 포인터연산 등의 예외처리를 덜어주어 안전하다.

 

`

코딩표준

사용자 실수로 인한 크러쉬를 줄이기 위해 이런 코딩표준을 사용하기도 한다.

 

 

 

 

728x90

+ Recent posts