http://slipp.net/questions/268



많은 댓글 토론? 들이 난무하는 글이나 기억에 남는 댓글만 가져와본다.


장원준 from 생활코딩.

프로그래밍은 추상적인 목표를 구체화하고 구현하는 쪽이 강하고 인문학은 구체적인 현상이나 상황을 모아서 추상화하는 쪽에 더 강합니다. 물론 둘 다 한쪽 방향의 사고만 하는 것은 아니겠지만 큰 흐름은 반대방향이죠. 한쪽 방향은 결과물을 만들고 다른 방향은 목표를 만들어냅니다. 시키는 것만 구현하는 프로그래머가 싫다면 새로운 목표들을 찾는 안목이 있어야겠지요 ^^


류동국 from server-side-architecture-group.

IT의 역사는 50년 정도입니다. 다른 인문사회학은 인류의 탄생과 그 궤를 같이 합니다.
소프트웨어 공학의 역사를 보면, 초기에 많은 방법론이나 프로세스에서, 사람이라는 요소를 배제한 경우가 많았습니다.
소프트웨어를 만드는 가장 큰 요소는 컴퓨터가 아니라 사람이라는 인식은 우리나라에서는 아직도 생소한 개념이죠.  
많은 프로젝트를 진행해보면 실제로 가장 중요한 동인은 인간이며, 인간과의 관계속에서 소프트웨어들이 만들어집니다.
해외는 이러한 부분을 상당히 일찍 연구하기 시작했고, 소프트웨어 심리학을 발전시키기도 했죠. (이 책은 1971년에 초판이 발행되고 내용은 아직도 놀랍도록 유효합니다.)
또한 모든 상황의 배경이 되는 인문학을 모르면, 큰 흐름과 큰 그림을 그리는 것에 상당히 취약함을 보이게 됩니다.
가끔 최신 기술에 대한 많은 글들을 읽게 되면, 해당 기술 자체에 매몰되는 것을 많이 보게 됩니다.
사실 그러한 기술들이 나오게된 사유의 배경과 깊이를 알고, 원리를 이해하는 것이, 기껏해야 남들이 만들어놓은 기술의 사용법 정도를 익히는 것보다 훨씬 가치있을 것입니다.
또 다른 사례로 sw 아키텍처 관련 서적이나 자료를 보면 개요부분엔 항상 역사 또는 건축에 대한 이야기로 부터 시작됩니다. 인문학적 지식이 없는 사람들에겐 아무런 insight를 주지 못합니다.
하지만, 인문학을 아는 이는, 전체를 관통하는 큰 줄기가 머리를 스치게 되죠. 앞으로 이런 이야기가 전개 되겠구나 하고 말이죠. 
사실 소프트웨어 개발은 컴퓨터를 도구로 할 뿐인 너무나 사회적이고 인간적인 활동이었던 거죠.


2개의 덧글을 읽고.. 형용하기는 어려우나 이해할 수 있었고 뭔가 와닿는 부분이 있었다.

그래서 블로그에 남겨본다.



http://gamjachoi.blogspot.kr/2013/08/blog-post.html


개인의 생각을 굉장히 진솔한? 느낌으로 적은 글.

공감할 수 있었고 중요하다고 생각되는 부분을 인용해본다.


프로그램 실력이나 기술은 매우 중요하다. 하지만 그것 자체가 새로운 도전을 시작하게 하지는 못한다. 삶에 대한 진지한 고민으로 말미암아 가슴에서 우러나오는 용기와 도전 정신이 새로운 모험을 하게 만든 다. 이것이 현대를 살아가는 개발자들이 인문학을 해야 하는 이유이다. 인문학을 통해서 인생에 대한 새로운 안목을 갖고, 새로운 내 안 에 있는 용기를 발견해야 한다. 이번 주말에는 시간을 내어서 인문학 속에서 왜 사는지 그리고 어떻게 살아야 하는지 진지하게 고민을 해 보면 어떨까?



http://news.mt.co.kr/mtview.php?no=2013041508100425605


'프로그래머가 인문학을 해야 하는 이유'와는 거리가 있지만,

'이런 사람도 있구나' 정도를 느낀 기사. 

(링크 따라가면 지저분한 광고가 덕지덕지 붙은 언론사 홈페이지의 기사로 넘어가서 짜증)


일부만 발췌해봤다.


시인 된 프로그래머 "인문학 감성이 IT와 만날때"

(중략)

"시를 왜 쓰냐고요? 시를 통해 내 감정을 표현하고 그 감정을 다른 사람들과 공유할 때 느끼는 희열이 얼마나 큰지 몰라요. 현대인은 외롭잖아요. 사회적 위치에 오른 것같고 일도 많이 한 것같지만 막상 남는 건 별로 없죠. 술 마실 때만 감정을 표현하지 말고 글로 자신을 표현해보라고 주변에도 많이 권합니다."


존경스럽고 그런 정도는 아니나...

(기사가 조금 마음에 안 드는 게 시를 쓰는 게 인문학 감성까지라고 할 수 있는 건지는 모르겠다)


왜 저 부분을 발췌해왔냐면

글로 자신을 표현해보라는 부분이 마음에 들었다.


태어나서 주입식 교육 아래 글을 써 본 빈도는 매우 적으나... 

내가 글을 썼을 때의 느낀 감정을 회상해보면 어떤 글을 썼든 간에

뭔가 스스로가 차분해지는 기분이었다. 생각이 조금씩 정리가 되면서 뜬구름 같은 것들이 가라앉는 기분?


그럼에도 불구하고 요즘 다시 글을 안 쓰고 있는..(..)

나를 반성해본다.

- 반성하다가 논지에 벗어나버렸다 -




돌아와서 이 포스팅을 하게 된 이유를 간단히 남기자면,



리딩으로 리드하라

저자
이지성 지음
출판사
문학동네 | 2010-11-17 출간
카테고리
자기계발
책소개
[꿈꾸는 다락방] 이지성의 전 국민 인문고전 독서 프로젝트! 정...
가격비교


인문학적 소양을 쌓아야 한다고(정확히는 인문고전 독서를 해야한다) 아주 눈에 글씨가 박힐 정도로

여러 가지 이유들로 설득하면서 자기 주장을 반복적으로 강조하는 책이랄까.


이 책에 대해서 따로 리뷰를 남길 지는 모르겠으나

왠지 읽다가 살짝 뭔가 답답했는지 이 새벽에 갑자기 구글 검색창에 

'프로그래머 인문학' 이딴 검색질을 하다가 결국엔 짤막하게 포스팅까지 하고 있다.


뭐 하는 애일까 나 ㅋㅋ



나중에라도 이 포스팅 제목대로

내가 생각하는 그 이유에 대해 정리가 된다면 추가로 포스팅해야겠다.


by kelicia 2014. 8. 28. 01:47

중복 컴파일 방지를 위해 자주 쓰이는 전처리기 지시자들에 대해 비교해 보고자 한다.



1) #ifndef


먼저 다음과 같은 코드가 있다고 하자.


First.h

#ifndef _FIRST
#define _FIRST

class First
{
};
#endif

Second.h

#ifndef _SECOND
#define _SECOND

#include "First.h"

class Second
{
};
#endif

Main.cpp

#include "First.h"
#include "Second.h"

void Main()
{
}


Main.cpp 를 컴파일 해보면 #include 의 작동방식에 따라

그 파일의 코드가 그대로 복사될 것이다.


#ifndef _FIRST
#define _FIRST

class First
{
};
#endif

////////////////////////////////

#ifndef _SECOND
#define _SECOND

#include "First.h"

class Second
{
};
#endif

////////////////////////////////

void Main()
{
}


위와 같이 되고 Second 에서 또 한번 #include "First.h" 를 읽게 될 것이다.

그 결과로 ,


#ifndef _FIRST
#define _FIRST

class First
{
};
#endif

////////////////////////////////

#ifndef _SECOND
#define _SECOND

#ifndef _FIRST
#define _FIRST

class First
{
};
#endif

class Second
{
};
#endif

////////////////////////////////

void Main()
{
}


위의 코드와 같이 Main.cpp 에는 First.h 이 2번 복사되는 결과를 볼 수 있다.


결론을 내리자면, #ifndef 의 방식으로 중복 컴파일을 피하는 것은

#include 명령어를 사용한 횟수 만큼 전처리기가 그 파일을 복사해오고,

복사해 온 코드 상단에 작성된 #ifndef 구문을 읽고 컴파일 여부를 확인 한다는 것이다.


이렇게 결론을 지으면 

'그런데도 왜 이 방식을 써서 중복 컴파일 방지를 하냐 ?!'

라고 할 수 있다. 물론 장점도 존재하고 포스팅 마무리할 때쯤 언급하겠다.




2) #pragma once


그런데 나는 - pragma - 라는 단어가 대체 무슨 뜻인지 궁금해서 찾아보았다.



짜증. 괜히 맛있는 치킨만 먹고 싶어졌다.

그냥 컴파일러 지시자? 정도로만 이해해야겠다.


구글에 검색해도 pragma 가 뭐 하는 녀석인지만 나와있지,

정작 pragma 라는 단어 자체의 뜻에 대해서는 잘 안 나오는 듯_-_



어쨌든 잡소리였고 다시 중복 컴파일 방지를 위한 #pragma once 명령어로 돌아가자.


이 지시자가 의미하는 바는 '1번만 컴파일 하겠다' 라는 뜻으로 알고 있다.

msdn 에 따르면 (http://msdn.microsoft.com/en-us/library/4141z1cx(v=vs.80).aspx)


Pragma 지시자의 토큰 값으로 들어갈 수 있는 once 키워드 : 
Specifies that the file will be included (opened) only once by the compiler when compiling a source code file.

Remark : This can reduce build times as the compiler will not open and read the file after the first #include of the module.


아까 말한 것과 다를 바 없고, 이게 전부다. 

#ifndef 과 다르게 include 로 인해 여러 번 파일을 열어서 읽는 것이 아니라서 빌드 타임을 감소시킬 수 있다는 점.




3) 정리


#ifndef

- 앞서 보았듯이 헤더 파일을 여러 번 include 하게 되면 define 여부를 계속 체크해야 되기 때문에

컴파일 단계 중에서 파일 해석 단계의 속도가 #pragma once 에 비해서 다소 느리다고 할 수 있다.

하지만 장점을 꼽자면 전처리기 지시자(Preprocessor directive)라서 모든 컴파일러에서 동작한다는 점이다.


#pragma once :

- 1번만 컴파일 하고 그 뒤로부터는 동일한 파일의 경우, 읽기조차 하지 않는다. 그래서 파일 해석 단계의 속도가

#ifndef 보다는 빠르다. 하지만 아까 사전적 의미를 찾아봤을 때, 자세히 보면 'A compiler directive' 라고 적혀있다.

컴파일러 지시자로 특정 컴파일러에서만 동작하는 지시자이며 Visual C++ 5.0 이상에서만 동작한다고 한다.



얼핏 속도면에서 보면 #pragma once 가 좋아보일 수 있으나 

거대 프로젝트가 아닌 이상 속도에서 큰 차이를 볼 수 있을까? 하는 의문이 든다.


그리고 안정성(호환성)과 범용성을 고려한다면 #ifndef 방식을 택해야 할 것이다.




4) Reference


http://ace01kr.tistory.com/entry/%ED%97%A4%EB%8D%94%ED%8C%8C%EC%9D%BC-%EC%A4%91%EB%B3%B5%EB%B0%A9%EC%A7%80-pragma-once-vs-ifndefendif


http://neodreamer-dev.tistory.com/310


http://msdn.microsoft.com/en-us/library/t22e924w(v=vs.80).aspx


'Programming > C++' 카테고리의 다른 글

dynamic_cast 연산자  (0) 2014.10.26
정적 바인딩(Static binding) vs. 동적 바인딩(Dynamic binding)  (0) 2014.08.19
by kelicia 2014. 8. 25. 19:21


* Binding 

- 프로그램 구성 요소의 성격을 결정해주는 것

ex ) 변수의 데이터 타입이 무엇인지 정해지는 것




 종류

정적 바인딩(Static binding)

동적 바인딩(Dynamic binding)

 정의

 컴파일 시간에 성격이 결정되는 것

 실행 시간(runtime)에 성격이 결정되는 것

 예시

C언어 컴파일 시간에 변수의 데이터 타입이 결정

Python(Interpreter 언어) 런타임에 값에 따라 

 변수의 데이터 타입이 결정

 장단점

 컴파일 시간에 많은 정보가 결정되므로 실행 효율↑

 런타임에 자유롭게 성격이 바뀌므로 적응성↑




* 함수의 바인딩

- 함수를 만들어 컴파일을 하면 각각의 코드가 메모리 어딘가에 저장된다.

그리고 함수를 호출하는 부분에는 그 함수가 저장된 메모리 번지수(주소값)이 저장된다.


프로그램 실행 → 함수 호출 → 함수가 저장된 주소로 점프 → 함수 실행 → 원래 위치


위 과정에서 함수를 호출하는 부분에 함수가 위치한 메모리 번지로 연결시켜 주는 것을 바인딩(Binding) 이라고 한다.



- 함수를 바인딩하는 2가지 방법

(1) 정적 바인딩 (일반 함수)

컴파일 시간에 호출될 함수로 점프할 주소가 결정되어 바인딩 되는 것.

(2) 동적 바인딩 (가상 함수)

실행 파일을 만들 때 바인딩 되지 않고 보류 상태 둔다.

점프할 메모리 번지를 저장하기 위한 메모리 공간(4 byte)을 가지고 있다가 런타임에 결정.

=> 단점 : 타입 체킹으로 인한 수행 속도 저하 / 메모리 공간 낭비

=> 가급적 정적 바인딩 사용


?? 2 가지의 단점이 있음에도 불구하고 동적 바인딩을 하는 이유 ??

- 어떤 포인터에 의해 접근되었는 지에 상관없이 참조된 인스턴스의 실제 클래스형에 따라 재정의된 함수 호출이 가능!




이 포스팅의 원본 출처이자 C++ 에서

Template, 정적 바인딩 vs. Virtual Function, 동적 바인딩 으로 실험한 결과를 볼 수 있는 블로그 :

http://blog.daum.net/sox25/2


위 출처에서 정적 바인딩이 항상 동적 바인딩 보다 빠르다고 할 수 없다는 결과를 볼 수 있다.





* 프로그래밍 언어에서의 2가지 Type System


(1) 정적 타입 (Static Type)

- 컴파일 시에 타입이 결정

- 변수를 선언할 때, 반드시 앞에 타입을 명시해야 하는 언어들은 모두 정적 타입 시스템에 속한다.

ex ) C, C++, Java ...


- 결국 장점에 대해 언급을 하자면,

. 컴파일 시에 타입에 대한 정보를 결정하기 때문에 속도↑ (효율성↑)

타입 에러로 인한 문제점을 초기에 발견할 수 있어 타입의 안정성↑


(2) 동적 타입 (Dynamic Type)

- 런타임 시에 타입이 결정

- 코드를 작성할 때, 변수 타입을 명시하지 않고 런타임에 변수의 값에 따라 타입이 결정되는 시스템.

ex ) Python, Ruby, SmallTalk ...


- 장점 : 유연성 (혹은 적응성)

런타임까지 타입에 대한 결정을 끌고 갈 수 있기 때문에 많은 선택의 여지가 있다.

- 단점 : 안정성

인터프리터 언어는 배우기는 쉬우나 실행 도중에 변수에 예상치 못한 타입이 들어와 Type Error 를 뿜는 경우가 생긴다.

그러니 너무 편리함에만 의존하면 안정성 저하를 유발할 수 있다.




* Type System 에 따른 상속의 의미 차이


객체지향에서 중요한 개념 중에 하나가 다형성(Polymorphism) 이고,

일반적으로 다형성은 함수의 오버라이딩, 즉 동적 바인딩에 의한 것이다.


(1) 정적 타입(Static Type) 의 상속

: 코드 재사용 + 타입의 호환성 유지 를 목적으로 한다.

- 컴파일 시에 상속의 관계를 파악하여 상속관계에 있는 객체들 간의 타입 호환성을 유지해

타입은 컴파일 시에 결정되나 메소드 호출 시에 값에 따라 그 객체의 메소드를 호출하게 된다.

이와 같은 방법으로 동적 바인딩에 대한 문제를 해결했다고 할 수 있다.


(2) 동적 타입(Dynamic Type) 의 상속

: 코드 재사용 을 목적으로 한다.

- 타입 속성에 따라 메소드의 형태만 같으면 동적 바인딩을 유도할 수 있다.



간단하게 예시를 보면,

a.call();


정적 타입의 경우 :

컴파일 시에 a 객체의 타입에 호환될 수 있는 타입을 결정하고, 

런타임 시에 객체의 값에 따른 호환성 있는 객체의 메소드를 호출한다.

=> 즉, 상위 클래스의 코드 재사용과 동시에 타입의 호환성을 유지하는 목적을 가진다.


동적 타입의 경우 :

동적 타입 시스템에 의해 동적 바인딩이 자동적으로 유도되어 단지 상위 클래스의 코드를 상속받는 의미가 전부다.




바인딩이 일어나는 타이밍에 관련 포스팅 :

http://destiny738.tistory.com/178



휴.. 팔수록 어렵다 ㅠ_ㅠ


'Programming > C++' 카테고리의 다른 글

dynamic_cast 연산자  (0) 2014.10.26
.h 컴파일 : #ifndef vs. #pragma once  (0) 2014.08.25
by kelicia 2014. 8. 19. 11:25
| 1 2 3 4 5 6 7 8 ··· 18 |