저녁을 빠듯하게 먹고 강의를 듣기위해 왔지만 역시 체할 것 같습니다.

 

==========================  1  =========================

 

(19:00 ~ 19: 50)

 

어제의 수업이야기로 시작을 하시면서 관계형 DB의 경우에 Select하는 경우를 MongoDB의 경우와 비교하여 설명을 해 주셨습니다.

 

RDB의 order by의 경우는 sort method를 통해서 처리할 수 있다고 하셨습니다.

 

MongoDB

실행하는 법을 잊었습니다.

 

오늘은 꼭 기억하도록 하겠습니다.

 

먼저 서버용 Shell을 수행하는 명령어는... 아!

 

mongod 라는 명령어를 수행하면 됩니다. 하지만 그 경우에 mongoDB를 설치한 드라이버로 이동을 해야 합니다. 즉, 기본경로인 C: 드라이버가 아닌 경우는 다른 드라이버로 이동을 해서 위의 명령어를 수행해야 합니다.

 

그리고 또 사용할 CMD창에는

mongo 라는 명령어를 사용하시면 몽고디비를 사용할 수 있습니다.

 

1_1 projection에 대한 실습을 하였습니다.

 

1_2 정렬을 한 예, 어제 실습때 이름에 공백을 넣어서 보다 원활한 실습결과 확인에 문제가 있었습니다.

 

 

1_3 limit 관련 정보

 

 

고유 인덱스

 

 - 중복 제거하기 (dropDups 옵션)

임의로 삭제를 해서 가급적 주의하여 사용해야 합니다.

 

 

1_4 index

 

1_5 index 확인

 

1_6 explain()    

 

1_7 text index

 

1_8 여러 문자열 (단어단위로 조회)

 

여러 문자열을 ""안에 넣으면 원하는 조회결과를 얻지 못할 수 있습니다. 무슨 이야기인가 하면, 저는 자동차 커뮤니티에 대한 정보를 조회하고 싶어서 아래와 같은 명령을 수행하였습니다. 자동차 커뮤니티에 관한 정보만 (단 한건) 조회 될 것이라고 예상을 할 수 있지만, 그 결과는 아래 사진과 같습니다.

 

db.community.find({$text: {$search: "자동차 커뮤니티"}})

 

이와 같은 결과가 나온 이유는 해당 ""안의 '자동차'와 '커뮤니티'를 각각의 단어로 하여 두 단어를 이름에 포함하는 모든 커뮤니티가 조회 된 것입니다. 따라서 위의 "자동차 커뮤니티" 를 완전하게 포함하는 이름의 커뮤니티만을 조회하고 싶다면 아래와 같은 명령을 입력해야 합니다.

 

db.community.find({$text: {$search: "\"자동차 커뮤니티\""}})

조회에 정상적으로 한 건을 성공하였습니다.

 

==========================  2  =========================

 

( 20 : 03 ~ 20 : 53 )

 

다중 키 인덱스

 

공간정보 인덱스

 

집계 -> 간단하게 설명하고 넘어가기로 하였습니다.

 

또한 그 후에는 장애복구 방법에 대해 교육을 해 주신다고 하였습니다.

 

 

<강의자료 외의 내용>

 

복제 set

 

몽고디비는 단일 node로 운영하지 않습니다. master/slave 방식과 복제셋(ReplecaSet) 방식이 있다고 하셨습니다. 전자의 경우는 마스터가 죽을경우 복구를 할 방법이 없습니다. 후자의 경우에 마스터 서버가 죽을경우 여러 슬레이브중에 하나가 마스터로 자동으로 선택이 됩니다. 서버노드의 최소 개수는 3개입니다 (마스터, 슬레이브, 중재자 각 1개씩) 슬래이브를 2개 이상두는것이 보편적이라고 하셨습니다.

 

mongo --port 40000  -> local에서 접속을 하는 방법

 

mongo --port 40000

 

 

 

 

 

뭔가 창을 4개 이상을 띄워놓고 작업(실습)을 하다보니 햇갈리고 3개 창에 연 서버중에 하나가 정상적으로 동작을 하지 않아서 실습을 따라가지 못했습니다.

 

 

못따라 오셨다면 이번 실습에 관한 자료를 정리하여 주신다고 하셨지만 뭔가 확신을 할 수는 없을 것 같습니다.

 

==========================  3  =========================

 

( 21 : 05 ~ 21 : 53 )

 

계정에 대해서 수업을 해 볼까요? 라는 질문으로 수업을 시작하셨습니다.

 

몽고디비는 샤딩, 분산처리등을 사용하기가 편하고 접근 권한을 설정하면 앞의 기능들에 제약이 생겨서 접근권한을 설정하지 않고 사용하는 경우도 많다고 하셨습니다.

 

서버를 늘리려면....

os설치하고 db구성 하고 app설치하고.... 꽤나 하루정도는 잡고 해야된다고 하셨습니다.

 

므튼 요지는 접근권한을 두지 않고도 운영을 할 수 있다는 것이 핵심이라고 하셨습니다.

 

3_1 계정생성

3_2 계정 확인

3_3 namoouser 접속 (계정 이름이 오타입니다.... 애 먹었습니다...)

 

 

DB dump 뜨고 복구하는 것을 해 본다고 하셨습니다.

 

 

3_4 dump

 

3_5 db drop

 

3_6 복구

 

 

mongodb_lec.txt: 강사님 코드자료입니다.

 

몽고디비_실습_코드 160511.txt

오늘도 회사에서의 다사다난(?)한 하루를 마치고 교육을 들으러 왔습니다.

 

회사에 다시 돌아가서 일을 하고싶다는 생각이 실로 오랜만에 드는 저녁입니다.

 

 

=========================   1   =========================

 

( 19:00 ~  19:55 )

 

Mongo DB는 문서 DB에 해당하는 DB라고 어제의 복습을 간단하게 이야기 해 주시고 수업을 시작하셨습니다.

 

https://www.mongodb.com/ 에서 다운로드를 받으시면 되지만 강의시에는 다운받는 것을 강사님께서 배포해준 압축 파일을 가지고 진행을 할 예정이라고 하셨습니다.

 

mongo DB site에서 문서 확인하는 법을 알려주셨습니다.

 

https://docs.mongodb.com/v3.0/tutorial/

 

mongo DB는 문서형 DB로 자료가 저장되는 형태를 보면 Jason의 구조와 유사합니다. 또한 자바 스크립트의 리터럴 객체 구조와 유사합니다.

 

{}(중괄호)로 열고 닫는 것이 하나의 문서입니다. 필드의 이름에는 인용부호("")가 들어가도 되고 들어가지 않아도 됩니다. javascript와 유사하게 data를 처리합니다. ""안에있으면 문자열 , 아니면 숫자 라고 하셨습니다.

 

문서 안에 배열을 두고 그 배열 안에 문서를 넣어서 1대다 구조를 표현합니다.

 

Mongo DB는 자바스크립트와 유사한 부분이 있습니다. NoSQL은 Join이 되지 않기때문에 문서안에 내장된 문서가 join을 지원하지 않는것을 어느정도 보완 해 줍니다.

 

MongoDB는 문서를 컬랙션으로 모으고 그러한 컬랙션이 모여서 데이터베이스를 이룹니다. 각각의 DB는 각각의 file system으로 관리됩니다.

 

앞으로는 편의를 위해 한글로 몽고디비를 표기하겠습니다.

 

기본적인 경로가 아닌 다른 경로에 DB를 저장하면서 몽고디비를 사용하고 싶다면 아래와 같은 명령어를 입력하시면 됩니다.

 

mongod --dbpath <<경로>>

 

 

 

 

CMD창에서 DB를 시작한 화면입니다. (서버)

 

 

 

위의 화면은 몽고디비의 쉘 화면입니다. mongo라는 명령어로 시작할 수 있습니다.

 

 

몽고디비에서 함수를 만들고 사용해 본 화면입니다.

 

 

 

 

 

 

 

 

7. 기본적으로 index관련된것이 하나 생성되고 그 외에 생성한 mycollection을 볼 수 있습니다.

 

 

 

8.9

find()는 목록을 볼 때, findOne()는 단건(한 건)을 볼 때 사용할 수 있습니다.

 

 

 

 

9 컬랙션을 조회하는 2가지의 방법입니다.

 전자가 일반적이며 후자는 특별한 경우에 사용합니다. (강의자료 49페이지 참고)

 

 

 

10. 실습을 진행한 화면입니다.

 

PDF에서 복사와 붙여넣기를 하면 정상적으로 실행이 되지 않는 것을 확인하였습니다.

 

 

 

=========================   2   =========================

( 20:09 ~  20: 51)

 

살을 빼려면 커피믹스를 끊어라! 라는 명언과 함께 두 번째 시간의 강의 를 시작하셨습니다.

 

 

 

 

 

조회를 할 때 일부분만 일치하는 경우를 조회하고 싶은 경우에 대해서는 추후에 소개를 해 준다고 하셨습니다.

 

update는 문서를 통째로 갱신을 합니다. 쉽게 말하면 치환, 즉 일부분만을 갱신하는 것이 아닙니다.  ( _id 는 바뀌지 않습니다. )

 

 

 2_3 쿼리 추가 후 조회

 

 

 2_4 맴버 및 프로퍼티 추가

 

 2_5 update 및 확인

 

 2_6 count and delete

 

 

 2_7 잘못된 업데이트

 

 

2_8 잘된 업데이트 (의도가 서브도큐먼트로 추가하는 것)

 

위의 2_7과 2_8에서 보여주는 것은 업데이트를 할 때 문서안에 문서의 형태로 정보를 저장하고 싶다면 한번 더 감싸주는 형태로 처리를 해야 하는 것을 보여주고 있습니다.

 

=========================   3   =========================

( 21:02 ~  21: 51)

 

 

지난시간에 이어 member를 입력해보는 것을 해 보겠습니다.

member는 배열으 형태로 문서를 넣을 예정입니다. 또한 push라는 키워드를 사용하여 추가할 예정입니다. 필드가 없을 경우 새로 만들어 주며 배열로 초기화가 됩니다.

 

 

 

3_1 일:다 관계를 표현하기 위해서 문서로 감싸서 정보를 저장하는 방법을 사용 한 실습입니다.

 

서브도큐먼트에 대한 조건으로 조회를 하는 것을 확인하는 실습

 

3_2 find by subdocument

 

배열을 기준으로 조회하는 다른 방법

 

 

 

3_3 배열의 원소를 비교하여 조회

 

도큐먼트 안에 또 도큐먼트가 들어가는것에 대한 관계를 잘 이해하라고 하셨습니다.

 

 

 

 

 

위의 실습 화면에서 기존에 서브도큐먼트에 존재하던 member 이순신이 빠진것을 확인할 수 있습니다.

 

 

3_4_2 강감찬도 빼보기

 

위의 pull 키워드를 사용한 업데이트를 통해서 서브도큐먼트의 문서로 들어가있던 member 강감찬도 빼서 update를 하였습니다.

 

강사님께서는 가장 전형적인, 보편적인 방법을 소개해주는 것이고 메뉴얼, 관련 문서를 보면 더욱 다양한 방법으로 질의를 하는 것을 확인할 수 있다고 하셨습니다.

 

 

 3_5 unset 키워드를 사용

3_5_2 unset 키워드를 사용

 

등록된 필드를 날리기(?)위한 키워드라고 보시면 된다고 하십니다.

 

 

3_5_3 openDate도 날려보았습니다.

 

 

 

_id는 ObjectId형입니다. 문자열이 아닙니다.!!!!!

 

이 키값은 유일한 값입니다. 하지만 검증을 해보지 못하셨다는 강사님...

 

12bytes로 구성되어 있어서 24자리 16진수 문자열로 표현할 수 있습니다.

 

 

 

Timestamp : 1970년 1월 1일 이후 초단위 타임스탬프
Machine : 컴퓨터의 고유 식별자 (보통 서버 호스트명의 해쉬 값)
PID : 생성 프로세스의 식별자(PID)
Increment : 1초내 단일 프로세스의 고유성을 책임지는 증가 카운터

<출처: 강의자료>

 

 

비교 연산자

$gt -기준값 보다 크다                 <greater then>
$gte - 기준값 보다 크거나 같다
$lt - 기준값 보다 작다
$lte - 기준값 보다 작거나 같다
$ne - 같지 않다                         <not equal>
$nin - 존재하지 않는다

 

 

3_6 and와 or 키워드의 활용

 

 

 

 

몽고디비 실습 코드.txt

 

수업을 들은 이후로 이번이 9번째, 10번 수강이라는 목표를 달성하기 위해 들은 수업이기도 하지만 새로운 것을 점점 접하기 어려워 지는 것 같아 가장 생소하면서도 궁금했던 수업을 신청하였습니다.

 

이번 수업에는 교제가 없어서 뭔가 시작부터 조금은 당황스럽습니다. 내일부터는 딱히 펜을 준비할 필요도 없을 것 같습니다.

 

강의실에 늦지 않은 시간에 도착했음에도 불구하고 그동안 2번은 앉았던 것 같은 자리는 다른분께서 먼저 앉으셔서 간단하게 저녁을 때우고 수업을 듣기위해 그 뒷자리에 앉아 준비를 합니다.

 

 

=================================    1    ==============================

(19:08 ~ 19:54)

 

강의자료는 PDF파일로 받았으며 강사님의 자기소개 및 수강생의 각각 자기소개가 있었습니다.

 

우선 자바개발자인 강사님의 확인 및 소개 중간중간 질문도 하셨습니다.

 

NoSQL의 개념부터 차근차근 실습 위주로 수업을 진행한다고 하셨습니다. 자바 기반으로 실습을 진행한다고 하셨으며 자바 개발자가 생각보다 적어서 걱정을 하셨습니다.

 

 

MongoDB를 갖고 Java Script를 할 수도 있다고 하셨습니다.

 

full stack이 요즘의 대세라고 하셨습니다. full stack framework는 하나만 익히면 다 된다고 하셨습니다.

 

NoSQL DB는 스키마가 없어서 스타트업 기업에서 많이 씁니다. 제품화가 쉽고 개발 속도가 빠릅니다.

 

 

NoSQL의 정의

 

전통적인 RDBMS와 차별적화하는 의미로 사용되기도 합니다.

NoSQL은 SQL이나 RDBMS를 배제하지 않습니다.

(Not only SQL)

 

NoSQL은 빠르고 효율적인 처리에 초점을 두었습니다.

 

NoSQL은 row이상이다. key , value쌍으로 저장을 하기도 합니다.

( 그래프, 컬럼- 페밀리, 문서, 테이블로우 등... )

 

스키마가 없고 조인으로부터 자유롭습니다(조인을 지원하지 않음)

 

MongoDB로는 join을 피하는 방법으로 설계를 해야 합니다.

 

컬랙션 설계에 대해서 추후에 실습진행 시 설명을 추가로 해 준다고 하셨습니다.

 

 

NoSQL의 4가지 저장소

 

1) 키 벨류 저장소

2) 컬럼 페밀리 저장소

3) 그레프 저장소

4) 문서저장소

 

site를 하나 알려주신다고 하셨습니다. 만 강의 시작 전 칠판에 주소만 적어주시고 강의자료라고 알려주지 않으셨다며 강의자료에 대해 한번 안내해주셨습니다.

Namoosori-MongoDB(ver2.21).pdf

 

=================================    2    ==============================

(20:08 ~ 20:48)

 

이전 시간에 알려주신다고 하신 site는 nosql-database.org입니다.

 

site소개 후 위의 4가지 저장소에 대한 특징에 대해 설명을 이어 진행하셨습니다.

 

위의 4번의 문서저장소는 저장 단위가 하나의 문서입니다. 즉, web page하나의 화면이 하나의 저장 단위가 되기도 합니다.

 

컬랙션이 관계형 DB의 table이라고 생각을 해도 된다고 설명을 해 주셨습니다.

 

NoSQL의 종류에 따른 검색 추이를 보여주시면서 MongoDB에 대한 관심도가 높아지는 것을 확인할 수 있었습니다.

 

 

NoSQL 비지니스 드라이버

 

1)용량

2)속도

3)다양성

4)민첩성

 

NoSQL은 스키마가 없기 때문에 DB변경에 관계형 DB보다는 유연하게 개발을 할 수 있습니다.

 

1.5배정도 더 빠른 개발이 가능하다고 합니다. 또한 MongoDB와 같은 빨리 개발이 가능한 것으로 개발을 하고 빨리 상품화를 한 후 상품 출시 현황을 보고 관계형 DB로 바꾸는 것도 소개를 해 주었습니다.

 

그렇게 진행하는 이유는 원래 DB가 정교하게 설계 및 관리되어있어야 하지만 출시를 위해 속도를 앞당기는 경우 프로토타입 DB식으로 개발을 하는 것이라고 설명을 해 주셨습니다. 또한 RBD(관계형 DB)를 사용하는 또다른 이유는 트렌젝션 문제입니다.

 

Data가 엄격하게 저장되어야 하고 Transaction이 엄격하게 지켜져야 하는 경우는 RDB를 사용하야만 하며 빠른 반응속도가 필요한 경우에는 NoSQL DB를 혼용해서 사용하는 경우도 있다고 하셨습니다.

 

특히 연구과제의 예를 들어서 비관계형디비(?)를 사용할 수 있다고 하셨습니다.  Main은 관계형 DB라는것이 아직은 깰 수 없는 대세(?)라는 느낌의 이야기를 해 주셨습니다. 완벽하지는 않지만 NoSQL가 성능 뿐 아니라 관계형 DB를 대체할 수 있도록 발전을 하면 대체할 수 있을 것이라고 하셨습니다.

 

구글 검색엔진의 동작 방식을 설명 해 주셨습니다. (강의자료 12페이지 참고)

키 - 벨류 방식으로 저장을 하여 Data의 구조를 단순하게 만들어서 활용합니다.

 

Main DB보다는 보조용 DB로 추천을 하였음.

 

 

 

=================================    3    ==============================

(21:00 ~ 21:48)

 

 

첫날에는 실습 및 환경구축을 할 수 있을지 없을지 확신이 서지 않는다는 말씀으로 마지막 시간의 강의를 시작하셨습니다. 

 

급 프로그래밍 언어에 대한 이야기를 시작하시면서 C언어를 배웠던 옛 시절을 회상하시고 메모리 할당과 해제 부분에서 좌절을 하셨다는 이야기를 해 주셨습니다. Java의 경우에는 메모리 해제를 개발자가 해 줄 필요가 없기 때문에 편했다는 이야기도 하셨습니다. 자바와 자바 스크립트 차이를 설명해주셨습니다. 왜....? 인지는 모르겠지만 도움이 될 것이라 생각하고 듣고 있습니다.

 

자바의 경우에는 한번 배포가 되면 수정 후 재 배포를 해야하지만 자바스크립트의 경우에는 이와 같은 과정이 필요 없다고 하셨습니다.

 

shell에서 java script를 사용할 수도 있다고 하셨습니다. 또한 요즘 자바스크립트가 중요해 지고 있다는 것에 대해 설명을 해 주셨습니다. 그 이유중에 하나로 API의 활용이 증가 한 것과 새로운 환경으로 변하면서 동적으로 화면구성이 이루어 지면서 중요해 졌다고 하시면서 직접 UI관련 개발까지 본인이 한다는 이야기도 해 주셨습니다.

 

여러 이유로 자바스크립트가 갈수록 중요해 질 것이라고 하셨고, 비동기 처리를 해야하는 경우에 함수지향형 언어가 유리하다고 하셨습니다. call back처리가 자바스트립트에서는 편리하다고 하셨습니다.

 

(요즘 트렌드는 여기까지로 갈음한다고 하셨습니다......)

 

관계형DB이전에는 file system!

 

 

유닉스의 파이프를 사용한 명령어의 처리를 응용하여 만들었다고 하셨습니다.

 

레이어페턴이 등장한 이유는 복잡성을 낮추기 위함이라고 하셨습니다.

 

레이어로 나누어서 위에서 아래 방향으로 호출을 합니다.

 

1. UI 레이어

2. 비지니스 로직 레이어

3. 데이터베이스 레이어

 

code안에서 쿼리를 날리는? code를 컨설팅을 한 경험을 이야기 해 주셨습니다. 개발자들이 계속 바뀌면서 style이 없어지고 그러한 것들로 인해 생기는 문제의 예로 소개해주셨습니다. 그러면서 Layer를 만들어 처리하는 것을 강조하셨습니다.

 

NoSQL DB에서 Application을 개발을 하는데 RDBMS의 트렌젝션, 케싱등의 기능을 사용하려면 어플리케이션 단에서 개발자가 구현을 해야합니다.

 

강의자료 22페이지의 모델간의 통합 모델을 도메인 단위로 나누는 이유는 복잡하게 얽혀있으면 따로 분리하기가 쉽지 않다는 것입니다. 즉, 따로 중복을 허용하면서 관리를 하면 일부분의 도메인 모델만을 이식하여 분산처리를 하는 것 또한 가능합니다.

일부분만 변경이 되었으면 그 부분에 해당하는 것만 배포를 하면 된다는 것 또한 장점입니다.

 

 

ACID 트랜잭션은 Lock을 걸고 base 트랜잭션은 lock을 걸지 않습니다.

 

3~4개의 node를 하나의 클리스트링으로 묶습니다. 또한 NoSQL는 메모리를 RDB보다 많이 사용합니다. 또한 클리스터 하나당 2개의 랙으로 나누어 사고(예로 정전.)에 대비해야합니다.

 

분산된 네트워크 상에서 분산처리를 하는데 키값이 중복되면 안됩니다. 키 값을 가지고 충돌방지를 해야 한다고 하셨습니다.

<이 부분은 이해가 잘 되지 않았음 .. 너무 뻔한 이야기 아닌가? 싶었습니다.>

 

트랜잭션을 설명해 주시면서 기본적인 block 개념의 장 단점을 설명해주셨습니다. NoSQL의 경우 lock을 걸지않고 일단 주문을 받습니다.

 

base 트랜잭션은 그동안의 RDB의 트랜잭션과 달리 보상이라는 개념을 갖고 추후에는 결과가 정상적이 될 것이다라는 사고의 트랜잭션입니다.

 

DB샤딩

 

샤딩이란 운영중에 노드를 추가하고 데이터의 일부를 새로운 노드로 옮기는 것을 말합니다. 샤딩을 할 때에도 Data를 나누는 기준을 잘 세워야 합니다. Data를 어떻게 나누느냐에 따라서 성능 차이가 발생할 수 있기 때문입니다.

 

CAP 이론은 시스템이 실패 할 경우에 어떤것을 우선시 할 것인지를 보는 것이라고 생각하시면 됩니다.

 

1) Consistency

2) High Availability

3) Partition Tolerance

 

위의 조건중에 어떤것에 초첨을 두느냐에 관한 이론으로 1)과 2)는 트레이드 오프 관계로 3가지 조건을 모두 최선으로 고려할 수 없습니다.

 

요약으로 레이어드 아키텍쳐를 사용하여야 한다는 것을 강조하셨습니다.

(나머지는 강의자로 페이지 35참고)

 

강의 막바지에는 강사님의 사업 경험으로 main DB를 RBD로 하고 일부만

NoSQL DB를 사용하는 것을 추천 하시면서 하나의 사례를 들어주셨습니다.

 

main으로 MongoDB를 사용하겠다면 한번 더 공부하고 검색하고 고려해보기를 권하셨습니다.

 

 

쑥스럽고 별로 볼 사람도 없지만 지극히 평범하고 계획도 없이 보고 싶은 몇 가지를 위해 런던으로 떠났던 경험을 살려 런던여행의 추억을 되짚어 보며 누군가에게 도움이 되기를 바라며 글을 한번 써 보겠습니다.


혼자 놀기의 달인답게 문답식으로 적어보도록 하겠습니다.


문. 런던 여행 계획...은 어떻게? 왜 런던이지?


답. 위의 들어가는 말에서는 분명 계획도 없다고 해놓고 무슨 말인가 싶으시겠지만 저에게 런던은 세상에서 가장 가 보고 싶은 도시였습니다. (중의 하나도 아니었음)

2014년 초 3년짜리 일기장을 하나 구입하게 되었습니다. 14년을 미국에서 인턴과정을 예정 한 상태에서 그 1년 후에 제가 번 돈으로 꼭 가장 가고 싶은 도시를 가고 싶다는 생각을 했습니다. 막연하지만 저 스스로는 명확한 목표를 갖고 있었다고 생각합니다. 


<누구도 보고싶지 않은 증거자료 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ>


런던을 가고싶었던 이유는 세상에서 제일 예쁜 다리(타워브릿지)와 제일 유명한 시계(빅 벤)가 있기 때문이죠. 주관적이지만 저에게는 그랬습니다.

막연하지만 명확하게 가고 싶다는 마음이 있었기에 갈 수 있었다고 생각합니다. 이 글을 적으며 2017년에는 꼭 다른 곳에 또 가고 싶다는 생각을 혼자 간직 해 봅니다.


문. 런던에서 가장 좋았던 것은?


답. 개인적으로는 계획을 세우지도 않았고 우선 목표는 빅 벤과 타워브릿지를 보는 것 이었습니다. 런던의 날씨가 비가 많이 온다고 들었 기 때문에 날씨에 따라 어느정도 유동성 있게 움직여야 겠다고 생각을 해 둔것이 좋았습니다. 가장 기억에 남는것은 그리고 가장 좋았던 것은 런던아이 표를 예매해 둔 후 밤에 강 건너로 바라본 빅 벤의 모습이었습니다. 솔직히 가기 전에는 타워브릿지를 보고싶은 마음이 훨씬 더 컸다면, 런던을 가서 본 빅 벤은 정말 유명해서 보고 싶은 게 아니라 자꾸자꾸 보고 싶었습니다. 



<강 건너에서 바라본 빅 벤 과 본인> 


<런던아이를 타고 위에서 바라본 빅 벤>


마지막 날이라 그런지 감회로 새로웠고 정말 좋았습니다. 



문. 가장 좋은 것 외에 소소하게 좋았던 기억에 남는 것들은 없나?


답. 있다. 생각보다 많다. 

계획 없이 간 것 치고는 즐거웠습니다. 한국말을 전혀 쓰지 않는 환경은 미국에서 1년을 지내면서도 생각 외로 많지 않았습니다. 그러나 게스트하우스에 가는 순간 저는 영어로만 이야기를 해야만 했고 방 친구들과 안부를 물으며 다음날 계획을 짜서 시간을 즐겼습니다.


여행 블로그나 정보를 찾아보면 더 좋은 글과 정보가 있겠지만 저의 개인적인 기억은 에비로드(비틀즈 범에 나온 횡단보도)와 노팅힐(?)에 나온 파란문의 집과 그 집으로 가는 길의 시장, 셜록 박물관과 그 근처의 공원이 좋았습니다. 특히 마지막에 적은 공원은 어딘지 기억도 나지 않지만 그냥 지도보다 발길이 닿아 갔는데 정말 평화롭고 맘이 차분하게 가라앉는 느낌이었습니다.

여행을 하면 박물관이나 미술관은 될 수 있는 한은 가보는 편인데 대영박물관과 전쟁박물관(정식명칭이 아닐 수 있음)은 유독 두 번 다 날이 좋은날 가서 그런지 좋았습니다. 또한 테이트 모던과 그 주변 풍경도 무척이나 좋았습니다. 두번이나 갔을 정도로 말이죠.


문. 음식에 대해서 할 이야기는 없는 건가?


답. 음식... 개인적으로 선호도는 음식에 쓰는 돈을 가장 아끼는 편입니다. 물론 좋은 사람과 좋은 음식을 먹는 데에 아끼지는 않지만 한정적인 금전사항에서 가장 아낄 수 있고 중요하지 않다고 생각한 것이 음식이었습니다. 하지만 이것저것 먹어봐야 할 만한 것도 있다고 생각을 하고 지금도 미국에서 종종 갔던 식당들이 생각나는 것을 보거나 먹으러 여행을 다닌다던 지인의 말이 예전보다 훨씬 더 마음에 와 닿기 시작하면서부터는 저도 음식에 대한 것 또한 꼭 필요하다고는 생각을 합니다. 제가 소개하고 싶은 2가지는 피쉬 & 칩스와 오렌지입니다.


<피쉬 & 칩스 그리고 커피맛 술>


그냥 생선까스와 감자튀김에 커피맛 보드카 라고 낭만 파괴하면서 설명할 수 있지만 뭔가 동네 느낌 물씬 나는 그런 한 끼였습니다.


그럼 뻔하디 뻔하고 어디에서나 구할 수 있는 오렌지는 왜? 라고 생각하시는 분들이 이 글을 보고 있지는 않겠지만...그래도 오렌지는 여행을 마치고 숙소로 돌아가는 길에 과일 좌판 같은 것이 있었습니다. 오렌지가 한 망에 2파운드(넉넉잡아 4천원)였는데 살다 살다 그렇게 맛있는 오렌지는 먹어본 적이 없습니다. 진짜 잊지 못할 오렌지....였습니다.

혹시 너무 틀과 계획에 박혀있는것이 아닌 어느정도의 낭비와 즉석에서 끌리는 것을 해 볼 준비까지 하시기를 살짝 추천해 봅니다.




 아예 저처럼 거기서 보내는 매 시간에 의미를 둘 수 있는 여행을 하시는 것을 저는 추천하고 싶지만 한정된 시간에 많은것을 보고 느끼고 싶을 수 있다고도 생각을 합니다. 하지만 진짜 여행을 왜 가고 그 곳에서 그 시간들이 추억이 되려면 ... 어떻게 해야할지는 각자 본인 스스로가 가장 잘 알지 않을까요?


"여행하면 남는건 사진밖에 없다" 라는 말을 저도 자주 합니다. 물론 여행 뿐만 아니죠 그건, 오죽하면 없는 인턴 월급 모아서 폴라로이드 카메라와 DSLR카메라를 샀으니까요.(저렴이들로...) 


여행을 하실거라면 사진 많이 찍으시길 바라며 도움이 되셨기를... 바라봅니다.

변수 유형 설명
%ALLUSERSPROFILE% 로컬 모든 사용자 프로필의 위치를 반환합니다.
%APPDATA% 로컬 응용 프로그램이 기본적으로 데이터를 저장하는 위치를 반환합니다.
%CD% 로컬 현재 디렉터리 문자열을 반환합니다.
%CMDCMDLINE% 로컬 현재 Cmd.exe를 시작하는 데 사용되는 정확한 명령줄을 반환합니다.
%CMDEXTVERSION% 시스템 현재 명령 프로세서 확장의 버전 번호를 반환합니다.
%COMPUTERNAME% 시스템 컴퓨터 이름을 반환합니다.
%COMSPEC% 시스템 실행할 수 있는 명령 셸의 정확한 경로를 반환합니다.
%DATE% 시스템 현재 날짜를 반환합니다. date /t 명령과 같은 형식을 사용합니다. Cmd.exe에서 생성합니다. date 명령에 대한 자세한 내용은date를 참조하십시오.
%ERRORLEVEL% 시스템 최근 사용된 명령의 오류 코드를 반환합니다. 일반적으로 0이 아닌 값은 오류를 나타냅니다.
%HOMEDRIVE% 시스템 사용자 홈 디렉터리에 연결된 로컬 워크스테이션 드라이브 문자를 반환합니다. 홈 디렉터리의 값에 따라 설정합니다. 사용자 홈 디렉터리는 로컬 사용자와 그룹에서 지정합니다.
%HOMEPATH% 시스템 사용자 홈 디렉터리의 전체 경로를 반환합니다. 홈 디렉터리의 값에 따라 설정합니다. 사용자 홈 디렉터리는 로컬 사용자와 그룹에서 지정합니다.
%HOMESHARE% 시스템 사용자 공유 홈 디렉터리의 네트워크 경로를 반환합니다. 홈 디렉터리의 값에 따라 설정합니다. 사용자 홈 디렉터리는 로컬 사용자와 그룹에서 지정합니다.
%LOGONSEVER% 로컬 현재 로그온 세션을 확인한 도메인 컨트롤러 이름을 반환합니다.
%NUMBER_OF_PROCESSORS% 시스템 컴퓨터에 설치된 프로세서의 수를 지정합니다.
%OS% 시스템 운영 체제 이름을 반환합니다. Windows 2000은 운영 체제를 Windows_NT로 표시합니다.
%PATH% 시스템 실행 파일의 검색 경로를 지정합니다.
%PATHEXT% 시스템 운영 체제에서 실행 가능하다고 간주되는 파일 확장명 목록을 반환합니다.
%PROCESSOR_ARCHITECTURE% 시스템 프로세서의 칩 아키텍처를 반환합니다. 값은 다음과 같습니다. x86, IA64
%PROCESSOR_IDENTFIER% 시스템 프로세서의 설명을 반환합니다.
%PROCESSOR_LEVEL% 시스템 컴퓨터에 설치된 프로세서의 모델 수를 반환합니다.
%PROCESSOR_REVISION% 시스템 프로세서의 수정 버전 번호를 반환합니다.
%PROMPT% 로컬 현재 인터프리터에 대한 명령 프롬프트 설정을 반환합니다. Cmd.exe에서 생성합니다.
%RANDOM% 시스템 0에서 32767까지 수 중에서 임의의 10진수를 반환합니다. Cmd.exe에서 생성합니다.
%SYSTEMDRIVE% 시스템 Windows XP 루트 디렉터리(시스템 루트)가 있는 드라이브를 반환합니다.
%SYSTEMROOT% 시스템 Windows XP 루트 디렉터리의 위치를 반환합니다.
%TEMP% and %TMP% 시스템 및 사용자 현재 로그온한 사용자가 사용할 수 있는 응용 프로그램이 사용하는 기본 임시 디렉터리를 반환합니다. 일부 응용 프로그램에는 TEMP가 필요하고 다른 프로그램은 TMP가 필요합니다.
%TIME% 시스템 현재 시간을 반환합니다. time /t 명령과 같은 형식을 사용합니다. Cmd.exe에서 생성합니다. time 명령에 대한 자세한 내용은time을 참조하십시오.
%USERDOMAIN% 로컬 사용자 계정을 포함한 도메인 이름을 반환합니다.
%USERNAME% 로컬 현재 로그온한 사용자 이름을 반환합니다.
%USERPROFILE% 로컬 현재 사용자의 프로필 위치를 반환합니다.
%WINDIR% 시스템 운영 체제 디렉터리의 위치를 반환합니다.

오늘은 흰 웃옷을 입었음에도 불구하고 비빔냉면, 짬뽕을 먹는 모험을 통해 셔츠를 탈탈 더럽히고 강의를 듣기위해 자리에 앉았습니다.

동아리의 신입생 환영회를 뒤로하고 이 자리에 있는 제가 기특하기도 하고 씁쓸하기도 하지만 오늘도 힘을 내서 정신 차리고 강의를 열심히 듣겠습니다.

 

======================================    1    ======================================

(19:04 ~ 19:54)

메모리 속도 최적화

Quiz. 1~100 사이의 정수를 저장하려고 할 때 속도를 고려하여 저장하기 가장 좋은 Type은?

(환경은 32비트 프로세서)

1. char

2. short

3. int

4. float

 

 

정답은

 

 

.

 

 

 

.

 

3번입니다.

그 이유는 일단 프로세서의 word 크기와 같으며 보기에는 없지만 음수값이 없으므로 unsigned int type을 사용하는 것이 가장 좋습니다.

 

메모리 크기 최적화

 

메모리를 절약하는 방법을 다루는 부분으로 data Type에 따라 memory에 워드별로 적제되므로 메모리에 올릴 때의 순서를 고려하여 Data Type을 고려하면 메모리를 절약할 수 있습니다.

 

======================================    2    ======================================

(20:00 ~ 20:50)

 

ROM 최적화

1) 데드 코드 제거

2) 메크로나 인라인 함수 사용 자제

3) 라이브러리 함수사용 자제

4) 상수 대신 지역변수 사용

5) 불필요한 전역변수 초기화를 하지 않는다.

 

RAM 최적화

1)  프로그램 실행은 ROM에서 한다.

2) 함수의 깊이를 2단 이하로 한다.

3) 짧은함수는 매크로 함수나 인라인 함수 사용

4) 큰 사이즈의 함수 인자는 포인터 활용

5) 값의 변동이 없는 전역변수는 상수화한다.

 

컴파일러 최적화

1)상수 대체

2) 중복 표현 제거

3) 데드코드 제거

4) 연산 강도 경감

 

======================================    3    ======================================

(21:00 ~ 21:54)

 

test문제를 가지고 문제를 풀어보는 방식으로 진행을 하였습니다. 해당 문제는 추후에 올리도록 하겠습니다.

회식으로 인해 과감하게 3일차 과정을 넘기고 4일차 과정을 듣게 되었습니다. 몹시나 불편하고 마음에 걸렸지만 그래도 회사일은 어쩔 수 없다고 비겁한 변명을 시작으로 강의 준비를 합니다.

 

======================================    1    ======================================

( 19 : 04 ~ 19 : 50 )

 

자동 형변환에 대해서 수업을 진행하셨습니다.

자동 형변환은 개발자도 모르는 사이에(알 수도 있죠) 일어나고 확인이 되지 않을 수 있으므로 주의를 요합니다.

 

어제 PC에 ubuntu를 설치하셨던 것 같습니다. PW를 알 수가 없어서 답답합니다. 이래서 수업을 하루 빠지는것은 참 불편합니다.

단축키 정리 Ctrl + Alt + T  -> 우분투에서 터미널을 열어줍니다.

gcc hello.c -o hello

 앞의 굵은 글씨는 코드파일이름, 뒤의 굵은 글씨는 실행파일의 이름을 입력하시면 됩니다.

 

 ubuntu의 계정은 test/test였습니다.

======================================    2    ======================================

( 20 : 02 ~ 20 : 53)

 

책의 54페이지 컴파일 과정에 대해서 수업을 진행하셨습니다.

gcc -v --save-temp -o hello hello.c

다른 옵션으로 컴파일을 하여 결과를 확인하였습니다.

어셈블리 파일을 확인하는 것은 CPU에서 명령이 수행되는 것을 이해하는 데에 도움이 된다고 하셨습니다.

 

 

최적화에 대해 첫날과 같은 이야기를 간단히 한번 더 해 주셨습니다.

 

======================================    3    ======================================

( 21 : 05 ~ 21 : 47)

반복문 최적화 에 대해 수업을 진행하셨습니다.

생각보다 바보같으면서도 뭔가 성능을 향상시키는 방법들이 있었습니다.

루프를 병합하거나 반복 수행횟수를 줄이며 반복문 안에 중복된 코드를 넣는 방법(루프 언롤링)도 있었습니다.

재귀함수가 위험한 이유라는 주제로 실습과 강의가 진행 되었는데 피보니치 수열을 50개까지 출력하는 프로그램을 만들어서 확인을 해 보았습니다.

 

대략 2분이 소요되었습니다.

속도의 차이를 확실하게 느끼기 위해 반복문을 사용한 프로그램으로 변경하여 진행을 해 보겠습니다.

시간이 50분의 1 혹은 체감상 60분의 1정도 소요되었습니다. 대략 2분걸리던 것이 대략 2초 걸리는 프로그램으로 바뀌었습니다.

신기한 것은 반복문으로 작성한 프로그램이 50개를 구하는 것 보다 99개를 구하는 것이 수행속도가 더 빠르다는 것 입니다. 물론 횟수는 2~3번정도만 확인을 해 보았지만 그 때 모두 서로 비슷학 결과로 99개가 1.6초근처, 50개가 2.5초 근처로 소요되는 것을 확인하였습니다.

 

오늘은 친구가 와서 간단히 이야기좀 하고 강의를 들어 왔습니다.

 

=======================================    1    =====================================

( 19:05 ~ 19:55 )

개발 환경을 구축하기 위해서 컴파일러 및 개발 툴을 준비하였습니다. 지난 강의였던 C++ 고급 강의에서 사용한 Code::Bloack을 다운로드하여 설치하도록 하셨습니다. 이번 강의에서는 네트워크 연결이 원활하게 되지 않아서인지 Website에 방문해서 다운로드를 받아 설치를 유도하셨습니다.

지난 수업에서 받아둔 파일로 설치를 진행하였습니다.

Code::blocks은 컴파일러를 포함한 버전과 아닌 버전이 있으며 기존에 컴퓨터에 컴파일러가 설치되어있다면 그 컴파일러를 활용하여 개발을 할 수 있습니다. 이번 강의에선 컴파일러를 포함한 버전으로 설치를 진행하였습니다.

간단한 Test로 어느책에서도 어느 C기초 강의에서도 어떤 다른 언어에서도 처음으로 개발을 하면서 프로그래밍을 하는 예의바른 프로그램을 작성 해 보았습니다. Hello를 출력하는 프로그램을 작성하였고 정상적으로 컴파일 및 수행이 되는것을 확인하였습니다.

 

그리고 어제 예고하였던 38페이지의 프로그램을 작성 후 테스트 해 보았습니다.

 

 

그리고 수업을 진행하시다가 가변인자로 함수를 만드는 것을 설명을 해 주셨고 설명을 한 후에도 수강생들의 반응이 다 이해하지 못하는 분위기라 추가로 예제를 하나 만들어 보았습니다. 더하기를 수행하는 함수인데 더하는 값의 개수를 몇개를 하여도 동작을 할 수 있도록 만드는 것이 목적입니다.

 

exam03.c

 

 위의 코드를 작성하였으며 수행 결과는 아래와 같습니다.

 

=======================================    2    =====================================

( 20:10 ~ 20:57 )

혹시 이상한 부분을 찾으셨나요?

 

위의 코드에서 찾으셨을 수도 있고 보다 더 정확하게 눈에 보이는 수행 결과를 보면 값이 이상합니다. 정상적인 덧샘을 하지 않은 결과고 한가지 결과만 보면 명확하게 추리를 할 수 없지만 2가지의 결과를 비교하여 보면 2가지 결과값은 가장 마지막 값이 더해지지 않은 값입니다. 반복문을 보니 조건을 1~n까지 돌리기 위해서 조건을 주어야 하는데 제가 실수로 등호 기호를 빼먹었습니다.

그냥 실수 일 뿐 읽고계시는 분을 테스트하려는 의도는 없었지만 좋은 시험이 되었으리라 생각합니다.

정상적인 코드와 수행화면도 첨부 해 봅니다.

 

 

 

그리고 배열 포인터에 대한 예제를 하나 작성 해 보았습니다. 우선 코드를 보고 수행될 결과를 예상 해 본 후 직접 작성하여 수행을 한 값과 비교를 하는것을 목적으로 진행하였습니다.

 

exam04.c

책 43쪽

배열의 주소값을 갖는 포인터라는 제목으로 포인터에 배열의 주소값을 갖도록 하게 만들어 선형의 메모리에 2차원 배열로 표현을 하여 표 처럼 생각하고 프로그래밍을 할 수도 있는 것 같습니다. 이 부분은 저에게는 조금 버거운 것 같습니다.

 

 

문자열 포인터에 대하여...

const keyword를 사용하면 보다 원활하게 값 수정을 못하게 하여 Compile시 Error를 발생시키는 방법이 있습니다.

 

=======================================    3    =====================================

( 21:08 ~ 21:52 )

 

void형 포인터

 

배열의 단점은 고정크기인 것과 한가지 타입의 자료만을 갖는 것입니다.

하지만 Heap을 사용하면 동적할당을 사용할 수 있어서 유용합니다. 링크드 리스트를 만들어 heap을 사용 할 수도 있습니다. 링크드 리스트를 만들면 필요할 때마다 (동적으로) 생성하는 것이 가능하다는 것입니다. 연속된 메모리 할당이 일어나는 것이 아니기 때문에 할당받은 모든 주소를 알고 있어야(저장해야) 합니다.

exam05.c 링크드 리스트를 만들어보기!

C++ 지난주 수업시간에도 해 보았던 것이기 때문에 크게 무리없이 진행을 할 수 있었던 것 같습니다.

 

 위의 코드또한 한가지 문제점이 있습니다만 직접 작성을 하다 보시면 충분히 찾으실 수 있을것입니다.

 

완성된 코드는 아래와 같습니다. 할당된 메모리를 해제하는 부분에 있어서 주석처리 된 아래 부분은 강사님께서 작성해주신 모범답안과 같은 코드입니다. 참고 해 주시기 바랍니다.

 

 

음. 오늘은 갑작스런 회식 예정이 수요일로 잡히면서 교육일정에 치명적인 차질이 생길 수 있다는 이야기를 들었습니다.

 

그러면 우선 2가지에 집중을 해야 하는데, 먼저 출결관리에서 단 1분도 어긋나서는 안되는 것이며 둘째로는 빠지는 강의에 대해서 어떻게 처리를 할 것인가에 대한 해결을 해야합니다.

즐겁고 축하하는 자리인 회식이 뭔....

 

강의에 앞서서 이번에도 사전 Test와 함께 [임베디드 C코드 최적화] 라는 강의 자료화면을 보았습니다.

 

====================================    1    ========================================

(19:03 ~ 19:51 )

강의에 들어가기 앞서서 코드최적화에 대한 이론적인 설명과 필요성에 대해서 이야기를 해 주셨습니다.

게임의 사례를 들면서 최적화의 필요성을 또 이야기 해 주셨습니다. 실수 계산은 CPU에 많은 부담을 주는 연산이라는 것 부터 차근차근 진행을 해 주셨습니다.

CPU가 계산하기 편하도록 부동소수점보다는 고정 소수점을 사용하도록 하고 2의 보수를 사용하기 용이하도록(?) 하는것이 도움이 된다고 하셨습니다.

float 변수에 3.14와 3.25를 넣으면 차이가 남.... 2의 음수승까지 계산을 해보면 됩니다.

우선 최적화를 무조건 할 것이 아니라 어떤 방향으로 최적화를 해야하는지에 대한 지금 개발 환경을 분석하고 결정을 하는 것 또한 중요하다고 하셨습니다.

 

가독성?과 성능은 trade off관계입니다. 최적화를 할 때에는 그래서 어느쪽에 중점을 둘 것인가에 대해 고려를 해야합니다. 현실적으로 모든 조건은 뛰어나게 만드는 것은 쉽지 않기 때문입니다.

 

속도 VS 크기 - H/W단에서는 저장장치의 용량 또한 단가와 상관이 있으며 rom에서 실행하는 것과 RAM에서 실행을 하는 두가지 방법의 차이점도 설명 해 주셨습니다. rom은 속도가 늦지만 code가 RAM에 올라가는 만큼을 절약할 수 있으며, RAM실행을 하면 Memory를 rom code size만큰 memory를 사용하지만 보다 빠른 속도로 동작하는 , 성능이 나은 프로그램을 만들 수 있습니다.

 

====================================    2    ========================================

(20:04 ~ 20:57 )

 

c프로그램에서는 하드웨어에 대한 입출력을 메모리에 입출력하는 것과 같이 처리를 해 줍니다.

두 가지의 방식이 있는데 그중 하나는 Memory Mapped I/O, 나머지 하나는 I/O Mapped I/O입니다. 사용 설명서와 같은 역할을 하는 Data sheet를 확인하여 처리를 할 필요가 있습니다.

Thread??! 가 실타래가 되는...? Android의 Activity는 활동이 되는... 기적을 볼 수 있는 비 전공자의 번역에 대한 농담을 해 주시기도 하셨습니다.

OS는 페이징 기법을 사용하여 메모리에 접근을 하기 때문에 프로그램 상에서 직접 메모리에 접근하는 것을 막습니다. 하지만 OS가 없다면 직접 프로그램 상에서 메모리에 접근을 하여 처리를 할 수도 있습니다.

Valotile Keyword의 의미는 케싱작업을 하지 않는 것이 원 의미이며, 최적화를 하지 않는 것으로도 사용을 할 수도 있습니다.

컴파일러에서 공루프(아무것도 하지 않는 루프), 불려지지 않는 함수등을 제거해버리는 경우도 있습니다.

startup code에 대한 설명과 *.o파일의 구조에 대한 설명을 해 주셨습니다. 지난 주 .bss영역의 초기화가 되지 않은 전역변수가 어떤값을 갖는지에 대한 질문에 대한 저의 오답을 다시한번 생각이 나게 해주셨습니다.

전역변수는 0으로 초기화가 되며 지역변수는 쓰래기값이라고 하는 이상한 값(임의의 값)이 들어가게 됩니다.

H/W가 초기화되려면 부팅에 방해가 되는 요소를 꺼 주어야 합니다. 시스템이 일정 반응이 없으면 재부팅을 해주는 와치독 타이머(watchdog timer)가 동작하지 않도록 해 주어야 합니다. 또한 인터럽트도 의미없는 분기를 막기위해 인터럽트를 꺼두어야 합니다.

그리고 clock를 만들어 주어야 합니다. 그 후 메모리 확인을 해 주고 구성된 H/W중 초기화가 필요한 것들을 초기화 해 줍니다. 그 후 Startup code가 수행됩니다. data와 bss는 RAM으로 이동 후 bss는 0으로 초기화를 해 줍니다.

====================================    B    ========================================

(쉬는시간)

오늘은 첫 시간이라 이론적인 내용으로 수업을 진행한다고 하셨지만 그러면 남은 실습시간은 3일 3시간씩 9시간이고 뭔가 수업이 짧을 것 같다는 느낌이 듭니다.

학부생 시절에 배웠던 임베디디 소프트웨어,하드웨어의 과목 뿐 아니라 전반적인 프로그램의 구조나 리눅스에 대한 내용과 같은 다소 이론적인 내용들이 많이 나왔습니다.

 

====================================    3    ========================================

(21:11 ~ 20:57 )

포인터 난관의 포인터에 대한 설명을 해 주셨습니다. 포인터와 배열은 서로 치환이 되며 서로의 특징을 설명을 해 주셨습니다.

먼저 두개의 포인터를 선언한 후 두 포인터에 대한 사칙연산중 가능 한 것을 고르는 문제가 있었습니다. 과연 어떤 것들이 가능할까요? 먼저 저는 예상을 했을 때 더하기와 빼기가 가능 할 것이라고 생각을 했습니다.

 

하지만 더하기는 불가능 했습니다. 포인터의 연산에서 유일하게 가능 한 것은 빼기연산입니다. 그리고 그 빼기연산의 의미는 두 주소의 차이로 버퍼의 잔량을 구하는 데 사용되기도 합니다. 따라서 그 결과가 음수값이 나오더라도 무방하여 음수값이 나오느냐 양수값이 나오느냐는 위치의 차이일 뿐이라고 설명을 해 주셨습니다.

포인터의 연산에 대해 다시한번 가능 한 것과 불가능 한 것으로 분류하여 설명을 해 주셨습니다.

정수와의 +, -,*, / 단항연산 ++, --, 포인터간의 +, -, *, /, 포인터의 대입연산 (=), 포인터간의 비교연산 (<, >) , 실수와의 +, -, *, / 중에서 어떤것이 가능하고 어떤것이 불가능 할까요?

 

강의 자료로 보면 아하 이렇구나 하고 지나가게 될 것 같아서 한번 직접진행을 해 보는것이 최선일 것 같습니다. 따라서 내일 환경이 구축된 후 이 작업은 꼭 확인을 해 보도록 하겠습니다.

배열과 포인터에서 특히 2차원 배열을 표와같은 형태로 생각을 하는 경우가 있지만 그것은 사람에게 보기 좋게 하기 위한 것일 뿐, 실제로는 메모리에 선형적으로 쓰여있다는 설명을 해 주셨습니다. 또한 배열의 주소연산과 포인터 연산의 관계를 여러가지 예시를 보여주시면서 설명을 해 주셨지만 이해는 반도 못한 것 같습니다.

간단한 퀴즈로 int a[3] = {1,2, 3}일 때

(주소)             (값의 표현)

0x100    a[0]   *a

0x104    a[1]   *a+1

0x108    a[2]   *a+2

일 때 ,

 

1. a, &a의 값은?

2. a+1, &a+1의 값은?

 

위의 문제는 굉장히 간단해 보이면서도 생각을 많이 하게 만들었고 학부생때에도 단 한번도 깊게 포인터를 공부하고 싶지 않게 만든 요인이었습니다. 

내일은 더 이해가 될지도 모르겠지만 오늘은 간단하게 설명을 들은 내용을 정리하는 것으로 마무리를 하겠습니다.

핵심은 *는 선언시에는 주소를 싸는 역할을 하고, 사용시에는 주소를 벗기는 역할을 한다고 합니다.

오늘도 밥을 먹고... 교육오기 전에 회의를 하고와서인지 조금 정신이 없어서 아쉬웠습니다.

 

======================================    1    =======================================

(19:04 ~ 19:54)

 

 

어제 과제처럼 던져주신 주소록 프로그램을 작성해 보았습니다.

 

정적 호출과 동적 호출 및 기타 다른 것들에 대해 설명을 해 준다고 하셨습니다.

 

OOP의 꽃은 다형성이다라고 하셨습니다. 함수 재정의가 그중에서도 가장 중요한 방법이라고 하셨습니다.

 

 

======================================    2    =======================================

(20:02 ~ 20:52)

 

f2.cpp ~ f4.cpp 에 대한 코드설명을 진행 해 주셨습니다.

가상함수는 수행시간에 동적으로 호출하는 방식으로 동작합니다.

 

virtual 키워드를 이용하면 다형성을 구현하기 좋습니다.

 

게임을 구현하는 예를 드시더니 포켓몬스터 3마리를 가지고 하는 게임들 완성해보라는 과제를 내 주셨습니다.    

 

 

======================================    3    =======================================

(21:02 ~ 21:34)

 

다운케스팅?!

하위 클레스가 무엇인지 모를 경우, 즉 , 실제 생성된 객체 타입을 확인해야 합니다.

typeid()를 활용하면 알 수 있으며 이 함수를 사용하기 위해서는 typeinfo를 include해주어야 합니다.

 

#include<typeinfo>

 

if(typeid(*character) == typeid(Picachu)){
        ((Picachu *)character)->electro();
      }

 

위의 코드와 같이 검사를 하면 상위 클레스인 character가 뭔지 확인하고 피카츄면 전기공격하는 그런 느낌입니다.

 

test3.cpp

상위 클레스의 소멸자를 Virtual로 하면 하위에서 메모리 해제가 정상적으로 되지 않는 경우를 막을 수 있습니다.

 

오늘은 일찍 마쳐 수료증을 받고 갑니다!!!! 빠2~

+ Recent posts