다시 생각해 보니  OOP를 3개의 요소로 정의할 수 있다는게 참으로 말이 된데는 것 같다.
===================================================================

오늘 갑자기 지하철 타고 집에 오는 길에 이것에 대해 고민을 해봤습니다. 요즘 회사에서 객체지향에 대해 공부하다 보니 여기에 대해서 조금씩 정리가 되기 시작했습니다. 이 느낌을 살려 이 때 정리해 두어야 겠다는 생각이 들어서 이 글을 씁니다.

 일반적으로 OOP의 3대 요소를 캡슐화(encapsulation ), 다형성(polymorphism ), 상속성(Inheritance)이라고 합니다.
 우선 캡슐화에 대해 설명해 보겠습니다. 사실 전 이 캡슐화라는게 OOP의 3대 요소에 들어 있다는데 의문입니다. 제 생각에는 캡슐화라는 용어보다 abstraction(추상화)이라는 용어가 더 절적하다고 생각합니다. (자바를 배운 사람이라면 abstraction 이라는 단어를 듣자마자 자바 키워드 abstract 생각날 것 입니다. 근데 그것만 연결하지 말고 생각해주기 바랍니다. 우리말 그대로 추상화라고만 생각해 주세요. )  
 추상이라는 단어 자체가 너무 추상적이라서 어렵게 느껴질 수도 있습니다. 우리가 보통 추상이라고 하면 그 자체의 본질에 대해 성찰하는 것을 의미합니다.  이 단어를 소프트웨어 공학에 적용해 본다면 겉으로 보이는 성질에 대해서만 성찰한다고 생각하면 됩니다. 더 쉽게 설명하자면 public 과 private를 분리해서 public 만 보겠다라고 생각하면 됩니다. 그리고 추상화의 도구를 캡슐화 라고 합니다.  캡슐화 의미 자체로는 private 인터페이스를 의미한다고 생각하면 됩니다. 이렇게 private 을 만들면 상대적으로 public 인터페이스는 줄어들게 됩니다. 그 결과 우리는 그 본질에 대해서 더 다가 갈 수 있습니다. 그래서 캡슐화를 추상화의 도구라고 생각할 수 있습니다.  

 다음은 상속에 대해서는 소스 재사용을 의미한다고 생각하면 됩니다. 상속 자체의 의미는 upcasting을 통한 다형성 이용이라는 의미도 있지만 여기서는 다형성을 3번째 요소로 보았기 때문에 소스 재사용을 의미합니다. 상속은 다른 말로 "Is a" 또는 "is a(an)" abstraction 이라고도 합니다. 이 개념에 대비되는 개념으로 "has a" 라는 용어가 있는데, 정식 용어는 아니고 더 정확한 용어로는 composition이라고 합니다.

 마지막으로 다형성은 C++의 virtual 키워드 연결됩니다. (자바에서는 자동으로 virtual 이기 때문에 이 개념이 기본적으로 들어 있습니다. 그러나 이 동작은 시간이 걸리는 연산인데 C++은 "no use, no pay  라는 개념이 있기 때문에 사용을 원치 않을 때 제거할 수 있습니다. )  또 interface 상속이라는 말도 이 다형성에 대한 개념입니다. 인터페이스만 맞으면 어떤 객체의 method든지 가리지 않고 사용하겠다는 개념입니다. 다시말해 method 이름과 형식이 같고 어떤 조건(자바에서 인터페이스만 상속하거나 C++이나 자바에서 parent class 가 그 method의 인터페이스를 정의하고 있을 때)을 만족하면 그 객체에 맞는 method를 알아서 부르겠다는 의미 입니다.
지금 졸업 작품 때문에 프로그램을 작성중이다. SQLite를 DB로 사용하는데, 검색에 맞지 않을 경우 아무 결과를 리턴하지 않아서 골치를 썩고 있었다. 그냥 -1 이라도 리턴해 주면 좋을텐데, 그냥 가마니 있는 것이다. 그래서 어제부터 이것에 대해 찾아보았다.. 해결책은 ifnull(X,Y) 이라는 함수였다.

 이 함수는 MySQL 에서도 동일하게 작동하는 것으로 보인다. (MSSQL에서는 ISNULL(X,Y) 를 대신 사용해야 하고, 오라클에서는 T NVL(X,Y) 라는 함수가 동일한 작동을 하는 것으로 보인다. )
 어째든 이 함수는   X부터 시작해서 Null 이 아닌 인수를 리턴한다. 만약,  X, Y 모두 Null 이면 Null 을 리턴한다.

 말이 어려울 수 있으니 예를 들겠다.
 ifnull(1,2)  는 가장 앞에 있는 1을 리턴하고 ifnull(null, 2)는 null 이 아닌 2를 리턴하고 ifnull(null, null)은 null을 리턴한다.
ifnull 은 2개의 인수만 갖지만 ccoalesce(X,Y,...) 라는 함수는 여러 인수를 가질 수 있다. 동작은 ifnull 함수와 유사하다.

프로그래밍 방법론이라는 과목을 듣을려고 하는데 교수님이 실습을 위해서 MinGW를 설치하라고 하셨다. 이 번에 컴퓨터를 다시 포멧했기 때문에 다시 MinGW를 설치했는데, 조금 다른 프로그램을 이용해서 예전문서를 그대로 두고(또 누가 필요할지도 모르니..) 새롭게 글을 쓴다.

-------------------------------------------------------
 우선 이 글을 읽기 전 주위 할 점이 있다. 기존의 자신의 컴퓨터에 gcc 가 깔려있는지 확인하는 것이다. Dev-cpp 가 gcc를 내부적으로 이용한다. 예전 버전은 어떤지 모르겠지만 요즘 버전(요즘 버전이라 그랬지만 이 버전도 나온지 몇 년되었다..왜 더 이상 업그래이드를 안하는지 모르겠다.) 깔리면서 환경변수를 손대지 않지만, 예전버전은 그렇지 않을 수도 있다. 이 경우 조금 골치가 아파진다. 

 겉으로는 그냥 컴파일러로 보일지라도 내부적으로 gcc를 가지고 있는 컴파일러 들이 있다. 특히, 임베디드 환경에서 cross 컴파일로 gcc를 많이 사용한다. (크로스 컴파일러는 컴파일하는 환경과 그 프로그램을 이용하는 환경이 다를 경우 그렇게 부른다. 예를 들어 일반 PC에서 컴파일 해서 핸드폰에서 이용하는 프로그램을 만드는 컴파일러를 크로스 컴파일러라고 한다. )  한 번 자신이 사용하는 컴파일러에 gcc.exe 가 있는지 확인해 보아야 한다.
 
 단지 gcc.exe가 있다고 해서 문제 될 것은 없다. 이 부분에 환경변수를 걸드리고 있다면 조금 문제가 될 수 있다. 특히 GCC_EXEC_PREFIX 이 환경변수가 정의되고 있다면 조심해야 한다. 이 환경변수는 gcc의 라이브러리가 있는 곳의 디렉토리를 저장해둔다.  여러개의 gcc 가 사용될 때 이 때문에 다른 gcc가 이 환경변수를 오인하는 경우가 있다. 조금은 조심해야 한다. 

 이를 해결하기 위해서는  batch  파일을 이용해야 한다. 이 GCC_EXEC_PREFIX 이 환경변수를 지워버지고 이 환경변수가 필요한 프로그램에 다음과 같이 batch  파일을 만든다.

set PATH =%PATh%;컴파일러_path
set GCC_EXEC_PREFIX = 정의되어_있었던_라이브러리_디렉토리
start 실행할_컴파일러_이름

 다른 환경변수도 같이 있다면 이 것만으로 해결 안 되는 경우도 있을 수 있다. 나머지 부분은 나도 잘 모르겠다. gcc 문서를 통해 다른 환경변수가 뭐가 있는지 확인하고 자신의 컴퓨터에 설정되어 있는지 확인해야 한다.

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

  http://sourceforge.net/project/showfiles.php?group_id=2435 에 가 보면 Automated MinGW Installer 가 존재한다. 이게 더 설치를 쉽게 도와준다. 

 이 프로그램을 실행한 다음 당연히 Next를 클릭해 준다. 그 다음 다음과 같은 화면이 나온다. 




느낌이 팍 오지 않는가. 첫 번째 Download and install 이다. 그러면 라이센스 표시가 나온다. MinGW가 여러개의 패키지고 그 프로그램마다 GPL 일 수도 있고, 다른 라이센스일 수도 있다는 설명과 몇가지 정보가 더 나온다. (솔직히 더이상 해석하기 싫다. ) 

 당연히 agree 해야 넘어 간다.








 그 다음 어떤 버전을 설치할 것인가 물어본다. 안전하게 current 를 설정했다. (이 정도 영어는 해석할 수 있겠죠..)






 그 다음 설치 패키지를 물어본다. 내 경우, 교수님의 설명서에 FULL 로 되어 있어서 FULL을 설정했다.




 다음은 설치위치를 물어본다. 내 경우는 거의 모든 컴파일러는 C:\tools에 모여있으므로 여기에 MinGW 디렉토리(폴더)를 새로 만들어서 설치했다. 




 설치를 시작하면 인터넷으로 다운받아 자동으로 설치하게 된다.






 이제 설치가 끝났다.

 다행히 이 프로그램의 설치하고 나서 환경 변수를 건드리지 않는 것 같다.  (여러개의 gcc를 사용할 때 이 부분 때문에 각자의 gcc가 엉켜버릴 수 있다. )

 gcc 사용법은 리눅스 사이트에서 찾아보길 바란다. (KLDP 위키를 추천한다. )