2015년 5월 29일 금요일

Objective-C

0

안드로이드는 운영체제 마켓 쉐어 1위이다. 그리고 구글이 계속 잘 해주고 있기 때문에 안드로이드 개발자는 굳이 다른 테크트리를 탈 필요성을 느끼기 힘들다. 그러나 최근 자바 때문에 붉어진 오라클과의 문제로 openJDK로 가게 될지 다른 협상을 할지 모른다. 향후에는 구글이 만든 GO 언어로 가는 것이 로열티 없는 수익을 보장한다. GO 언어도 많이 발전하고 내부 프로젝트에서도 대체되고 있기에 애플처럼 Swift로 바꾸는 시도를 할수도 있다. 복잡하게 얽혀진 기업의 이해관계 및 사용자 층의 지지도, 정치, 이익, 소수의 비리, 완전히 새로운 기술의 탄생 등 여러가지 불확실성으로 미래를 예측하기란 정말 힘들다. 그러나 사용자의 편의만 생각하는는 프로그래머를 위해 legacy programming 2 탄으로 어떤 언어가 나오던지 그 공통점을 발견해서 개발자로 계속 먹고 살 수 있도록 살펴봐야할 점을 짚어보고자 글을 쓴다.

1

우선 Windows 의 Visual Studio 시리즈는 Express 버전 및 Community Version이 있다. Free 의 다른말이라고 보면 된다. 엔터프라이즈 구매가격은 300~400 선. 개인은 70만원 정도면 구매가 가능하다. 요즘은 클라우드 요금제라고 해서 매월 4만원 정도씩 받는 앱들이 많이 나오는데 2년 이상 개발한다고 보면 구매할만한 수준이다. 예전에는 물가에 비해 많이 비싸다고 생각했었는데... 요즘은 그렇지 않다.
 Visual studio 2015 오면서 iOS 및 Android 지원을 하는 것을 보면, 윈폰이나 아마존 기타 사업자 폰은 특별한 경우가 아니면 하지 않는 것이 좋은 것 같다. 대세를 따르면 큰 피해는 없다. C#은 데스크톱 프로그래밍을 위한 것이고 Objective-C는 아이폰 프로그래밍을 위해서 공부하는 것이다.

아이폰이 없다면 따로 구매하지 않아도 된다. Android와는 다르게 iOS 에뮬레이터 성능은 좋기 때문이다. 그러나 아이맥, 맥프로나 맥북프로의 구입은 필수다. 아이맥은 일체형 PC를 말하고, 맥 프로는 데스크톱, 맥북프로는 노트북이다. Windows나  Linux처럼 운영체제가 다른 시스템에서 운영되길 원하지 않는 애플의 정책 때문이다. Windows에 GNUStep 돌려 본 사람이라면 알겠지만, 따로 환경을 구축하느니 애플 제품을 구입하는 것이 정신건강에 좋을 것이다. 애플은 따로 대리점이 없다. apple.com에서 구입하면 된다. 학생 할인 스토어를 클릭해서 구입하면 20만 원 정도 싸게 살 수 있다. 체크하지 않는다. 계약된 학교에서는 더 싸게 구입이 가능한데 학생증이 있어야 한다. 지인을 통해서 사도 된다. https://www.withsellit.com/ 을 이용해서 중고를 사도 된다.

지르고 나면 애플 디벨로퍼로 등록해야 한다. 구글 마켓은 평생 $25  달러밖에 안 했지만, 애플은 매년 $99다. 비싸다. 구글과 다른 것은 개발자 등록을 안 하면 인증서 파일을 생성할 수 없고, 에뮬레이터가 아닌 실제 폰에 동작시킬 수도 없다. Android Studio(Eclipse) + SDK + JDK 따로 깔 필요 없이, 애플은 App  store에서  Xcode만 깔면 된다. 윈도 쓰다가 애플 제품을 쓰기 어려운 이유는 펑션키 때문이다. 우선 쿼티 키 2벌식으로 다를게 하등 없지만 커맨드 키라는 것이 존재한다. 윈도의 Ctrl 키라고 보면 된다. Ctrl 키가 따로 있긴 하지만 윈도 쓰던 사람들은 얘도 Ctrl 키라고 생각하면 단, 하루 만에 적응하게 된다. 리눅스+X-window 쓰던 사람들은 몇 시간이면 마이그레이션 끝.(윈도 모양, UI 배치, bash shell, cmd+SpaceBar 한영 전환, Sportlight 빠른 실행 등이 사실 우분투에 모두 있는 동일한 기능이기 때문이다.) 윈도 리눅스 맥이 서로 베끼다 보니 사용자는 편리해졌다.
 세세한 부분들은 다른 점들이 많지만 일단 이런 base로 며칠만 써보면 금방 적응한다. 고급 개발자인데 적응 못한다고 생각하고 고집 있게 하나만 쓰는 사람들은 몇 달이 가도 적응 못하는 것을 봐서 적어둔다.


AndroidManifest.xml


Xcode 실행하고 보니 Swift와 Objective-C가 메인인 것 같다. Objective-C는 C언어에 OO를 붙인 거다. 그리고 GCC가 base인 LLVM을  쓰므로. C,. CPP 파일이 그냥  컴파일된다. 그래서 애플은 Swift란 독자 노선을 탄다. Eclipse 쓰다가 구글이 지원 안 해줘서 Android  Studio로 갈아탄 우리들은 안다. 이쉐키들 Swift로  통일시키겠구먼. 구글도 오라클과 자바 라이선스 비용 때문에 열심히 싸우고 있다. 내부 프로젝트는 GO로 대체했으니 이제 JAVA 도 GO로 바꿔버릴 차례. 마소의 C#의 먼저 해본 케이스다. C# 잘 쓰고 있다. 그러나 C++ 버리지 못하고 지원을 더 강화하고 있다. 그래서 구글의 자바와 애플의 Objective-C 향후에도 계속 건재할 것이다. 3D 산업이 여전히 건재하고 최강의 C++ 프로그래머들의 포진해 있는 이상.
 자 그럼, Objective-C를 선택하자. 왜냐면 상용 만들기에는 Swift 아직 많이 멀었다. Logic pro X가 Swift로 마이그레이션 되었다는 말을 듣고 나면  그때는 정말 Swift를 준비하자. 몇 달간 공부해봤는데 Objective-C 할 줄 아는 상태에서 3개월 정도 잡으면 된다.
 자 직관적인 UI를 보 다 보고 이래저래 둘러보다 보면... 느낀다.

별거 없구나.

그런데 정말 직관적이구나. 스티브 잡스의 철학이 여전히 살아 숨 쉬는 것을 느낄 수 있다. 그래서 별 설명이 필요 없다. 단점은 단축키를 잘 쓰는 개발자들은 대부분 터치 패드로 해야 하는 것 때문에 생산성이  떨어진다고 느낀다. 사실이다. 그러나 한편으로는 애플은 터치패드로 한다고 생각하면 머릿속에 있는 다른 것들과 shortcut이 섞일 일이 없으니 전화위복이다.

자 이제 가장 먼저 찾고 싶은 것은 Entry point 인
AndroidManifest.xml 일 것이다.

iOS 프로젝트에서는 xxxxInfo.plist 파일이다. xxxx는 없을 수도 있다.

그다음은 android.intent.action.MAIN 액션의 android.intent.category.LAUNCHER 를 받는 액티비티가 궁금할 것이다. 일반적으로 Info.plist 에서 Main storyboard file base  name을 보면 Main이라고 되어 있을 것이다. 그럼 Main.storyboard가 첫 실행  Activity이다.

Activity 가 꼭 한 화면을 뜻하지는 않지만 화면 구성단위이다. iOS에서는 스토리보드라고 한다.

이 정도 알면 기본 프로젝트에 여러 위젯을 올리고 이벤트를 주는 코드를 구글링으로 검색해서 짜낼 수 있다. 그런데 걸리는 것이 있다.


Objective-C 문법


안드로이드에서도 실행 액티비티에서 public static void main() 문을 넣으면 콘솔 창에 원하는 디버깅 코드를 넣을 수 있다. iOS 도 마찬가지다. 
int main(int argc, char * argv []) { char *s = "Hello, World"; printf("% s", s); return 0; }
Supporting Files 아래 New File로 C 파일을 하나 생성해서 위의 코드를 넣으면 실행이 된다. CPP 파일을 생성했다면,
#include
int main(int argc, char * argv []) { std::cout << "Hello World"; return 0; }
되겠다.
안드로이드 앱을 만들지만 플랫폼 빌드 때문에 C++ 코드를 다루어야만 했고, GCC 빌드를 돌려야 했던 우리로서는 정말 친숙한 환경의 느낌이 아닐 수 없다. Xcode가 C와 CPP를  컴파일할 수 있다는 것만 해도 Objective-C는 갑자기 친구처럼 느껴진다.

그런데 막상 책을 사서 보면 그 친구의 문법이 너무도 생소하게 느껴지는데 나는 그랬다. 
[] 때문이다. Objective-C  파일은. m인데 창시자는  단순히. c나. cpp가 예약되어 있어서 그렇게 만들었다고 했다. youtube에 창시자의 영상이 도는데 하는데 할아브... 한 명은 최초의 프로그래머와 같이 이름에 love가 들어가서 기분이 좋다. 믿음 소망 사랑 중에 제일은 사랑.

프로그래머는 코드로  이야기한다고 했던가? 코드를 잘 긁어서 준비했다.

를  java와 Objective-C로 뒤져보면 좋은 자료들이 많다.

코드로 정리해서 JAVA, Objective-C, 자바, 옵젝 씨,... 자오 자오 순으로 뿌려본다. 코드만 봐도 아... 할 거다.

System.out.println( "Hello, World!");
NSLog( @"Hello, World!");
byte aByte = 0;
short aShort = 0;
int anInt = 0;
float aFloat = 0;
double aDouble = 0;
boolean aBoolean = true; //false
char aChar = 'a';
Object anObject = new Object();
char aByte = 0;
short aShort = 0;
int anInt = 0;
long aLong = 0;
float aFloat;
double aDouble;
BOOL aBoolean = YES; //NO
char aChar = 'a';
NSObject *anObject == [[NSObject alloc] init];
String aString = new String(chars);
String aString = "A string.";
NSString *aString = [[NSString alloc] initWithUTF8 String:chars];
NSString *aString = @"A String.";
String one = "1 + ";
int two = 2;
String equals = " = ";
float three = 3.0f;
String s = one + two + equals + three;
NSString *one = @"1 +";
int two = 2;
NSString *eq = @"=";
float three = 3.0;
NSString *s = [NSString stringWithFormat:@"%@ % d %. 1f", one, two, eq, three];
String strings [] = {"1", "2"};
String strings [] = new String [10];
List strings = new ArrayList (10);
NSArray *strings = @[@"1", @"2"];
NSString **strings = malloc( 10*sizeof(NSString *));
NSMutableArray *strings = [NSMutableArray arrayWithCapacity:10];
Map m = new HashMap ();
m.put("key", "value");
NSDictionary *m = [@{@"key" : @"value"} mutableCopy];
[m setObject:@"key2" forKey:@"value2"];
Map m = new HashMap ();
m.put("key", "value");
Number arr [] = { Math.round(2*Math.PI) };
String s = "value1";
Number n = 3.14159265359;
String a [] = {"value1", "value2"};
Map m = new HashMap ();
m.put("key", "value");
Number arr [] = { Math.round(2*Math.PI) };
NSString *s = @"value1";
NSNumber *n = @3.14159265359;
NSArray *a = @[@"value1", @"value2"];
NSDictionary *m = @{@"key" : @"value"};
NSArray *arr = @[ @(roundf(2*M_PI)) ];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict [@"key1"] = @"value1";
class Foo {
private String bar;
public String getBar() {
return bar;
}
public void setBar(String bar) {
this.bar = bar;
}
}
@interface Foo : NSObject
@property (nonatomic, copy) NSString *bar;
@end
@implementation Foo
@synthesize bar;
@end
interface Color {
public int getRed();
public int getBlue();
public int getGreen();
}
@protocol Color
- (int) red;
- (int) green;
- (int) blue;
@opcional
- (int) rgb;
@end
. h
@interface NSString (MD5)
- (NSString *) md5 Hash;
@end
. m
@implementation NSString (MD5)
- (NSString *) md5 Hash {
NSString *md5 = anMD5 Func(self);
return md5;
}
@end
JAVA 코드는 워낙 많이 봐서 Objective-C 도 일단 한번 해볼 만 하구나 라고 느끼는 거라면 이 글이 해야 할 일은 다 했다고 본다. 거슬리는 것은 @와 [] 밖에 없다. 다른 개념들은 파다 보면 JAVA와 유사한 점이 많다.
I am pretty sure that Java's 'interface' is a direct rip-off of Obj-C's 'protocol' which was largely designed by these ex-NeXT'ers..."
Patrick Naughton (one of the original creators of Java)

뭐 이런 식... 멀티 플랫폼을 하다 보면 메모리랑 CPU밖에 안 보인다. JAVA 도 포인터의 언어고, class는 struct 고... 실제로 C++ 의 class를  struct로 그냥 바꿔도 된다. 물론, 예제용 소스에서
 Object는 void 포인 터고 new는  malloc이고... 이런 이야기가 계속 나오는데, 관련 이야기는 다른 매거진에서 이미 풀었다. 내가 쓴 다른 글에서 OOC, 객체지향 C 의 PDF 링크를 찾아보삼. 결국 C로 객체지향 구현이 가능하고 버추얼 머신이든 언어를 창시하든 모두 C로 짜여 있다. C++ 비얀 스트라 스트럽도 C++ 컴파일하면 C 코드로 나오는 번역기를 먼저 만들었다. 결국 C... 데니스 리치 고맙습니다.

Objective-C 문법이 거슬리긴 하지만 C 코드가 완벽히  컴파일된다는 점에서 암호화 프로젝트 몇 개를  컴파일해봤는데 잘 돌더라. C의 친척이니 거슬리는 문법도 한번 공부해 보자. 안 쓰던 오른쪽  새끼손가락[]을 자주 쓸 기회다.


또 다른 기회


다른 사람 명의로 안드로이드 마켓에 앱 몇 개 올려 보고 포기하는 중도 포기하는 사람은 수없이 봤는데. 투잡 하면서 회사까지 그만두는 케이스는 모두 아이폰 앱이었다. 유료 구매액이 8배 정도 높다고 보면 된다. 시장 크기 고려한 수치다. 안드로이드에서 유로 앱으로 100원 벌었다면 800원 번다는 이야기. 앱 개발자들은 기본적으로 시장에 내는 앱들을 개발해 본 경험이 있기 때문에 그만큼 기회가 더 많다. 선데이 토즈도 그랬고, 밖에서 만난 많은 사람들 100%가 회사에서 투잡 하다가 성공한 사람들이었다. 물론, 회사 그만두고 만든다고 했던 사람들은 아직 성공했다는 소식을 못 들었다. 투잡을 장려하는 것은 아니다. 싱글을 찾아서 법률 정보를 찬찬히 검토해 보면 투잡으로 해고할 수 있는 조항은 없다. 물론, 근무태만 같은 걸로 엮을 수는 있겠지. 최근 정부에서도 투잡 관련 법안을 추진하고 있더라. 물론, 회사 내막이야... 언제든 자를 수 있는 꼬리를 위해서 비정규직 2년으로 늘여주고 회사 1년 쉬게 해 주고... 눈 가리고 아웅 하는 것은 다들 아는 사실이다. 아예 대놓고 저성과자 자를 다는 법안에 서명하라고 회사 내부에서 부추기기도 한다. 회사 실적도 떨어져서 고과 못 받은 사람들도 많은데 말이다.

그런데 한편으로 잘 생각해 보면.

개발자인데 관리직으로 가지 않고 프로그래머로서 계속해서 고생했던 당신들.

정규직, 비정규직 차이가 없다. 정치망과  관계있다고 하지만 개발 능력이 당연히 더 중요하다. 가끔 49:51 이기도 하겠지만. 투잡을 하라는 것이 아니고 개발 능력을 키운다는 식으로 접근을 한다는 취지이다.

이럴 때 우리는 플랫폼을 잘 생각해야 한다. 왜 밖에 사람들이 다 애플, 애플 하는 걸까?

타이젠이나 아마존 하고 싶으면 해도 좋다. 윈도 폰도...

그러나 그들이 지금까지 했던 플레이를 잘 생각해 봤으면 한다.


Fin.


안드로이드 개발자가 iOS를 하는데 몇 가지 정보들을 줬다. 아마존 폰은 안드로이드 기반이라서 결재 같이 특화된 API를 빼고는 안드로이드와 동일하다. 그런데 하지 마라. 3D 폰이라 훨씬 좋다. 그래도 하지 마라. '사람인'에서 검색해서 개발자 안 뽑는 곳은 하지 마라. 안드로이드 쳐 보면 일할 곳 엄청나게 많다. iOS보다 많다. 충분히 경쟁력이 있다. 그러나 최근 대세는 멀티 플랫폼이라 웹 base 개발이 더 중요하다. 이 글의 주제에는 벗어나므로 언급은 하지 않았지만. 웹 베이스도 뭔가 느린감이 있고, 멀티 플랫폼에 native  API로 지원하는 개발 base도 많지만 제조사에서 직접 제공하는 API 들을 이용한 native 앱이 주는 사용자 경험은 못 따라간다. 나도 그런 통합 툴들이다 통합할 줄 알았는데 직접 써 보면 한계가 있다는 것을 안다. 통신사 서비스 앱(SK나 올레의 고객센터)들이야 웹 베이스 앱으로 가서 뭔가 답답함을 느끼지만 어차피 대안이 없다. 
 시장을 선도하는 앱들을 보면 대부분 서버와 통신하는 CRUD(Create, Read...) 앱들이 주를 이룬다. 편리하고 성공한 리멤버 앱의 경우 명함을 찍으면 사람이 직접 입력해서 내려준다. 삼성 출신들의 문제점 하나는 기술이 더 뛰어나면 고객들이 다 선택해 줄 거라는 믿음이 있다. 나도 그랬다. 아무래도 큰 곳에서의 PLAY는 기술 정면 승부 아니면 돌파구가 없기 때문이다. 조금만 느려도 베꼈다는 소리를 듣는 전장이다. 그래서 맨날 밤샐  수밖에 없지. 나 역시 세계 최초 모델을 한 팀 소속으로 내 몫을 했지만... 그에 반해 밖은 '빠른 PLAY'보다 '다른 PLAY'가 중요한 곳이다. 그래서 뜻이 맞는 3명 이상의 프로그래머가 있으면 '다름'에서 '속도'까지 더할 수 있으니 금상첨화다.

 십수 년 전, 언어는 그 언어만의 철학으로 이해해야 한다는 신념이 있었는데 나도 이제 나이가 많이 들어서 그 신념을 지킬 수 없을 것 같다. 나 같은 경우 C로 모든 것을 이해하려고 하고 있고, 가끔 C 코드를 어셈블리로 본다. 혹시 개발자가 아닌 사람인데 개발이 하곤픈 사람이  이 글을 본다면 바로  Swift부터 공부를 하라고 전해라~ 레거시 코드야 오래된 개발자들이 케어할 테니 새로운 개발자들은 더 나은 환경에서 더 좋은 서비스들을 만들어서 저렴한 가격에 많은 사람들이 유용하게 쓸 수 있는 것들을 많이 만들어 주길 바란다.


참, 맞춤법 검사는 그냥 막 돌렸는데 소스도 좀 수정을 하더라. 틀린점이 있어도 알아들르리라 믿는다. 슬라이드쉐어로 찾으면 그 안에 다 있다.

전공자에게 프로그래밍 가르쳐 주기

Preface

 C&JAVA, 정확한 명칭은 C & C++&JAVA 가되겠습니다. C++ 의 창시자인 Bjarne Stroustrup 이 가장 먼저 만든 것은 C++을 C로 번역해 주는 툴이었습니다. 이렇듯 객체지향 언어라고 불리는 C++은 C와 긴밀하게 연결되어 있습니다. OpenJDK 소스를 받아보면 C파일과 헤더가 있습니다. 많은 프로그래밍 언어들, 그리고 프레임웍이 C/C++로 만들어집니다. 스마트폰의 보급으로 프로그래머를 꿈꾸지 않는 일반인들도 아는 ‘안드로이드’의 초기 버전은 리눅스 커널과 JVM(Java Virtual Machine)의 변형인 Dalvik으로 만들어졌었습니다. 리눅스 커널은 기술 진입 장벽이 높아서 구글이 대체하지 못했지만 dalvik의 경우 어느 정도 기술 수준이 쌓이자 ART로 바꾸었습니다. 리눅스 커널은 C로 만들어집니다. 필자가 안드로이드 프레임웍의 보안 모듈을 개발할 때는  C++을 이용했었습니다. C, C++, JAVA의 개념을 차치하고 말을 한다면, 모두 코드로 이어져 있다고 할 수 있습니다. 그리고 명백한 사실입니다. C와C++의 개념상 차이는 이미 많은 책에서 중요하게 다루고 있습니다.C 책에서는 포인터, 함수, 구조체, 공용체, 연산자, 제어문등을 배웁니다. C++책에서는 C의 개념들이 그대로 담겨져있습니다. 추가로 함수와 연산자의 다중정의, 참조자, 클래스 등을 배웁니다. 1980년에 C++이 처음 나올 때는 C with classes 란 이름으로 나왔습니다. 이런 연유로 C/C++란 통합 용어로 많이 씁니다. 그러나 표준을 제정하는 입장에서, 혹은 리누스 토발즈와 같이 저명인사가보는 C와 C++은 명백히 다릅니다. C와 C++조차 연결시킬 수 없습니다. 그럼에도 C/C++/JAVA를 연결시키려는 이유는 무엇일까요?
실무 프로젝트를하다보면 C, C++, JAVA 뿐 아니라 C#, Python,Perl, Objective-C 등 많은 프로그래밍 언어를 다루어야 합니다. 그 때마다우수한 개발자들이 많은 스트레스를 받는 것을 보았습니다. 공통되는 개념을 잠깐 설명해 주었을 때 그때서야 이해를 합니다. 이렇듯 도움이 되었지만 통상 개발자들이 이론적으로 받아들이지 않으며 언어적으로다른 개념들로 이해해야 한다는 아집이 묻은 피드백으로 항상 돌아 옵니다. 이에, 기념비적인 C&JAVA 책을 집필하니 이제 막 배우려는 분들, 혹은 여러 언어를 공부하기 어려워하는 개발자들이 더 이상 헤매거나 스트레스 받지 않기를 바랍니다. 혹은, 이미 알고 계셨던 개발자 분들이 후배들에게 가르쳐 줄 때느끼는 피곤함을 조금이나마 덜었으면 하는 바램입니다. 다른 사람과의 소통을 위해 목적으로 언어를 배우듯, 데니스 리치는 UNIX 개발의 목적을 위해 C프로그래밍 언어를 창시했습니다. 무언가를 만들기를 원하는 프로그래머를꿈꾼다면  프로그래밍 언어를 만들었던창시자의 철학을 잘 이해하여 프로그래밍 언어 자체만 이야기하는 도그마에 빠지지 말았으면 합니다. 

JAVA, Android, MFC

C&JAVA 이야기 하면서 프로그래밍 언어 전체를 다룰 수 있다면 좋겠다. 일정 매수 넘어가면 출판비 증가률으 현저히 낮아 진다고 한다.

1

Linux로 치면 GTK, 멀티플랫폼에 많이 쓰이는 QT와 같은 녀석인데... 나는 이 녀석이 10년 전에 죽어버릴 줄 알았다. 그래서 삼성 소프트웨어 멤버십 들어갈 때 프로젝트는 QT로 만들었고, 과제는 WPF 과제를 했다. 윈도 8부터 메트로 UI가 나오면서 MFC는 역사의 뒤안길로 사라질 것이라 생각했었지만... 최근 Windows 10 + Visual Studio 2015를 쓰면서 생각이 바뀌었다.
얘가 New project 하면 생성되는 기본 MFC 샘플앱임에 혀를 내두른다.
정작, Visual studio 2015를 웹 인스톨러로 깔았을 때 Visual C++ 용 Foundation Library를 포함시키지 않는다. MFC가 기본이 아니라는 말이다. 그러나 업계에서는 Visaul Studio 6을 아직도 쓴다. Microsoft MSDN 구독자 다운로드에서는 더 이상  찾아볼 수 없다. 이 두 가지 사실만 보더라도 Micorsoft는 MFC를 버리려고 부단히 애를 쓰는 것 같다. 나도 MetroUI를 쓸 수 있는 XAML,  WPF를 쓰는 게 좋지 MFC의 고전적인 UI는 마음에 들지 않아서 이제 끝난 기술이라 생각을 했다. 위의 스크린샷을 보면 Microsoft(이하 '마소') 내부에서는 여전히 MFC 지원팀이 제 목소리를 내려고 노력하는 것이 보였다. 이런 상상들에 모던 하지 않아서 싫던 MFC UI가 빈티지 하게 보이기 시작했다.

 또 마소에서 MFC를 쉽게 버릴 수 없는 이유는 Visaul Studio C++을 이용하는 엔지니어 대부분이 고급 개발자 이상이라는 사실이다. 삼성에서 안드로이드 개발만 하던 6년간에도 C++을 하는 개발자가 외에는 수준급 엔지니어를 만나 본 적이 없다. 최근 임베디드 프로젝트를 많이 진행해서 잘한다고 정평이 나 있는 학생을 만났을 때, 크로스 컴파일러의 개념과 저수준 라이브러리 링킹을 이해하지 못하고 있어서 많이 의아했었다. 그것은 내가 최신 기술을 몰라서 그랬다. 많이  추상화되어 있어서 gcc로 arm toolchain을 만들고, 그 크로스 컴파일러로 컴파일할 필요도 없고, 부트 스트랩 로더를 올려서 특정 메모리 영역에  다운로드하고 점프시켜줄 필요도 없는 것이었다. 모든 것이 추상화가 되어 있어서 그냥 책에서 나온 대로 소스를 치면 바로 보드에 다운로드되고 실행이 가능했다.
 그래 나도 어셈블리 잘 쓰지도 않고 삼성 엔지니어 시절 때는 어셈블리로 실컷  디버깅하고 나니 소스 붙이는 방법을 늦게 배워서 소스 자체로 실시간 플랫폼 디버깅이 가능하다는 것을 알게 되었다. 추상화가 나쁜 것은 아니란 말이다.
 글이 길어 진다. 이런 여러가지 생각에도 불구하고 MFC를 배우는 이유에 부연 설명 없이 결론을 낸다면 단지옛 코드를 이해한다는 수준에서 그쳐야 한다. 그러나 주변에 MFC 프로그래머들과 협업하기 위해서는 우선 그들의 시각에 맞춰서 같이 프로그래밍을 해 줘야 더 나은 플랫폼으로 바꿀 수 가 있다. 사람을 움직이려면 '돈'이나 '기술'이 있어야 하는데. 돈이 있어서 명령을 내릴 수 있는 입장이 아니라면 '기술'로서 승부를 해야 한다는 말이다. 그리고 내막을 다 알고 있는 엔지니어와 발을 맞추고 내 편으로 만들면 '돈' 보다 마이그레이션이 성공할 가능성이 훨씬 높다. 그리고 함께 더 나은 기술로 전직하고 발전한다. 변화라는 게 이래서 어려운 것이다. 아무리 색다른 요리도 기존에 좋아하는 요리의 맛이 들어가야 옳고, 해외 여행을 가서 그 나라에서 살고 싶지 않은 이상 여행 가이드의 통역만으로 충분하다. 지금 나오는 기술들이 MFC보다 미칠듯이 매력적인가 따져보면 그것도 아니다. 그래서 이것은 기존 프로그래머들의 잘못이 아니다. 이런 보수적 성향이 새로운 것에 대한 '안정성'에 끊임없는 의문을 던지게 한다. 이렇게 나 자신을 세뇌한다. 젠장할 MFC 왜 이렇게 많이 쓰는 거야.
 중식 요리사라도 일식도 조금 만들 줄 안다면 자체 점심 시간에 인기있는 요리사가 될 것이다. 본업은 잊지말자

2

위의 샘플을 만들기 전에 이런 단계들이 있다.
MFC를 모르는 학생들 대상이고, offline으로 보는 독자의 요청에 의해서 완전 basic부터 설명을 해 보려 한다.사실 요즘 SUPERSELL 게임에 몇백만원 넣고, 나오는 만화 다보고, 넷플릭스 가입해서 시간을 떼워도 심심함이 사라지지 않아서 이번 글은 장편으로 가 보려한다. 화끈허게~ 장편으로 가자고!

3

개발자를 오래 쉰 사람들을 위해. 간단히 "CPU와 메모리의 장난"부터 시작한다. 우리가 프로그램을 실행시키면 메모리에 올라가고 CPU의 fetch 가 그 코드들을 가져가서 프로그램 실행을 해 준다. CPU안에 자체 API가 들어 있고, 모든 프로그래밍 언어는 CPU  API를 추상화 시켜 놓은 것에 불과하다. CPU라 함은 인텔을 말한다.AMD가 인텔을 앞지른 적도 있는데도 인텔이 잘 되는 이유는... 10년전 인텔에 개발자 등록을 하면 API 책 8권을 공짜로 보내줬는데 AMD는 온라인상에서도 개뿔 제대로 지원을 안해줬다. 조립은 AMD로 다 맞추는 충성심을 보여줬었는데도 말이다.
그래서 GCC보다 인텔 컴파일러가 병렬처리에 더 좋고, 속도도 빠르다. 그러나... 일부 퍼포먼스는 GCC가 앞서는데... 아무래도 FSF에 리처드 스톨만을 포함해서 천재들이 많다. 인텔에 날고기고 하는 사람들이라 해도 MIT 교수보다 나은 사람이 몇이나 될까?
 CPU를 관리하는 운영체제가 알아서 보호모드로 만들어서 메모리 보호를 해 주고 fetch 기능을 수행하고 프로그램 카운터를 실행하는 프로그램에 맞춰준다. 그래서 우리를 실행 파일만 만들면 된다. 실행 파일을 만들면 운영체제가 메모리에 올려주어 그것을 프로세스로 만들어 준다.
 운영체제마다 파일 시스템이 다르다. 윈도우의 실행파일은 exe다. PE 파일 포멧이다. 리눅스는 ELF, 맥은 HFS+다. 리눅스 진영이 열심히 고생을 해 준 덕택에 PE를 맥이나 리눅스에서 읽을 수 있게 되었다. 윈도우 또한 맥 파일을 읽을 수 있다.
돈 주고 사야 하긴 하지만 ^^;;

MFC에서 초점은 exe를 만드는 것이다. exe와 연결되는 dll을 만들기도 하지만. 흠... 리눅스의 .so는 dll이고 .a는 *.lib 정도로 봐도 좀 무방하다. 흠좀무 처럼 유행어 만들려고 했는데... 시도하지 말아야 겠다.
맥은 .dylib, .a 이다. 어차피 LLVM이 GCC 기반이라 GCC로 linux용 mac용은 다 만든다. BSD 계열이던 SystemV 계열이던 다 UNIX에서 나온거고 C를 만든 데니스 리치 손아귀에 있는 거다. 맥도 bash sehll 쓰니 명령어도 똑같다. 
우리가 많이 듣던 Win32 Console Application도 exe만드는 것인데 뭐가 다른 것일까? 우리가 윈도우 창을 만들려면 네모 상자만 그려가지고는 되지 않는다. 창 제목도 그려야 하고 그 아래 움푹 들어간 것 같이 다른 색의 선을 긋고 그림자 효과도 내고...

이걸 하나하나 다 하기 귀찮으니까 MFC로 하는 거다. 그래서 사실 마소 안의 MFC Developer들이 새끈하게 템플릿을 변경해 주면 MFC로 짠 프로그램 이지만 모던한 UI를 가질 수도 있는 것이다. MFC 유저가 사라지지 않고 마소 내에서 해당 엔지니어들을 대우해주면 그렇게 바꾸지 않을까 상상도 해보지만. 대기업에서 굴러먹은 경험 상 그들이 로또가 되어서 상사와 겁나 싸우지 않는 이상 어려울 것 같다.

자 그럼 MFC가 알아서 다 그려 준다고 했으니, C++을 아는 상태에서는 용어만 알아도 금방 적응할 수 있다.

4

SDI = Single Document : 윈도우 키 + R 눌러서 notepad 치면 나오는 메모장 형태의 창이다.
MDI = Multiple Documents : 창 안에 창을 띄울 수 있는 형식이다. 생짜로 짠다고 생각하면 끔찍
Resource View = 안드로이드로 치면 XML 의 리소스 에디터와 같다. 리소스 뷰는 *.rc 파일을 클릭하면 열리게 된다.
리소스 뷰는 res폴더 아래 midp, hdip 와 같은 존재다. 리소스가 들어가는 곳이다. VS 프로젝트 폴더에 res 자체가 있다. res에 넣으면 자동 인식하기도 한데 수동으로 넣어주는게 좋다. PNG를 넣으면 PNG 폴더가 생기면서 자동으로 naming이 된다. strings.xml에 string 넣고 resource name을 정하는 것이 자동으로 된다고 생각하면 되겠다.

더 자세한건 여기 참조.
Picture Control = ImageView 다. 그림 파일을 넣을 수 있다.

4




//#error 보안 문제: 연결 문자열에 암호가 포함되어 있을 수 있습니다.

대학원생의 투고 지도 ④ (완결) — 논문의 수준이란 무엇인가: 사다리와 사분위, 첫 논문 전략

완결편이다. "논문 수준"이라는 말을 해부하고, 에듀테크 석사생의 첫 논문 전략으로 마친다. 학위논문과 학술지 논문은 다른 장르다 먼저 가장 흔한 혼동부터. 학위논문(thesis)은 "내가 연구를 수행할 줄 안다...