최근 코틀린이 아닌 자바를 사용하는 안드로이드 개발자가 iOS 개발을 하고 싶다고 하여 이야기 한 내용을 적어 둔다. 글은 2개로 쪼갠다.



1. MAC을 안 사도 된다.


이전에 포스팅 올렸다가 지워서 캡처 화면은 없지만 인터넷 뒤지니 자료가 많았다. 삼성 시리즈 9 노트북, VMWARE 위에 시에라 버전 올리고 XCode로 해 보았다. 전혀 문제없다. 맥의 커맨드 키는 컨트롤키 기능의 일부를 가져갔다고 생각하면 되고(cmd+C, cmd+V처럼) 맥의 옵션 키는 알트키(Alt, @)로 생각하면 금방 적응될 것이다. 맥이 있었지만 3개월가량 삼성 노트북으로 iOS 앱 개발했다.


2. 적응


맥의 프로그램 실행은 대부분 cmd+space bar를 눌러서 실행한다. 윈도에서 윈도키를 누르고 앱 이름을 실행하는 것과 같다. 윈도에서 Ctrl+Shift+ESC를 눌러 실행하는 프로세스 모니터는 Activity monitor란 이름이니 커맨드+스패이스 바를 통하여 실행하면 된다. 나머지는 우분투 리눅스 배포판과 창 모양, 창 닫기 위치, bash shell(맥에서는 terminal)이므로 사용하기 쉬울 것이다. 바꾸자. 맥으로. 오버워치 때문에 윈도우는 무조건 써야하니 하나 더 사자는 말


윈도우의 익스플로러는 finder 이며, 윈도우처럼 쉬프트 우클릭으로 쉘을 바로 열 수 있는게 아니라 몇가지 작업을 좀 해줘야 한다. 그리고 윈도에서 cmd 말고 powershell을 쓰듯이 맥은 기본 터미널 말고 iterm2를 쓴다. 거기에 zsh를 더해주면 더 좋다. 화면이 좁으니 모니터를 더 구입하는 것보다 bettersnap tool 같은 앱을 연결해서 창을 다룬다. 윈도 유저는 많은 모니터를, 맥 유저는 그냥 맥북 프로에 창 관리를 잘 하는 차이라고 보면 되겠다.



3. SWIFT


우선, ARM Firmware를 하는 내 입장에서는 JAVA나 C/C++, SWIFT가 모두 똑같은 언어로 보인다. PYTHON 은 perl이나 bash shell script 정도로 보이고 ^^;; 인터넷 서핑 공부법으로 편하게 공부하면 되지만 몇 가지 팁을 적어 본다.


(1) module, framework


module은 application 이나 framwork 을 말한다. Andoird에서 Project 와 같은(비슷하다는 말을 "같은"으로 표현하여 더욱 접근 장벽을 더 낮추겠다.) 개념이다. Eclipse에서 여러 Project를 하나의 workspace에 띄우는 것과 같다. Visual Studio 의 Project 개념. 더 큰 개념은 Solution이고 XCode에서는 그것을 workspace라고 부르니 결국 Eclipse의 workspace랑 같다. Android studio 에서는 gradle로 다양한 라이브러리를 import 한다. gradle의 그 한줄이 module, 또는 framework 이라고 보면 되겠다. 즉, framwork은 라이브러리다.



(2) cocoa Pods


cocoa는 STL이나 GLIBC처럼 표준 라이브러리 집합이다. swift 하는 분은 서버 개발자나 iOS 개발자, 특히 모바일 개발자가 많다고 생각된다. iOS는 UIKit을 쓴다. UI 프레임웍은 다음을 참고!


https://developer.apple.com/videos/frameworks/ui-frameworks

Frameworks - UI Frameworks - Videos - Apple Developer


developer.apple.com 



그리고 node.js에 npm이 있고, react에 yarn이 있고, fedora의 yum, ubuntu의 apt 가 있듯이 맥에는 brew 라는 패키지 관리자가 있다. brew를 이용해서 cocoapods를 설치할 수 있는데 pod은 라이브러리 관리 프로그램이다. pod 설치 후 pod init 하면 Podfile이 생성되고 해당 파일에 pod 'SwiftyJSON', '~> 4.0' 와 같이 패키지명을 적어주고 pod install 하면 라이브러리를 설치해 준다. 지우는 명령어는 따로 없고, Podfile에서 삭제하고 pod install 로 지운다. 현재 설치된 버전은 Podfile.lock에 저장된다. 설정파일 2개로만 관리하니 많이 편리하다. workspace 파일(각 project를 관리하는)이 없는 경우 자동 생성해 준다.




(3) 접근 제한자


2 때는 public, private, internal 만 있어서 비슷했는데 3버전 부터 open, fileprivate이 늘어났다. 자바에서의 public 은 swift의 open과 같다. 


https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html

Access Control — The Swift Programming Language (Swift 4.2)


docs.swift.org 




(4) 함수 선언



void 리턴값은 아예 적지 않는다.

func stringMetohd(source : [String]){

for a in source {

print(a)

}

}


var weekdays : [String] = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]


stringMetohd(source: weekdays)






모든 프로그래밍 언어에 y=f(x) 개념이 있듯이 스위프트도 함수가 기본이다.


func square(n:Int) -> Int {…}


로 함수 선언을 한다.


자바에서 public int square(int n) {...} 겠다.


C에서 함수포인터가 JAVA에서 인스턴스 변수로 편하게 객체를 대입하듯이


swift에서는 더 쉽게 할 수 있다.


let a=square


변수 선언은 var나 let을 쓸 수 있는데, let은 C에서 const, java에서 final과 같다.


물론, 자동 자료형 casting이 되지만 중급 이상 프로그래머는 알 것이다. 결국 자료형을 컨트롤해줘야 한다는 것을(뭐 frontUI만 짜면 별 상관 없겠지만 통신 기능만 들어가도 객체 직렬화 때문에 고려할 수 밖에)






믓튼, 이걸 더 쉽게 쓸 수 있다.


var b={(n:Int) -> Int in return n*n}


b(3) 하면 9가 나온다.






더 쉽게 쓸 수도 있다.


var c:(Int) -> Int


c={$0 * $0}


c(3)






bash shell programming을 많이 했던 사람에게는 별 이상할 게 없다.






Activity = ViewController


List View = Table View


Function Pointer, Instance = closer + new programming rules라고 보면 된다.


등 용어가 바뀌는 게 있지만 사실 안드로이드에게 바뀐 건 API 네임뿐.


애플이 삼성 베끼고, 삼성이 애플 베끼듯이 정책이 결국 requirement인데 requirements가 같아지다 보니 그걸 구성하는 system, architecture, module도 같아질 수밖에 없다. 즉, 메커니즘도 별반 차이 없다는 이야기. 애플이 파워칩을 계속 생산했으면 모르겠으나 어차피 Intel base고 각 회사 엔지니어들이 서로 이직을 하는 이상 바뀌는 것은 이름뿐일 거라는.






(5) Array


선언 방법은 다양하다.


var a = [Bool]()


var b : [Int] = []


a = [true, false, (3==3)]


var c = Array(repeating : true, count : 5)


var d : [Int ] = [1, 2, 3, 4]






이와 같이 선언을 먼저하고, 값을 넣는 방법도 있다.


개인적으로 변수가 nil을 포함한다는 개념인 Optional(?)이 있으니


C/C++과 비슷하게


var e : [Character]? = nil 을 선호한다.






배열을 JAVA의 ArrayList 처럼


var chart : [Character] = ["A", "�"]


chart.append("d")


chart += ["4", "5"]


chart.insert("h", at: 1)


chart.remove(at: 2)


편하게 넣었다 뺐다 할 수 있으니 자주 쓴다.






(6) for loop


()가 없는 점이 다르다. 


var weekdays : [String] = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]






for index in 0...6 { //for index in 0..< 7 { 요렇게 해도 된다.


print(weekdays[index])


}






for index in 0...(weekdays.count-1) { //이렇게도


print(weekdays[index])


}






for day in weekdays {


print(day)


}






이런 식으로 쓴다. JAVA에도 for(String a : Iteratores), C++에서 for each(String a in ...) 하고 쓰는 것과 같기 때문에 편하게 볼 수 있다. 다만 ... , ..< 문법이 좀 생소할테지만 쓰다보면 더 직관적라는 것을 알게 된다.






(7) enum


enum integers : Int {


case one


case two


case three


}






print(integers.one.rawValue)


0


보통 enum 은 rawValue를 뽑아내기 위해 쓰는 개념이 아니긴하지만 이렇게 값을 뽑아낼 수 있는 방법이 있다는 뜻.






(8) casting


자바에서는 (String)을 했지만 as를 쓴다.


value as! Int


같이.






4. 조금 더...


struct 는 메소드 없이 멤버변수만 있는 자료형, 


struct myStruct {


var a : String?


var b : Int?


}






var c = myStruct()


c.a = "hello"


print(c.a!)






class의 경우 메소드 포함. Swift 용어로는 프로퍼티, 펑션이 둘 다 있는 class, 프로퍼티만 있으면 struct . 이 정도 개념이면, 맥으로 개발하는데 별 무리 없이 금방 적응하리라 생각된다. JAVA 던, 코틀 린이던, Swift 던 base 코드는 어셈블리랑 C일 수밖에 없어서... 다만 그들이 쌓아 올린 개념이 거대한 프로그램(프레임웍)인 경우 안 무너지기를 바라지만. 내 경험상 칩 단까지 디버깅을 해야 하는 상황도 오기 때문에 결국 안 무너지지는 않는다.






그냥 프런트 UI에 집중하고, 아키텍처나 모듈 단위를 벗어나지 않는 범위에서 디자인 패턴으로 개발자들끼리 싸우게끔 해서 시스템을 못 보게 하는 게 공룡 기업이 하는 방식이다. 






끝으로 대부분의 상황에서 폴링 방식보다 인터럽트 방식이 좋듯. 함수 포인터로 콜백을 구현하듯이 인터페이스를 잘 뽑으면 된다. 그 콜백이 옵서버가 되고 그런 옵서버를 편하게 만들어 주는 API 라이브러리를 사용하면 그게 곧 반응형 프로그래밍이다.






내 책에서도 밝혔지만 사실 더 편한 건 그런 개발을 알아서 다 해주는 개발자 API를 쓰는 기업 사장이 최고의 프로그래머!




+ Recent posts