'Category'에 해당되는 글 88건
- 2010.04.02 문자열에 대한 레퍼런스는 어떻게 해야 할까?
- 2010.04.02 다음 예제에서 메모리 해제 에러가 왜 생길까요? 1
- 2010.04.02 문자열을 값에 의한 전달(Call By Value)을 어떻게 하는가?
- 2010.04.02 ReleaseDC()와 DeleteDC()의 차이점
- 2010.03.28 Planning for myself
- 2010.03.28 성공적인 직장 생활을 위한 기본 지침
- 2010.03.21 벌써 주말이..
- 2010.03.16 분주한 하루
- 2010.03.10 특별한 것이 없는 하루
- 2010.03.10 최고의 비즈니스 전략은..
보통 int형이나 float형등에 대한 레퍼런스는 쉽게 쓸 수 있습니다.
다음 예제를 살펴 봅시다.
wchar_t *abc = L"가나다라마바사";
wchar_t *abc2 = new wchar_t[256];
wchar_t abc3[256];
통상적으로 위와 같은 형태로 많이 사용합니다.
이때, 이 변수들에 대한 레퍼런스(문자열에 대한 레퍼런스)는 어떻게 할 수 있을까요?
물론, wchar_t &def = abc; 과 같은 형태는 불가능합니다.
문자열에 대한 레퍼런스를 할 수 있는 방법은 할당된 메모리 영역에 따라 두가지가 있습니다...
1) 스택 영역(Stack Segment)과 초기화되지 않은 데이터 영역(Uninitialized Data Segment)
아래는 스택 영역에 할당된 변수의 선언입니다.
int main(void)
{
char string_1 = 'a';
char &ref_str = string_1;
return 0;
}
위에서 보시는 string_1은 char형이 1 byte기 때문에 레퍼런스를 string_1에 붙여줄 수 있습니다.
그 이유야 두말할 필요없이 'a'가 1 byte기 때문에 레퍼런스 선언이 가능합니다.
왜냐하면, 레퍼런스도 1 byte char형이기 때문이죠.
하지만, 다음 문법을 보겠습니다.
int main(void)
{
char string[20] = "Hello World!!";
char ???
}
위에서 선언된 string은 배열입니다. 좀 더 정확하게 말하자면, 배열은 포인터 상수입니다.
여기서 포인터의 상수란, 그 크기가 유동적인 것이 아니라 컴파일 타임에 정해졌다는 것을 의미합니다.
다시 말하면, 이미 string이라는 포인터가 가리키는 위치는 스택 영역 어딘가에 20byte로 할당된 메모리
상이라는 말인데, 여기서 중요한 점은 string이 가리키는 곳을 절대 바꿀 수 없다는 것이 포인터 상수의
특징입니다.
문제의 핵심은 컴파일러가 제공해주는 자료형이 char, short, int, long, float, double 등등..
문자열 상수 20 byte 모두 참조할 수 있는 자료형이 존재하지 않는다는 것이 핵심입니다.
그렇기 때문에, 결론은 20 byte 크기를 참조할 수 있는 사용자 정의 자료형을 사용하여야 한다는
것입니다.
아래가 스택 영역에 할당된 문자열 상수를 레퍼런스로 선언할 수 있는 해답입니다.
#include <iostream>
using std::cout;
using std::endl;
struct String
{
char str[20];
};
int main(void)
{
String string;
strcpy( string.str, "Hello World!" );
String &ref_str = string;
cout << ref_str.str << endl;
return 0;
}
2) 초기화된 데이터 영역(Initialized Data Segment)
아마 위의 방법을 보시고 어딘가 좀 못마땅하고 문법적으로도 까다롭다는 것을 느끼실 겁니다...
하지만 초기화된 데이터 영역에 할당된 문자열을 레퍼런스로 선언/정의하는건 간단합니다..
해결책은 아래와 같습니다.
#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
char *string = "Hello World!";
char *&ref_str = string;
cout << ref_str << endl;
return 0;
}
이것에 따른 의문도 있을거라고 생각되니 정리해 드리겠습니다.
char *string;에서 char *도 하나의 자료형입니다. "문자 포인터형"이지요..
마찬가지로 "문자 포인터형"의 레퍼런스를 하나 선언하여 string으로 초기화한다면 문제없습니다.
char *(&ref_str) = string;
※ 하지만 , 위에서 선언된 레퍼런스로 접근은 읽기는 가능하나 쓰기는 불가능합니다.
왜냐하면, string이 가리키는 곳은 초기화된 데이터 영역에 할당된 문자열 상수이기 때문입니다.
Initialized Data Segment는 오직 읽기만 가능하며, 쓰기는 불가능합니다.
이 영역의 메모리 해제는 프로그램이 종료될 때, 해제가 됩니다.
Written By Sim-Hyeon, Choe
아래와 같이 코딩하였다고 가정하겠습니다.
-------------------------------------------
#include <iostream.h>
int main()
{
char *i = new char[20];
i = "asfdsadfsdaf";
cout << i << endl;
delete i;
return 0;
}
--------------------------------------------
결과 출력 후, 확인하면 delete에서 Access Violation Error가 발생합니다.
이유는 무엇일까요?
char *i = new char[20];
위의 코드를 풀이해보면, 힙 영역 어딘가 char 형의 20 byte크기만큼 할당하고
할당한 것(정확하게 할당된 영역의 첫 주소값)을 포인터 i가 가리키는 형태입니다.
i = "asfdsadfsdaf";
위의 코드도 풀이하면, 메모리상 어딘가 존재하는 문자열 상수를 i가 가리키게 됩니다.
(여기서 할당된 메모리 위치를 이미 잃어버리게 됩니다. 다른곳의 주소를 가리키니까)
즉, i가 가리키고 있는 곳(new char[20])에 위의 문자열이 할당된게 아니라,
"asfdsadfsdaf"가 할당된 곳(초기화된 데이터 영역에 할당)의 첫주소를 가리키게 됩니다.
"asfdsadfsdaf"은 초기화된 데이터 영역(Initialized Data Segment)에 저장된 값은 일반 상수로
취급되며 쓰기는 불가능하고 오직 읽기만 가능합니다(.rdata 영역).
읽기가 가능하니 cout << i << endl; 하면 출력은 됩니다.
delete i; 라고 코딩되어 있는데,
결과적으로 i가 가리키는 곳은 초기화된 데이터 영역에 존재하는 "asfdsadfsdaf"이므로,
메모리의 특성상 쓰기가 불가능하니 Exception이 발생하는 것입니다.
strcpy(i, "asfdsadfsdaf"); 가 되는데,
이것은 "i가 가리키고 있는 주소값을 참조하여 문자열 상수를 그곳으로 복사해라"는 의미로,
i가 가리키는 영역은 (커널에게 정상적인 메모리 할당을 허락받은) Heap 영역이니 가능하죠.
※ 초기화된 데이터 영역(Initialized Data Segment)은 프로그램 종료시, 자동으로 해제됩니다.
Written By Sim-Hyeon, Choe
다음 예제가 있다고 가정하겠습니다.
void main()
{
char str = { "대한님국" };
fncA( str );
}
// 참조에 의한 전달
void fncA(char *str)
{
....
}
값에 의한 전달은 어떻게 할 수 있을까요?
천천히 살펴 봅시다.
char *str = "대한민국";
위의 선언을 풀이해보면, 메모리상 어딘가에 "대한민국"이라는 문자열 상수가
연속된 8byte 공간에 할당될 겁니다(한글 한자는 2byte기 때문에).
char *str;은 character형의 주소 가리킬 수 있는 포인터입니다.
char형은 1byte입니다. 1byte 메모리 공간에 대해서만 접근하고 참조할 수 있습니다.
함수의 인자를 받을때 char로 받으면 1byte 메모리 공간밖에 받을 수 없습니다.
결과적으로는 사용자 정의 자료형을 하나 선언해서 그 자료형을 넘겨 주어서 참조해야
합니다.
#include <stdio.h>
#include <string.h>
void fncA(struct string_t dest_string);
struct string_t
{
char str[10];
};
int main(void)
{
string_t string;
strcpy( string.str, "대한민국" );
fncA( string );
printf( "%s", string.str );
return 0;
}
void fncA(struct string_t dest_string)
{
strcpy( dest_string.str, "우리나라" );
printf( "%s\n", dest_string.str );
}
위와 같이 사용자 정의 자료형을 인자로 넘겨준다면, Call-By-Value가 성립됨을 알 수 있습니다.
※ 사용자 정의 자료형 내에서 맴버 str을 포인터형으로 줄 수 없는 이유가
함수의 인자로 사용자 정의 자료형을 넘길 때, 맴버 대 맴버 복사가 이루어지는데,
포인터 str 자체 즉, 4byte 공간만 복사될 뿐,
맴버 포인터가 가리키는 문자열까지 복사가 불가능합니다.
왜냐하면, 힙에 동적으로 할당된 공간자체가 맴버로 구조체에 포함되어 있지 않기 때문입니다.
Written By Sim-Hyeon, Choe
ReleaseDC()는 메모리에 할당된 화면 DC를 해제하기 위한 용도로 사용됩니다.
화면 DC 역시 메모리에 할당된 DC의 핸들을 가지고 있기 때문에 반드시 해제해야 합니다.
DeleteDC()는 메모리에 할당되고 메모리상에서 사용하는 DC를 해제하기 위한 용도로 사용됩니다.
간단하기 말하자면, 화면에 보이는 것은 ReleaseDC()로 화면에 보이지 않고 메모리상에만 할당된
DC는 DeleteDC()로 해제해야 합니다.
Written By Sim-Hyeon, Choe
Output의 극대화를 위한 Input과 Process를 관리.
때때로 무모한 도전이 필요하다.
책을 많이 읽어라(한 달에 한 권). - 특히, 공학도는 절반은 경영 서적, 자기계발서.
"시간은 부족 문제가 아니라 관리의 문제다." 미리 준비.
계획의 컨텐츠는 항상 우선 순위를 두고 처리한다.
다음의 시간 매트릭스로 우선 순위 기준을 분류한다.
긴급함 | 긴급하지 않음 | |
중요함 | 1사분면(관리) | 2사분면(집중) |
중요하지 않음 | 3사분면(최소화) | 4사분면(피함) |
4분면에 자신의 일을 적고 관리한다.
그중에서, 2사분면의 일은 준비/계획, 관계 구축, 재충전.
만약, 1 -> 3 -> 4 -> 1의 반복이라면, 이것은 끊임없는 빈곤의 악순환일 뿐이다.
생산적인 삶이 아님을 반증한다.
생산성 피라미드(Focus - ↑) |
일일 계획 주간 계획 목표 세우기 가치 확인하기 |
가치란?
당신에게 가장 우선시 되는 것.
중요하게 여기는 자질, 특성, 우선하는 것
당신이 세상을 보는 방식.
당신이 믿는 것.
스스로 가치를 정의한다.
처음에는 내가 습관을 만들지만, 나중에는 습관이 나를 만든다. "좋은 습관"
벤자민 프랭클린의 저서 읽어 보기.
목표 설정(SMART)
S : 최대한 구체적으로
M : 달성 여부를 측정 가능하도록
A : 달성 가능성이 높은
R : 가치와 연관이 있는
T : 마감 시한을 꼭 정할 것
목 표 | ||
순 서 | 실행 계획 | 기 한 |
주간 계획, 월간 계획을 미리 정의하여 일관성을 유지한다.
다음 해야할 일을 우선 순위와 현실성을 고려하여 작성한다.
리스트 작성, 오늘의 예정 일정을 확인.
일일 시간표 작성은 단 5분이면 가능하다!
현실적인 계획을 수립한다. - 필수(60%), 차후에 해야할 것(20%), 여유(20%).
Planning System의 4가지 요소
업무, 예정 일정, 메모, 노트, 연락처
위의 4가지가 반드시 포함된 Planning 도구를 구입한다.
'오늘 나의 불행은 언젠가 잘못 보낸 시간의 보복이다' - Napoleon Bonaparte
Written By Sim-Hyeon, Choe
현실에 안주해서는 안된다.
효율적으로 일하라.
자신의 이력서를 작성해라(6개월마다 업데이트).
자신의 강점과 보완점을 파악하라.
한분야의 전문가가 될 뿐만 아니라, 여러 분야에 대해서도 두루 알고 있어야 한다.
자기계발을 하라(이미지와 체력 관리).
회사 생활의 4가지 중요 요소 - 음주가무, 어학 능력, 기획력, 꼼꼼함.
미래를 준비하고 계획하는 사람.
인생이란, 태어나서(UnControl) + 멋지게 살다가(Control. 선택과 집중) + 후회없이 죽는 것(UnControl).
무엇을 하더라도 자신만의 컨셉이 있어야 한다. 인생도 마찬가지다.
◎ 인생을 멋지게 사는 두가지 방법
① 욕망의 충족(인간의 3대 욕망) : 돈(월급), 권력(승진), 명예(인정) - 좁은 길
② 인생의 가치와 보람(성취와 의미) - 넓은 길
※ 두가지를 적절하게 섞어서 선택..
직장 생활의 성공 = 인생의 성공.
인생에서 성취감은 중요.
근로의욕과 성취감.
'성장'과 '성취'가 직장 생활의 핵심!
CDP(Career Development Plan)
"저의 커리어 패스가 어떻게 됩니까?"
인생은 곱셈이다.
나 자신이 준비(0)되지 않으면,
어떤 기회(100)가 주어져도
얻을 수 있는 것이 없다.
100 * 0 = 0
Written By Sim-Hyeon, Choe
역시 주말은 빨리 지나가는 것 같다. 하하. 이번 주말은 편안하게 쉬었다. 특별히 한 것도 없고 빈둥빈
둥 말이다. 혼자서 시간을 보내니까 참 심심하고 괜히 외롭기도 하고 그런 것 같다. 고시원 안에만 있는
게 답답해서 점심은 밖에 나가서 먹었다. 부시시한 머리와 활동복 차림으로 말이다. 하하. 김밥천국에 갔
는데, 닭곰탕을 주문하고 먹었다. 배는 고팠지만 조금 더 푸짐한 것을 먹고 싶었다는 마음에서 말이다.
주문한지 5분이 채 되지 않아 나왔다. 워낙 사람들이 많이 분비는 곳이다보니 미리 재료를 준비했을지도
모르지만 아무리 봐도 이것은 직접 조리하여 만든 것이 아니라는 느낌이 강하게 들었다. 파나 마늘 대추
가 너무 자연스럽게 이미 섞여 있었기 때문이다. 그래고 육수를 우려 냈다면 충분히 기름기를 띄고 있어
야 하는데 너무 맹탕이다. 그리고 닭고기를 거의 볼 수가 없었다. 이것은 마치 마트에서 판매는 1회용 가
공 식품과 너무 흡사했다. 메뉴판을 살펴 보니 갈비탕, 육개장, 우육탕 등은 있었는데 정작 수육 메뉴는
눈 씻고 찾아볼 수가 없었다. 다 먹고 나서 왜 수육 메뉴는 없냐고 물어 봤더니 수육은 요리하는 데에 시
간이 너무 소요된다고 말씀하셨다. 아니, 수육을 요리하는 데에 시간이 많이 소요되면서 어떻게 탕은 이
이렇게도 빨리 나오는가하는 의문이 들었다. 하하. 물론 나는 김밥천국과 같은 분식점에서 그런 것까지
하나 하나 따져가며 피곤하게 한끼하려고 했던 것은 아니지만 뭔가 아닌 것 같다는 생각은 든다. 여하튼,
주말을 정리하고 다시 새로운 한 주를 위해 열심히 또 달려야 한다. 파이팅하자!
Written By Sim-Hyeon, Choe
일기쓰는 것을 며칠 빠져 버렸다. 한동안 이것저것 참 정리해야 할 것이 많았다는 변명을 좀 하고 싶다.
하하. 현재는 나는 수업사업장 연구/개발팀에 배치된 상태다. 그룹과 부서는 일주일 정도 후면 배치받을
예정이다. 오늘 교육을 마치고 부모님과 함께 아파트를 구입하기 위해 부동산 사무소에 찾아갔다. 기존
입주자와 계약을 하기 위한 서류를 작성하고 은행에서 융자한 금액에 대한 서류를 함께 작성하였다. 아
마 작성한 서류만 해도 10여건이 넘는 것 같다. 사회인으로서 참 알아야 될 것들이 한두가지가 아니라는
것을 느꼈다. 나는 참 사회의 미숙아다. 이 정도밖에 되지 않아서 어떻게 우리 집안을 이끌어 나가겠는
가. 스스로 부족함을 느낀 하루였다. 오늘 취침 전에 회사 생활을 위한 장기/단기적인 계획을 수립할 것
이다. 정말 자기계발하기에도 빠듯한 시간을 보내야 할 것 같다. 내 안의 에너지를 효율적으로 사용하는
방법밖엔 없다.
Written By Sim-Hyeon, Choe
다 먹을게 별로 없었던 것 같다. 하하. 오늘 교육중에 남는 것이 있다면... 자신의 업무 뿐만 아니라, 그
것과 연관되어 있는 업무에 대한 이해 역시 하고 있어야 인정받는 유능한 인재가 될 수 있다고 하셨던
점이다. 이것은 다르게 생각해보면, 결국 능동적으로 업무를 처리하는 것과 의미와 같다고 생각한다. 그
리고 회사 생활은 충분히 계획을 세워 임하는 것이 중요함을 들었다. 연수 중에 무엇인가 실천한다는 것
이 쉽지가 않다. 하하. 그냥 왠지 그걸 느낀 하루였다. 어쩔 수 없는 부분이 아닌가? 여기에서 내가 하고
싶은 것을 고집하기엔 좋은 분위기는 더더욱 아닐 뿐더러, 주어진 상황대로 부대끼는 것이 상책인 듯하
다. 여기서 마무리를 하려고 하였으나, 내 블로그의 초라한 카테고리를 보았다. 개설만 해 놓고 아무것도
없다. 하하. 사실 썼다면 대학생 시절 때부터 하나하나 작성해 나갔어야 했는데, 나의 귀차니즘 때문에
아무것도 해 놓은게 없다... 프로그래밍 블로그인데, 지금 나의 잡담밖에 없으니 여기에 들어오는 사람들
에게 아무런 도움도 안되는 민폐만 끼치고 있으니 큰 죄라면 죄겠다. 카테고리를 만들어 놓고 지우는 것
도 우스운 일이 될지 모르겠다. 어떻게 하면 좋을까..? 일단 하나하나씩 채워 나갈 것이다.
알아두면 프로그래밍에 충분히 유용할 만한 지식들이 될 만한, 질적으로 도움이 될 수 있는 것들로 채울
것을 방문자들에게 약속드리겠습니다.
Written By Sim-Hyeon, Choe
차는 10시 40분에 출발하는 무궁화호인데, 약 5분 지연되는 바람에 11시 25분에 도착하였다. 허겁지겁
달려 나와 택시 기사 아저씨께 최대한 빨리 사내 기숙사로 가달라고 부탁하였다. 금일 날씨 뉴스에서 전
국적으로 많은 눈비가 내린다고 하였는데, 구미에는 이미 많은 눈이 내리고 있었다. 택시 기사 아저씨도
제시간에 도착할지는 장담할 수 없다고 하셨다. 눈비가 내리는 좀 위험한 도로에서 빠른 속도로 달리셨
고 신호등도 두 개를 무시하시는 터프한 모습을 보여주셨다. 하하. 다행히도 통금 시간 13분 전에 도착
하였다. 후후.. 제법 위험 부담이 되는 상황임에도 고객을 위해 마다하지 않고 달려주신 기사 아저씨에게
잔돈 몇 천원을 받지 않고 모두 드렸다. 감사하는 마음에서 말이다. 들어가는 길에 우산없이 많은 눈에
젖은 상태라 그냥 들어갈까 생각하였지만, 그래도 일기만큼은 꼭 쓰고 들어가야겠다는 마음에 이렇게
쓰고 있다. 조금은 스릴을 느꼈던 하루로 마무리해야 할 것 같다. 그래도 오늘 조금이라도 내가 느낀 점
은 무엇일까? 꼭 냉정한 비즈니스로 이해득실을 따지는 것이 최고의 장사는 아닌 것 같다. 예전의 경험
에 의하면 말이다. 중요한 것은 고객의 입장에서 생각하는 마인드가 아닐까 생각한다. 너무 진부한가?
하하. 뭐, 이렇게라도 한 개 던지고 마무리해야 직성이 풀릴 것만 같다.
Written By Sim-Hyeon, Choe