2011년 12월 31일 토요일

throws

throws 문은 예외를 현재 메소드에 처리하지 않고 상위로 전파하여 처리하고 싶을 때 사용
예외가 가장 상위 레벨의 메소드로 전파가 되었는데도 예외를 처리하지 않고 다시 상위로 전파하고 있으면 자바가상머신은 해당 예외를 잡아 예외 정보를 화면에 출력하고 프로그램 종료









혼자 진행하는 ICT 동아리... ㅠㅠ 실력자가 없다. 댄장.


현재 FA 관리자가 없으므로 단순히 공지 형태로 진행하겠습니다.

PDS 출자금 +100만. 창단기 하준호.

-------------------------------------------------------------------------------------------


돈이 있다면 개인적 디바이스들은 애플로 가는 것이 맞다.

노트북만 봐도 맥보다 나은 사양으로 가격은 더 낮은 경우도 봤고,

애플이 만드는 제품중에 유무선 공유기 같은 애들은 성능 이슈로 문제되는 후기를

많이 봤었다. 그리고 애플이 생산하는 제품들을 모두 애플이 만들 수 있는 것도 아니다.

SK처럼 애플도 모두 자기 바운더리 안에 두려고 한다.

애플 아닌 윈도우는 진영은 그런 성향이 더 심하다.

물론 운영체제를 유연하게 만드는 것은 좋지만. 그런 유연함으로 수많은

바이러스들이 생기고 또 바이러스가 아니더라도 커스터마이징한 회사(삼성같은)가

사용자 정보를 마음대로 다룰 수 있게 된다.

뭐, 도덕적인 회사라면 괜찮겠지.

각설하고.

애플이 최고의 하드웨어가 아닐지라도 3rd party에게 제어권을 다 주지 않고,

나름 혼자서 다 케어 하려고 하고 있다.

그리고 실제로는 국내 회사가 아니라서 정경 유착도 되기 힘들 것이다.

가장 매력적인 것은 윈도우 보다 사용자가 적다는 것.

이것은 더 큰 가능성을 이야기 하고 있다.

이왕 사려면 애플 제품을 사는게 맞다.

나 같은 경우는 맥북도 있고 윈도우 디바이스도 쓰고 리눅스 디바이스도 쓴다.

개발자이다 보니 이것저것 다 사용하게 되는데, 사실 내 눈에 모두 버그 덩어리로 밖에

안 보인다. 영화 볼 때는 윈도우가 좋고, 개발은 리눅스가 좋고. 뽀데는 애플이 좋다.

사실 썬 마이크로 시스템즈가 건재하면 그것만 이용하련만...

애플은 배터리를 갈 수가 없는데, 사실 예쁜 것도 이유 겠지만. 배터기가 갑자기 빠졌을

때와 같은 상황의 컨트롤은 정말 엄청난 기술력을 요하는 부분이다.

그리고 애플의 실제 개발자는 싱가폴에 있다고 미국 친구가 이야기해 줬었는데,

딱히 공개된 부분이 많지도 않은 애플이라.

삼성에 다니긴 하지만 옴니아 때부터 쭉 프로젝트를 해서 아는데 디자인은 애플이

늘 먼저 나가고 우리 회사는 따라가기 식인 것 같아서 참 씁쓸하다.


갤럭시 S 처음 나왔을 때도 큰 박스 였다가 아이폰 3GS가 단촐한 박스로 가니까

순식간에 박스도 바뀌었다.

 더 짜증나는 건 LG 디바이스를 가지고 회사 가면 아예 봉투에 봉인해 버리는데,

애플 디바이스를 들고 가면 간단히 스티커만 붙인다.

 따라하는 곳에 대한 예의인가?

 삼성도 부서마다 다르겠지만 내가 LG나 아이폰 쓰는 걸 눈꼴셔 해서 걍 삼성폰 회선 놔두고

2개를 쓰는데 개발자들이 자꾸 내 개인폰을 빌려가서 써서 겁나 짜증이 났었다. 보고 참고

한다고 하는데... 사실 사람 생각 자체가 모방이지만 그래도 창조자와 모방자 차이를 안다.

 내가 볼 때 우리 회사는 평생 모방만 하다가 종칠 것 같다. 모토라로 까부수자는 글귀 하나로

무선사를 이룩했기 때문에 그 열정을 알긴 하는데, 걍 대충 된다 싶으면 배끼고 보는 더러운

심보는 고쳐야 한다고 생각한다.

 엘리베이터 탔을 때 피씨쪽 임원이 맥북 까보니 정말 잘 해놨더라 하는 이야기를 듣고,

 결국 이런 문화가 걍 다 퍼져 있음을 알게 되었다. 아니, 그럴거면 아이폰 쓰라고 아예 권장을

하던가. 좋은 음악을 들어야 좋은 곡을 쓰듯이 좋은 걸 써봐야 좋은 걸 만들지 않겠나...

 디자인 하는 친구들은 다른 회사꺼 배끼는데 디자인이 좋다는 건희형 말에 개발자는 개 발

보듯 하고 디자인 하는 친구들은 무조건 우대해 줘봤자. 결국 애플 발밑이라고 생각한다.

 뭐, 무조건적인 조직에의 반발은 아니고 안드로이드 팔러 왔는데 리눅스 팀 있다고 걷어차 

버리더니 몇년간 못 만들고 나니 그 리눅스 팀 사람은 GA(google Android)팀으로 가서 이미

해 놓은 리눅스 빨이 있으니 좋은 고과 받는 것을 보면서(걔네들이 상품화 때 딱히 뭘 도와주기

나 하나...) 세상 참 웃긴다고 생각했고,

 나부터 제대로 생각을 가지자고 마음 먹었다.

 삼성 감압식 터치 방식 고집하다가 애플 잘 나가니까 정전용량 방식으로 터치 바꾸라고 했고,

디자인(제품, 박스 셋, 설명서 등등)보면 걍 그대로 가져 왔다고 생각한다. 증거? 증거는 내가

둘 다 쓰는 사용자니까. 

 개발은 아니다. 개발은 각 폰마다 소프트웨어가 다 달라진다(같은 안드로이드라도). 

뭐, 내가 디자이너는 아니니까 디자인도 다륻고 하면 할말은 없고, 디자인 하는 친구들도

우리가 폰에 다 다른 소프트웨어를 넣는다고 하면 다 같은거 아니냐고 반문할 거니까.

 믓튼... 삼성맨이니까 삼성 제품 많이 쓰긴 하는데(그래봤자 이익은 외국인 배당금으로 다 나가겠지만) 잘 만든 제품보고 잘 만들었다고 할 줄 아는 자존심은 버리지 말아야 겠다.

 회사 이야기가 나오니 횡설수설 하게 되는구만.

 참... 갈길이 멀다. 일본도 같은 입장 이겠지. 잘못은 했지만 지네들이 일본 살고 있으니까

진실을 밝히기 힘든것처럼 나도 삼성안에 있으니 그 마음을 백번 이해하겠다.

그래도 독도는 우리땅. 허러쉐리들.

2011년 12월 10일 토요일

C 언어 역사는 들어가야...

기억에 캔톰슴이 B 언어를 만들었고 책은 둘이서 집필한 것으로 알고 있어서 관련해서 깊은 조사 후 추가적인 정보를 제공해야 겠다. 이런 사유로... 운영하는 프로그래머 카페에서 

최근 목적코드와 실행코드를 구분 못하고
크로스 컴파일러가 왜 있는지 정확히 모르는
컴퓨터 관련학과 고학년을 여러명 만나서 적잖히

충격은 먹은...

하긴... 요샌 추상화가 대세니까
비공개
뜨끔ㅋㅋ열공하겟심다

. 개요
  C언어는 1972년에 미국 Bell 연구소의 시스템 프로그래머인 Dennis Ritchie에 의하여 설계되었다.
  Bell 연구소의 시스템 프로그래머들은 작업 수행 환경 개선을 위하여 프로그램 개발을 위한 보다 새로운 언어를 필요로 하게 되었는데, 이러한 요구를 배경으로 1969 Bell 연구소의 Ken Thompson 등에 의하여 UNIX라는 운영체제가 탄생하게 되었다.
  Bell 연구소에서 개발된 UNIX 운영체제는 본래 어셈블리 언어로 개발되었기 때문에 기계 의존적이었다. 
  따라서 여러 컴퓨터 기종간의 호환성을 가질 수 있을 만큼 고급 언어이면서 기능 면에서 어셈블리 언어와 같이 컴퓨터의 하드웨어 기능까지를 제어할 수 있는 새로운 프로그래밍 언어가 필요하게 되었다. 이에 따라 Ken Thompson은 이식성이 높은 고급 언어인 B언어를 개발하였으며, 그후 Dennis Ritchie가 B언어를 개량한 C언어를 개발하게 되었다.

◉ C언어의 발전 과정
▪ALGOL 60 / 1960년 국제위원회 설계
▪CPL(Combined Programming Language) / 1963년 케임브리지 및 런던 대학
▪BCPL(BASIC Combined Programming Language) / 1967년 케임브리지,
  Martin Richards
▪B / 1970년 Bell 연구소, Ken Thompson
▪C / 1972년 Bell 연구소, Dennis Ritchie
▪C++ / 1980년대 초, Bell 연구소, Bjarne Stroustrup

◉ C언어 응용분야 : 자료구조, 게임, 인공지능, 수치계산 등


2. C언어의 특징
① 이식성이 좋다.
② Block 구조형 언어이다.
③ 하드웨어 제어가 가능한 저 수준의 기능을 갖고 있다.
④ 컴퓨터 구조를 염두에 둘 필요가 없는 고급 언어이다.
⑤ 다양한 연산자를 사용한다.


3. 컴파일 과정
   소스코드 ⇨ 컴파일러 ⇨ 목적코드 ⇨ 링커 ⇨ 실행코드
                           ↗   ↖
         시동(start-up)코드   라이브러리 코드

2011년 12월 6일 화요일

[비전] plandosee.org

플랜두씨는 계몽 동아리 입니다.

누구나가 계획을 세워 행복해질 수 있다는 것을 모토로 계몽 활동을 할 것입니다.

계획을 세우는 방법도 공유할 것이며,

그것을 실천하는 방법.  실천을 하고 나서의 피드백 등등.

올바른 계획을 세우고 그것을 실천하고, 계획이 성공이던지 실패이던지

거기서 행복을 찾아내는 방법에 대한 연구를 하는 동아리 입니다.

2012년도 목표는 계몽 동아리를 탄탄히 할 수 있는 창단기 모집이 첫 목표입니다.

기수별로 특색이 있도록 모집을 하겠지만. 창단기 만큼은

풍파 많은 세상에서 흔들리지 않는 뿌리같은 사람들, 자신에게 펼쳐진 운명과

세상속에서 선방하고 있는 사람들을 뽑을 것 입니다.

그렇게 뿌리를 공고히 해야 앞으로 계몽 동아리의 항해에 좌절이 있더라도

다시 일어설 수 있는 힘을 가지게 될 것입니다.

plandoosee.org의 최종 목표는 자본주의 사회에 꼭 필요한
하나의 사상이 되고 스스로 일어설 수 있는 생각의 방법을 공유하는 것 입니다.

그리고 다음 기준에 부합한다면 얼마든지 조직은 유연하게 바뀔 수 있습니다.

1. 모든 사람의 행복을 바란다는 점.
2. 그 행복은 인간의 사고(생각)에 기준한다는 점.
3. plan do see 의 과정이 필요하다는 점.

2011년 12월 4일 일요일

[CODE] C++에서 *와 &의 차이

레퍼런스 변수는 c에서는 작동하지 않는다.


/Users/hajunho$ !gcc
gcc a.c
a.c:8:5: error: expected identifier or '('
int &m = a;
    ^
1 error generated.


 원래 없는데 에러 메시지 타입이야 어떤들 난 모르리. 원소스에(ㅡㅡ; 별거 없어서 안 씀) 몇 줄 추가해 보았다.

#include <stdio.h>

int main()
{
int i[] = {1, 2, 3};
int* j = i;
int a = 10;
int &m = a;
printf("%d", m);

}

C++에서는 먹는데 10이 출력된다. int &m = j 를 대입하면?

g++ a.cpp
a.cpp:7:6: error: non-const lvalue reference to type 'int' cannot bind to a value of unrelated type 'int *'
int &m = j;
     ^   ~

1 error generated.

포인터 타입에는 대입될 수 없다고 나온다. j를 *j로 바꾸면 정상 동작한다.

즉, 레퍼런스 변수는 값을 가리키는 변수다.

printf("%d\n", &m);

printf("%d\n", i);

m변수의 주소와 i의 주소를 보면

/Users/hajunho$ !g++
g++ a.cpp
a.cpp:8:16: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
printf("%d\n", &m);
        ~~     ^~
a.cpp:9:16: warning: format specifies type 'int' but the argument has type 'int *' [-Wformat]
printf("%d\n", i);
        ~~     ^
2 warnings generated.
/Users/hajunho$ ./a.out 
1348565628

1348565628

같다.

결론은 레퍼런스 변수는 NULL 을 가질 수 없고, 값을 지칭하는 변수라는 것.

포인터 변수에 아무것도 쓰지 않으면 주소 연산이 되는 것과 달리 레퍼런스 변수는 값 연산이 되어 버린다. swap 같은 것을 구현하면 코드양이 준다(편리하다고는 하지 않겠다)

즉, 레퍼런스 변수는 따로 메모리를 잡지 않는 변수이다.

[] 연산자 오버로딩에서

int element(int i)
blah, blah
return arr[i];
}
로 되어 있을 때 a.element(10) = 5 로 쓰면 에러다. 이 때 int를 int&로 바꿔주면 가능하다. 값을 리턴하는데 값에다가 값을 대입하니... 레퍼런스는 해당 값이 있는 주소를 반환한다. 레퍼런스 변수에 대입할 때는 값 형태로 대입된다는 사실은 변함없다.

다 알겠지만 포인터 변수 자체의 메모리는 따로 잡힌다. 4바이트, 64비트에서는 8바이트로 고정이다.

동일한 기능을 하는 경우 레퍼런스 변수는 쓰는 것이 더 효율적이라는 말이다.(이론적으로는...)

효율적이란 말은 특정 상황에서 시간이 빠르거나 메모리를 적게 차지하는 경우를 말한다.

그러나 시간의 경우 컴파일 타임도 들어가므로 좀 더 세밀한 측정이 필요한데 별로....

C++은 갈수록 어려워지는게 생산성이 낮아지는 것은 사실이다. 온갖 라이브러리 붙여다가 쓰면 되겠지만

새로운 언어들은 이미 붙어서 나오니까.

왠만하면 객체를 제외하고는 C의 고유 기능으로 쓰는 C++ 프로그래밍을 하는게 좋을 것 같긴하다.

다만 나 같은 경우 이런 생각이 항상 base에 있다. 프로그램을 정말 잘 짜면

혼자서 다 짜면 되고 모듈 나눌 필요도 없이 main에서 쇼부치면 된다. 그러나 어쩔 수 없이 모듈을 나누게 되고 나누어진 모듈 끼리 통신하는게 필요하다. 그게 콜백이던 값 전달이던 메모리 공유던 간에 파라미터를 넘긴다는 것으로 이해할 수 있다. 파라미터를 넘길 때 원 값을 유지하려면 값을 넘겨 복사하면 되고 원 값을 바꾸려면 주소를 넘기면 된다. 그것이 포인터, 또 함수 포인터다. 콜백도 함수포인터로 구현하고 자바에서도 실제적으로 인터페이스로 구현한 껍데기의 주소를 넘기는 방식으로 콜백을 쓴다.

그럼 사실 레퍼런스 변수라는 것은 이상적인 녀석이다. 반복 때문이던 효율성 때문이던 다른 사람이 쓰라기 때문이던 모듈을 나눈다면 주소 교환 방식이 좋다는 것이다. 더 커지면 소켓, 파이프, 디바이스 드라이버, COM, TCP/IP가 들어간 온갖 프로토콜... 이겠지만 원래 변환할 값을 넘기는 것이 맞는 페러다임이다. COPY가 필요하다면 컴파일러에 맡기지 말고, 자료 구조를 하나 만들고 거기서 컨트롤하는게 맞다.

그러나 이런 생각들과 별개로 시장은 너무 빨리 변하고 개발 속도는 느리기에 그냥 이해하고 적당히 맞춰서 쓴다.

안그랬으면 CPU 설계하고 거기 맞는 운영체제 만들고 프레임웍 만들고 했겠지 ^^;;

2011년 12월 1일 목요일

도출 연역을 이용한 정리 증명 알고리즘

증명하고자 하는 정리를 부정하여 공리 리스트에 넣음
공리들을 연언 표준형으로 표현한 후 절 분리
도출 가능한 쌍이 업을 때까지 다음을 반복
1. 도출 가능한 쌍을 찾아 도출절을 구함
2. 도출절을 공리 리스트에 추가
3. false가 얻어지면 정리가 참임이 증명됨
정리가 거짓임을 알리고 종료

[공지] 계몽 동아리 plandosee.org 창단

12월 1일 정동민 lev.31 이 입단을 하게 따라

xxx 출신인 그에 맞게 plandosee.org는 xxx 비공식 계몽 동아리로 출범하였습니다.

bootcamp 지우기

맥북 프로 레티나 터치바 diskutility 에서 bootcamp 파티션 삭제하면 검은색에서 회색으로 바뀐다(APFS로 지정) 파틴션 아이콘 클릭하여 - 버튼을 이용하여 삭제하면 끝.