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부터 공부를 하라고 전해라~ 레거시 코드야 오래된 개발자들이 케어할 테니 새로운 개발자들은 더 나은 환경에서 더 좋은 서비스들을 만들어서 저렴한 가격에 많은 사람들이 유용하게 쓸 수 있는 것들을 많이 만들어 주길 바란다.


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

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...