프로그래머의길멘토에게묻다
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 데이브 후버 (인사이트, 2010년)
상세보기

내가 좋아하는 인사이트에서 나온 책이라 책값이 15000원이나 하지만 구매하였다.
멘토를 찾는법 아니면 전문가로 거듭나는 법을 찾는 방법에 대해 이야기 기대와 함께
책을 읽기 시작했다.
 전반적인 내용은 초보자가 어떻게하면 숙련공으로 들어갈 수 있는지 이야기를
하고 있다. 난 초보자가 아니라는 생각에 마음가짐에 대해서 사로잡을 수 있을 수 있었다.
하지만 그리 강추하고 싶지는 않다.
JQUERY쿡북TAEYOSCHOICE
카테고리 컴퓨터/IT > 프로그래밍/언어 > 프로그래밍일반
지은이 JQUERY 코어 커뮤니티 (비제이퍼블릭, 2010년)
상세보기

기원이가 추천하여 읽게 된 책이다. 기원이는 태오가 추천했다고 하지만.. 태오가 누구인지.. 쩝 
암튼 책의 내용은 괜찮았다. 하지만 jquery에 대해서 잘 모른다면 다른 책을 먼저 보는 것이 좋을 것 같다.
어떤 문제가 있을 때 처리방법에 대한 해석에 나열로.. 꽤나 유용하다. 문제 그리고 해결방법 토론 이런식이다. 
이벤트부분이 잘 이해가지 않지만 말이다. 후반에는 테마와 플러그인 활용에 대해서 나열되어 있다.
실전에서 한번 써보야 할 책인 것 같다.

이기는 습관
카테고리 경제/경영
지은이 전옥표 (쌤앤파커스, 2007년)
상세보기

본사에 잠깐 들렸다가 한북대까지 가는 길이 너무 멀어서 회사에서 나눠준 책을 보게 되었다.
삼성전자에서 남부지사장으로 역임하신 저자가 쓴 글에 내용이었다. 내용면에서는 정말 굿이였다.
가장 기억에 남는 말은 '성공이란 내가 좋아하는 일을 내가 존경하고 사람받는 사람들 속에서 
내 방식되로 행여지는 것이다.' 이말이 정말 무엇을 해야 보람을 느낄 수 있을까? 라는 답을 
제시해주는 것 같았다. 아침에 일찍 일어나서 하루를 준비하고 회사일을 즐겁게 하는 법 나를 
변화시키는 것이다. 
 깨진 유리창에 법칙이라는 내용이 나오는데 내가 살까 하던 책이였는데 이 책에서 나오니 방가웠다.
와 닿는 내용이었다. 작은 일부터 철저하게 하게 습관화 해야 큰일이 이루어진다는 것이다. 
뉴욕에 범죄가 심했다. 새로 부임된 경찰서장? 시장이였나? 암튼 그 사람은 작은 것부터 무단횡단
이런 작은 것부터 엄하게 처벌하였다. 그러자 살인이나 강도 범죄도 저절로 줄어드는 효과이다. 
 깨진 유리창을 보고 아이들이 낙폭해지는 내용이다. 
 습관의 무서움을 알려주고 마음가짐을 달리해야 하는 내용을 알려주는 책이다. 
연을 쫓는 아이
카테고리 소설
지은이 할레드 호세이니 (열림원, 2007년)
상세보기

소설은 별로 읽고 싶지 않았다. 도움이 될까? 하는 생각이었지만 정말 읽을 만한 책이었다.
아프카니스탄에서 태어나서 친구 하산(하인) 과 함께 자라왔지만 배신으로 이어졌고 성장하면서
마음 한 구석에는 그 그리움이 무더나오는 내용이었다.  성장과정 이야기는 너무 재미있다.
한편으로는 이 작가의 책을 한권더 보고싶은 생각이  든다. 

나를 버리다
카테고리 시/에세이
지은이 박지성 (중앙북스, 2010년)
상세보기

월드컵기간을 맞이하여 한번 사서 보았다. 책 쉽게 3시간이면 읽을 내용이다.
힘겨운 시간을 이겨냈고 끝없이 노력하며 참고 인내해온 대단한 선수다
패배할 지언정 무릎은 끓지 않겠다.
만족하는 순간 성장은 멈춘다.
흠 난 왜 이런 말을 못할까.. ? ㅋㅋㅋ  멋지다
시크릿
카테고리 자기계발
지은이 론다 번 (살림Biz, 2007년)
상세보기

주점에서 만난 여자가 추천해  준 책이였다. 자기계발 도서 이책과 함께 깨진 유리창의 법칙을 소개주었는데.. 
그 책은 세월이 너무 많이 흘렀다고 생각이되서 이 책을 먼저 사서 보게 되었다. 
 책내용은 한마디로 볼만했다. 자기암시 생각의 습관에 대해서 변화하라는 내용이었다. 
그러고보니 이 책도 2007년도이구나 볼만했지만 책값에 비해서 내용이 부족하다고 해야하나? 
암튼 쉽게 읽을 수 있는 책이다.

배열과 포인터가 완전 같지는 않다고 한다. 그럼 차이점은 무엇일까?

int ar[n];
int *pi;

1. 포인터는 변수인데 비해 배열은 상수이다.

  pi는 고유의 메모리를 차지하고 있고 언제든지 다른 대상을 가리킬 수 있지만 ar은 선언할 때 그 위치가 이미 고정되므로 다른 대상을 가리킬 수 없다. ar로는 오로지 배열의 선두 번지를 읽을 수 있을 뿐이다.

2. pi가 가리키는 배열의 크키는 동적으로 결정할 수 있지만 ar이 가리키는 배열의 크기는 선언할 때 정적으로 결정된다.
 고정된 길이의 배열이 필요하면 int ar[n]; 선언문으로 배열을 생성하는 것이 편리하고 가변길이의 배열이 필요하면 int *형의 포인터 변수를 선언한  후  malloc으로 할당해서 사용해야 한다. 포인터로 할당한 배열은 실행 중에라도 realloc으로 크기를 재할당하여 변경할 수 있다.
 
3. 배열은 그 자체가 크기 때문에 함수의 인수로 전달할 수 없지만 포인터는 대상체가 무엇이든간에 4바이트의 크기밖에 차지하지 않으므로 함수로 전달할 수 있다.
 
그래서 배열을 함수로 전달할 때는 반드시 포인터를 사용해야 한다.

4.배열로 요소를 읽는 것과 포인터로 대상체를 읽는 동작의 속도 차이가 있다.
 배열의 첨자 연산은 매번 배열선두에서부터 출발하지만 포인터는 대상체로 직접 이동해서 바로 읽으므로 액세스 속도가 빠르다. *pi는 pi가 가리키는 곳을 바로 읽지만 ar[n]은 *(ar+n)으로 일단 번지를 더한 후 읽어야 하므로 조금 느리다. 포인터가 배열보다 두배 정도 빠르다.


ptr이 임의의 배열을 가리키는 포인터이고 n이 정수일 때
ptr[n] = *(ptr+n)

#include <Turboc.h>

void main(void)
{
	int ar[5]={1,2,3,4,5};

	printf("ar[2]=%d\n", ar[2]);
	printf("ar[2]=%d\n", *(ar+2));
	printf("ar[2]=%d\n", 2[ar]);
}

결과는 모두 같이 3이 나온다. 3번이 이해가 잘 안가지만 말이다. ㅡㅡㅋ
2[ar] 맨 위의 공식되로 변환하면 *(2+ar) 이 되고 *(ar+2) 교환 법칙에 의해서 동일하다고 한다.
흠 그럼 다 되는 것인가 2가 배열을 가지는 것도 아닌것이.. 문법이니 외우자 쩝

더 깊게 들어가보면 *(*(ar+2)+1)이 ar[2][1]과 같다는 것을 증명하는 예제이다.

 ar[0][[0]  ar[0][[1]  ar[0][[2]  ar[0][[3]
 ar[1][[0]  ar[1][[1]  ar[1][[2]  ar[1][[3]
 ar[2][[0]  ar[2][[1]  ar[2][[2]  ar[2][[3]

#include <Turboc.h>

void main(void)
{
	int ar[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

	printf("ar[2][1]=%d\n", ar[2][1]);
	printf("ar[2][1]=%d\n", *(*(ar+2) +1));

	//부분 배열을 가르키는 포인터
	printf("sizeof(ar+2)=%d\n", sizeof(ar+2));
	//선두번지의 포인터 상수 즉 부분 배열이 된다. 
	printf("sizeof(*(ar+2))=%d\n", sizeof(*(ar+2)));
	printf("sizeof(*(ar+2)+1)=%d\n", sizeof(*(ar+2)+1));
	

	printf("ar[2][0]=%d\n", *(ar+2));
	printf("ar=%d\n",ar);
	printf("*ar=%d\n",*ar);
	printf("**ar=%d\n",**ar);
	printf("ar[0][3]=%d\n", *(*ar + 1));
	printf("sizeof(*(ar+2)+0)=%d\n", sizeof(*(ar+2)+0));
}

결과
ar[2][1]=10
ar[2][1]=10
sizeof(ar+2)=4
sizeof(*(ar+2))=16
sizeof(*(ar+2)+1)=4
ar[2][0]=1245012
ar=1244980
*ar=1244980
**ar=1
ar[0][3]=2
sizeof(*(ar+2)+0)=4


1번째 2번째는 결과가 같다는 것을 증명했다. 
ar+2 이를 했을 경우 ar[2] 번지로 이동한다. 부분배열을 가르키는 포인터이다.  
*(ar+2)가 되었을때 16비트가 되면서 부분 배열의 선두 번지 &ar[2][0]으로 평가된다.
 *(ar+2)+1 포인터 상수에 정수를 더해서 ar[2][1] 포인터를 리턴한다.
*(*(ar+2)+1)  ar[2][1]에 해당하는 값을 가져온다.

재미있는 것은 ar=*ar이 같은 주소를 가르키는 포인터이고 **ar 했을 경우 그 값을 가져온다는 것이다.
2차원 배열은 이중포인터라는 것, 
 즉  *(ar+2) *은 값을 나타내는 표시인데 *(ar+2)값이 포인터라는 것이다. 한차례 더 써줄 경우 거기에 있는 값을 가져올 것이다. 만약 *(*(ar+2))를 할 경우 9를 가져올 것이다. 

그럼 1차원 배열을 보도록 하겠다.
#include <Turboc.h>

void main(void)
{
	int ar[4]={10,20,30,40};

	printf("%d\n", *ar+2);
	printf("%d\n", *(ar+2));
}

결과
12
30

결과를 보면 알 수 있듯이 1차원에서는 *ar 값이 바로 값이 되는 경우이고 2차원일 경우 *ar이 포인터가 되는 경우이다.
연산 결과 *이 앞에 있으므로 첫번째는 바로 값으로 변환되고 ar의 경우 포인터 연상이 되어 2칸 이동하여 30의 결과를 가져온다.

어쩌면 포인터와 배열명은 같을 수도 있다.
#include <Turboc.h>

void main(void)
{
	int arr[2] = {1,2};
	int *pArr=arr;

	printf("%d, %d \n", arr[0], *(arr+1));

	printf("%d, %d \n", pArr[0], *(pArr+1));
}

결과는 1,2로 같다. 이제까지 잘 이해해 오다가 포인터에서 다시 막막하기 시작한다. 이번엔 정복해야 되는데.. 쩝
지금까지 한 것이 정답이 아닐수도 있다. 이건 내가 돌려보며 이해한것이니 혹시라도 다른 사람들이 보더라도 오해가 없기를
그리고 지적해주기 바란다. C언어 공부중이다. ㅎㅎㅎ

+ Recent posts