2013년 10월 28일 월요일

C 언어의 함수 포인터

아래 프로그램은 함수를 인자로 받아서 합을 계산하는 프로그램이다.





먼저, 함수 P_FN은 인자로서 f()함수를 전달받고 있다.

함수 P_FN()은 인자로 double f(double x)를 받고 있다. 

따라서 f()함수는 double 형 인자를 받아서 double을 리턴하는 어떠한 함수라도 상관이 없다.

실제 main()함수에서 f()함수는 fn(), sin() 함수를 인자로 사용된 것을 볼 수 있다.

P_FN 함수에서 함수 f()를 호출하기 위해서는 위 프로그램과 같이 f(k)로 하면 함수가 호출된다.

여기서 함수명 f는 주소를 나타내며, (*f)(k), f(k)의 결과는 같다.

아래는 실행 결과를 보여준다.




c언어의 함수 포인터는 1) 함수의 인자로 전달 될 수 있고, 2)배열로서 사용될 수 있고, 3)함수로부터 리턴될 수 있다.

따라서, 마치 변수에 변수 포인터를 사용하는 것과 똑같은 방법으로, 함수에도 함수 포인터 사용할 수 있다.

이것은 C언어에서 포인터 변수는 주소를 저장하고, 포인터 변수를 선언할 때 자료형을 같이 선언해주기 때문이다.

즉, 포인터 변수의 자료형에 따라서 그 자료의 크기를 정확히 컴파일러가 알 수 있기 때문에 변수의 포인터인 int *p와 비슷한 방법으로 함수 포인터를 사용할 수 있는 것이다.

c언어 문자 배열을 익히자 2 (c언어 배열)



아래의 프로그램은 문자배열을 보여준다.

문자 배열은 변수선언과 초기화를 같이 하는 방법이 있다.

char a[][15] = {"abcd", "a is for apple"};

또한, 배열 포인터를 먼저 선언한 후, 초기화하는 방법이 있다.

char *a[2];         // 배열이 포인터 변수로 선언되어 있으므로, 이 변수에는 주소를 저장해야만 한다.
                           // 이는 역참조 연산자 *와 배열 연산자 [ ]의 우선순위는 배열 연산자가 앞서기 때문이다.

a[0] = "abcd"                 // a[0] == *a 이므로, a[0]는 "abcd"을 의미한다.
a[1] = "a is for apple"     /a[1] == *(a+1)이므로, a[1]]은 문자열 "a is for apple"을 의미한다.

하지만, 아래와 같이 배열로 초기화하면 컴파일할 때 에러가 난다.

char *a[2];   
a[ ] = {"abcd", "a is for apple"};   // 에러가 난다.

이는 배열의 초기화는 변수 선언에서만 유효하기 때문이다.





아래의 결과와 같이, 배열의 경우 배열명 a와 주소 연산자가 더 있는 경우 &a는 똑같은 번지(001AFD0C)를 가리키고 있고, &a[0] 또한 같다.

즉, 배열의 경우, 배열명 == &배열명 == &배열명[0]이 성립한다. 

이 경우 a == &a == &a[0]는 같이 첫번째 배열인 "abcd"의 첫 주소 001AFD0C를 저장하고 있다.

따라서 *&a[0] == a[0]는 "abcd"를 의미한다.



아래는 이를 정리하여 나타낸 것이다.

아래의 주소명은 실제 주소인 001AFDOC, 001AFD1B를 가리키며, 아래의 데이타 "abcd", "a is for apple"를 나타낸다.




여담으로, 메모리를 동적으로 할당하려면 malloc() 함수를 사용하면 아래의 프로그램도 위의 프로그램과 실행결과가 같다.

char *a[2];   

a[0] = malloc(sizeof("abcd"));
a[1] = malloc(sizeof("a is for apple"));

a[0] = "abcd";
a[1] = "a is for apple";

C 언어 포인터 이해하기 1 (숫자편)



C언어에서 가장 이해하기 어려운 것이 포인터(pointer)의 개념이다.

아래는 c언어의 포인터를 설명하기위한  C언어 프로그램을 보여주며, 첫째 줄에서 변수를 선언하고, 두번째 줄에서 변수를 초기화하고 있다. 

각 변수의 주소를 알기 위해셔, printf 함수에 포함된 %p를 이용해서  변수의 주소를 인쇄했다.

그리고, 변수명 앞에 위치한 &는 주소를 나타내고, 포인터 * 는 변수에 저장된 주소가 가리키고 있는 곳의 값(맨 아래의 그림의 화살표를 참조)을나타낸다는 것을 알고 시작하자. 




위 프로그램의 p = &i 라는 명령어를 쉽게 알아보자.

이 명령어는, 변수 i 3 A 번지에 저장했다면, B 번지에 위치한 포인터 변수 p A 번지를 저장시키라는 명령어이다. 

먼저 &i는 변수 i의 주소를 가리키므로 p는 포인터 변수, 즉 주소 저장하는 변수 선언되어야 한다.

그리고, *p 변수 선언을 하는 것 외에 사용되면, *p의  의미는 p 저장 A 번지 내용 3을 가리킨다.

따라서, 이 프로그램을 컴파일하여 실행하면 아래와 같은 결과가 나온다.



위의 결과를 설명하면 아래와 같다.

그리고, 편의상 아래의 메모리의 주소는 위의 실행화면의 주소 중에서 마지막 3개만 나타냈다.
  
즉, int 변수 i가 저장된 주소는 E2C 번지이고 이때 저장된  3이다.

이때 p = &i라는 명령어를 만나면, E14 번지에 포인터 변수 p가 할당되고, 그 값은 변수 i의 주소인 E2C 번지가 저장된다.

그리고, 프린트 함수에 포함된 *p의미는 그림의 화살표와 같이 포인터 변수에 저장된 주소(E2C)에 저장된 값인 3을 가리킨다.






여담으로, 위 프로그램은 변수 선언 및 초기화가 아래와 같이 분리되었다.

int i, j, *p, *q;                  // 변수 선언
i = 3; i = 5; p = &i, q = &j;  // 변수 초기화 

하지만, 변수선엄 치 초기화를 한 곳에 합치면 아래와 같이 작성할 수 있다.

int i =3, j=5, *p =&i, *q=&j;  // 변수 선언 및 변수 초기화
  

위의 실행화면에서 에러가 난 것은, 포인터 변수인 *r 이 변수 선언만 되고, 초기화가 안됐기 때문에 생긴 에러이다.

이것은 변수 선언과 초기화가 무엇인지 알려주기 위해서 추가했다.

그러면 훈련으로 아래의 결과를 알아보자.

1. **(&p)
2. 7*(*p) / (*q) + 7   // i, j가 int 형 변수라는 것이 힌트.
3, p == (&i)


답은 3, 11, 1이 된다.

[우분투 리눅스 12.04 LTS] 윈도우7에 멀티부팅으로 우분투 리눅스 설치하기



윈도우7에서 우분투 리눅스 12.04멀티 부팅으로 설치하는 방법을 알아보자.

먼저 우분투 리눅스 설치파일은 아래 그림의 '다운위치'를 인터넷 익스플로러 또는 파이어폭스 등의 주소창에 아래와 같이 입력한 후 엔터를 친다.






우분투 다운로드 위치는 아래와 같다.

이때 아래 그림의 윈도우의 우분투 설치 관리자 파일인 wubi.exe를 다운 받은 후 이를 실행한다.


아래의 그림은 우분투 설치관리자를 실행한 화면이다.

여기서 언어는 한글이나 영문으로 설정하면 되고, 설치크기는 최대인 30G로 설정하고 데스크탑 환경은 Ubuntu로 설정하고, 사용자 이름 및 암호를 입력한 후 설치하기를 누른다.



아래는 우분투 리눅스를 설치하는 화면이다.


우분투 리눅스가 설치된 후의 모습이다. 이때 다시 부팅을 시켜주면 나머지 부분이 설치가 되면서 완료된다.


설치가 완료된 후 다시 부팅이 되면, 윈도우7과 ubuntu 중 어느 것을 부팅할 지를 선택하는 화면이 나온다.

아래는 우분투를 선택한 후 부팅한 모습이다.

이것은 우분투의 기본 화면이 아니고, 배경화면인 gnome을 설치하고 및 한글 입력기인 nabi 등이 설치된 후의 모습이다.

또한 바탕화면의 그림도 다른 것으로 변경했다.


>

[3월의 축령산] 편백나무 가득하고 공기가 맑은, 축령산 자연휴양림

가족과 3월에 편백나무가 많은 경기도 남양주에 위치한 축령산을 다녀왔다.

먼저 서울에서 가깝고, 공기가 매우 맑아서 무척 좋았다.




축령산 자연휴량림은 매년 1~2번 방문했고, 가족이 모두 같이 방문했고, 이 날은 바람이 매우 거세고 추워서 이번에는 간단히 산책만 하고 왔다.

아래는 등산도를 보여준다. 

산 정상이 높지 않아서 아이들도 쉽게 올라갈 수 있어서 가족이 등반하기에 좋다.

예전에 잔디광장을 통해서 축령산 정상까지 아이들과 같이 올라갔던 적이 있었는데, 높이도 적당하여 반나절 동안 등산하기에 적당한 곳이다.




차를 주차장에 주차한 후 올라기 시작했을 때이다.

마치 지금도 상쾌한 공기가 느껴지는 것 같아서 좋다.
  







옆에 있는 야영데크를 발견했다. 




두세 가족이 이미 데크에 텐트를 치고 야영을 하고 있었다.

데크 아래에는 수도 시설과 화장실 등이 있어서 야영하기 좋은 것 같았다. 

시설 또한 좋게 유지되고 있었다.

  






개울에 구름다리가 있어서 건너가 보았다.





그곳에는 산림휴양관이 있었다.

이때 전체 방 중에서 약 1/3 정도만이 이미 차있었다.

그전에 한번 숙박한 적이 있었는데, 시설은 꽤 쓸만했다. 

하지만, 휴양림의 예약은 매월 1일 9시에 예약을 받는데, 이 날 바로 접속해도 주말에 예약을 하기가 힘들었다.









축령산 휴양림의 숙박 시설 사용료는 아래와 같다.




산림휴양관 근처에 있는 표지판이다.





구름다리 아래에 매우 맑은 개울있다.

개울의 물은 맑고 매우 깨끗해서 좋았다.

여름에는 이곳이 아이들로 가득차게 된다.




여름에 사용하도록 샤워장도 근처에 있다.


ETF(상장지수펀드)를 소개합니다. 1

주식 시장에서 좀더 안정적으로 돈을 벌 수 있는 방법에 관해서 연재하겠습니다.
일단, 최종 목표는 ETF를 분할 매수 및 매도를 반복하는 방법입니다.


이를 위해서, 먼저 ETF에 대한 일반적인 이야기부터 하겠습니다.

ETF(상장지수펀드, Exchange Traded Fund)는 특정 종목 또는 주가지수를 추종하는 '연동형 펀드(Index Fund)'의 일종이며, 거래소에서 주식처럼 거래됩니다. 

한마디로 주가지수를 사고 파는 증권 상품으로서, 주식시장에서 거래되는 주식입니다.

상장지수 펀드는  87년 프로그램 매매에 의한 연쇄 주가폭락함에 따라 93년 1월 미국에서 처음 선보였고, 
현재 독일, 영국, 스위스, 스웨덴, 호주, 뉴질랜드, 홍콩, 싱가포르 등의 증시에 도입돼 있습니다.


 

위 그림은 현재 코스피 시장에서 거래되고 있는 ETF를 보여줍니다.
먼저 KODEX, TIGER, KSTAR, KOSEF는 각각 삼성증권, 미래에셋증권, KB증권, 우리투자증권이 판매하는 ETF입니다.
당연히, 이 ETF는 같은 KOSPI 200 종목을 추종하더라고 구성종목, 구성비율 등이 다르기 때문에 수익률도 약간씩 다릅니다.

또한 현재 상장된 ETF는 아래와 같이 굉장히 많은 종류가 있습니다.
  1) 시장지수: KODEX 200, KODEX 레버리지, KODEX 인버스 등
  2) 주식테마: KODEX 삼성그룹, TIGER 블루칩 등
  3) 주식섹터: KODEX 반도체, KODEX 자동차 등
  4) 해외주식: KINDEX 중국본토CSI, KODEX Chana A50, KODEX Chana H 등
  5) 실물 및 파생: KODEX 골드선물, KODEX 구리선물, TIGER 원유선물, TIGER 농수산물 등

하지만 현재 가장 많이 거래되는 종목은 지수를 추종하는 KODEX 200, KODEX 레버리지, KODEX 인버스 등입니다.

또한 KINDEX 중국본토CSI와 같이 해외 ETF는 외국 주식에 투자하기 때문에 소득세 15.4%가 부과된다는 단점이 있습니다.

ETF의 장점은 아래와 같습니다.
  1) 저렴한 수수료일반적인 주식형 펀드는 약 2.5%, 지수를 추종하는 인덱스펀드는 1%이지만, 상장지수펀드(ETF)는 약 0.5% 정도로 저렴함. (약 0.2 ~0.9%로 다양합니다)

  2) 분산투자 효과특정 회사에만 투자하지 않고 상장지수펀드(ETF)를 추종하는 지수구성종목 전체에 투자함으로써 분산투자 효과를 가짐.

  3) 간편한 거래방법증권거래를 위한 위탁계좌만 있으면 HTS 등을 통해 일반 주식처럼 편리하게 매매할 수 있음. 일반 성장형펀드나 인덱스펀드와 달리 환매시 환매 대기 시간이 필요하지 않음.




(자료: 제로인)


즉, 일반 주식과 같이 사고 팔 수 있는 것이 특징이고, 가격이 약 1만원 정도로 비싸지 않아서 매수하기 쉽다는 장점이 있습니다.

코스피의 높낮이(PER)를 살펴보자. 2

현재 주식시장이 적정 가격인지를 알기 위해서, 일반적으로 코스피의 PER를 보게된다.

이에 대해서 알기 위해서, 먼저 PER(price earnings ratio, 주가수익비율)에 대해서 알아보자.
PER은 현 주가를 주당 순이익(EPS)으로 나눈 값이다.

 




쉽게 말하면, 회사의 경우 매출액의 약 10%를 적정 이익으로 생각하기 때문에, PER이 약 10이라는 것은 주가가 주당 순이익의 10배가 된다는 것입니다.

즉, PER이 10이라는 것은 매출액의 약 10%를 순이익으로 보는 것입니다. 
다른 말로 PER이 높아진다는 것은 순이익에 비해서 주가가 높아진다, 즉 비싸진다는 것입니다.

다시 말하면, PER은 그 회사의 주식이 고평가인지 또는 저평가인지를 알려주는 지표로 사용된다.
하지만 이런 원칙으로 특정 회사의 주식을 매매하는 사람은 없다.

왜냐하면, 회사가 소위 전망이 좋고 현재 잘나간다면 현재PER이 100 이여도 주식가격이 싸다고 말하고, 이와 반대로 성장가능성이 거의 없는 회사인 경우 PER이 5 이여도 현재 가격이 비싸다고 하기 때문이다.

결론적으로 개별 주식에 PER을 적용하여 주식가격을 평가하는 것은 위험하다.

하지만, 코스피 지수는 전체 개별주식의 거래가를 합하여 지수형태로 만든 것이라서, 코스피 지수의 PER는 코스피 지수가 저평가인지 또는 고평가인지를 굉장히 정확하게 알려준다.

아래는 주요 4개국의 주식시장의 PER을 보여준다.


(출처: 매일경제) 


위 그림에서 한국의 코스피의 경우 PER은 약 6 ~ 14 정도에서 움직이는 것을 볼 수 있다.

하지만 주의할 것은 위 자료는 12개월 선행 PER 이기 때문에 다소 수치가 낮다.

위의 선행 PER 대신에, 현재의 코스피 PER의 경우 약 13 ~ 15 정도가 적정한 값으로 볼 수 있다.

이 때문에, 지수형 ETF에 투자를 할 경우 코스피의 PER을 살펴보는 것이 매우 중요하다.

왜냐하면, 고점에서 지수형 ETF를 구매한 후 크게 하락할 경우 몇 년동안 돈이 묶일 수 있기 때문이다.
물론 여유돈이 충분하다면, 코스피 지수가 하락할 때마다 분할 매수할 수도 있을 것이다.

어떤 ETF를 살 것인가? 3

목표가 ETF를 분할 매수 및 매도를 반복하면서 이익을 얻는 것임을 꼭 기억하고 있어야 한다.

이 목표를 이루기 위해서 어떤 ETF를 살 것인가를 결정해야합니다. 따라서 이것을 결정하기 위해서는 ETF가 추종하는 종목 또는 주가지수에 대한 간단한 지식이 필요하다.

왜냐하면 주식을 산다는 것은 미래에 이득을 바라고 구매하는 것이므로, 구매할 ETF의 기본 특성을 이해해야 한다.

먼저, ETF의 종류에는 시장지수,  2) 주식테마, 3) 주식섹터, 4) 해외주식, 5) 실물 및 파생 등이 있다고 하는 과연 어떤 것을 것을 선택해야 할까요?


일반인이 삼성그룹주, 금선물, 콩선물, 자동차 등의 주가가 미래에 어떻게 움직일지에 대해서 알기는 너무 힘이 듭니다. 
심지어 전문가들도 함부로 예측하기를 머뭇거리고 있습니다.

하지만 시장지수는 예측이 가능하고 긴 기간을 통해서 믿을 만한 흐름이 있습니다.
당연히 구매한 ETF는 코스피지수를 추종하는 ETF를 선택해야 합니다.

예로 월 단위로 코스피 지수를 보겠습니다.


 
(월간 코스피지수)




위 코스피 지수 중에서 가장 큰 특징이 무엇인가요?

금방, 보이나요?
그것은 코스피 지수가 오른다는 것입니다. 
1986년에 코스피지수는 153 이었고 현재는 2,000 정도입니다.

이것이 코스피 지수가 지닌 가장 큰 특징입니다.

그렇다면 왜 오를까요?
이 원인은 쉽게 생각해도 좋습니다.

가장 쉬운 대답은 물가가 오르기 때문입니다. 
물론 경제적 위기 상황마다 굴곡이 있지만 어째든 시장지수는 항상 우상향할 수 밖에 없다는 것이 가장 큰 특징입니다.

물론 나라가 망하면 주식시장도 망하고, 땅 값도 추락하니 이는 다른 문제가 됩니다.

또한 큰 눈으로 보면, 농업이 시작된 신석기 시대 이후로 시장은 점점 커지면서 물건 값이 점점 오르고 있습니다. 


두번째 큰 특징은 하락할 때 지수(시장가격)은 일반적으로 급락하고, 오를 때 지수는 천천히 상승한다는 것도 코스피 지수의 큰 특징 중 하나입니다.

또한 크게 보면, 추세적으로 상승을 하고 추세적으로 하락을 합니다. 

하지만 일반인들이 너무 큰 추세를 따라가기는 좀 무리가 있으니 이 특성을 이용하는데는 좀 신중해야 합니다.
잘못해서 한번 손해를 보고, 몇 년동안 팔지도 못하는 신세가 될 수도 있겠지요!

다행스럽게도 조금만 조심스럽게 주식시장을 볼 수 있다면,
일반인도 쉽게 주식시장이 과열되었는지 또는 좀 저평가되었는지 쉽게 알 수 있습니다.

이것을 알 수 있는 가장 좋은 지표가 코스피 시장의 PER 및 PBR입니다.

그래서 약 1개월에 한번 정도는 주식시장의 PER을 확인하는 것이 필요합니다.
회사가 3개월에 한번씩 실적을 발표하고 KRX에서 한달에 한 번씩 코스피 PER을 발표하기 때문이지요! 

코스피 PER을 알 수 있는 곳은 아래에 링크를 하였습니다.
KRX 홈페이지에서 '주식통계'-'투자지표'-'주가이익비율(PER)'을 선택하면 됩니다.


아래는 월단위로 본 코스피 PER을 보여주고 있습니다.
2013년 1월 평균 코스피 PER은 12.73입니다.