카테고리 보관물: Language

Objective-C는 Swift의 친구가 될 수 있을까?

이제는 Swift도 꽤나 익숙하게 들리는 언어가 되었습니다. 저에게만 그런가요?
아마도 Swift를 배우고 있거나 실제로 사용하는 분들도 꽤 계실거로 생각됩니다. 저도 아직까지는 Objective-C가 훨씬 편하고 익숙하지만, 그래도 Swift를 아예 무시할 수는 없겠죠. 언제 애플이 Objective-C를 팽할지 모르니까요… 또르르..
Apple_Swift_Logo

Swift 로고
[출처 : Wikipedia – http://en.wikipedia.org/wiki/File:Apple_Swift_Logo.png ]

 

지난번 글에서는 너무 Swift를 부정적으로만 표현한 것 아닌가 싶기도 하고, 지금은 좀 더 Swift의 많은 면을 볼 수 있어서 지난번과는 조금은 다른 관점(?)으로 글을 쓸 것 같아요. 더 좋은 쪽으로!?

요즘에는 왠만하면 프로젝트 내에서 신규 클래스는 Swift로 작성하려고 노력중입니다. 이렇게 Objective-C랑 짬뽕혼합하여 사용하다보니, 그리 나쁘지만은 않더라구요. Objective-C의 장점과 Swift의 장점을 모두 취할 수 있으니까요.유후

Swift와 Objective-C를 한 프로젝트에서 함께 활용할 수 있는 방법은 애플에서 도큐먼트에 친절히 적어두었어요. 참고하세요.

하.지.만. 언제나 그렇듯 위험은 곳곳에 숨어있습니다. 두 언어의 차이점에서 비롯된 이점도 있지만 문제점도 분명히 드러납니다. 좋은점이 있으면 좋지 못한 점도 있기 마련. 좋은 점과 좋지 못한 점, 둘 중 뭐를 먼저 알고 싶으세요? 아마도 좋지 못한 점이 먼저 나오는게 좋을 것 같아요 ㅎㅎ 사실 좋지 않은 점이라기 보다는 그냥 제가 삽질한 것들이라… 후우… 그냥… 뭐랄까.. 넋두리… 네… 그렇습니다. 여러분들은 겪지 않으시길 바라면서! 하핳

제가 겪었던 빅삽질 들을 소개합니다!

b0036170_2231044

오예, 역시 프로그래밍은 삽질이 제맛이지

두 언어에는 서로 가지지 못한 것들이 존재합니다. 같은 듯 다른 듯 비슷한 기능들도 많은데요, 그 중 하나 카테고리(category)익스텐션(extension)이 되겠습니다.
Objective-C에서 저는 카테고리를 굉장히 즐겨쓰는 편입니다. 확장의 용이성과 간편함 때문인데요, 그에 대적할 기능이 스위프트에서는 익스텐션이라 말할 수 있겠습니다. 이에 관련된 에피소드를 소개합니다.
기존 프로젝트에서 저는 NSDictionary의 카테고리로 customMethod라는 메소드를 생성해 줬어요. 그런데 스위프트에서 코딩을 해주다가 저도모르게 NSDictionary의 익스텐션으로 customMethod라는 녀석을 만들어줬지 뭐예요? 서로 다른 이름의 기능이지만, 실제사용은 거의 똑같은 두 녀석. 결과는 어떻게 되었을까요?

13784314429c0c5517edf2134

결과는 카테고리의 승리였어요.

스크린샷 2015-03-11 오후 6.14.52

같은 이름으로 메소드를 호출해 주었을 때, 카테고리의 메소드가 호출이 되더라구요.  왜 그런가 곰곰이 찾아보고 고민해 봤는데, 아무래도 기능의 특성상 그런 것은 아닐까 조심스레 추측해 봅니다. 카테고리는 기존 클래스에 정의되어있는 메소드를 오버라이드 할 수 있습니다. 하지만 스위프트의 익스텐션은 그것이 불가능 하지요. 그렇기 때문에 런타임에서 유연하게 동작하는 특성과 오버라이딩이 가능한 특성 때문에 카테고리 메소드가 우위로 호출되는 것 같습니다. 그것도 모르고 저는 왜 자꾸 다른 결과물이 나오는지 갑갑해서 잠시 이성을 잃었답니다. 여튼, 이런 다르면서도 비슷한 기능들을 사용할 때, 주의해야겠어요.

또 한가지는 튜플(tuple)이었는데요, Objective-C에서는 튜플이라는 자료형이 존재하지 않지요. 다른 언어에도 있지만 Objective-C에서는 사용할 수 없던 녀석인데, Swift에서는 더 쉽게 사용할 수 있어서 몇몇 메소드에 적용을 해 봤어요. 그런데 그 메소드를 Objective-C 코드에서 사용해야 할 일이 생긴거예요. 하.지.만. Objective-C에서는 튜플 자료형을 사용하는 메소드에 접근할 수 없어요. 정확히 말하자면 튜플을 사용할 수 없어요(위의 애플 도큐먼트에서 확인 가능합니다). 그래서 Objective-C 메소드로 전달해줄 추가메소드를 작성해 주어야 했지요.

예를들어 위와같은 Swift 클래스에 두 클래스 함수가 구현되어 있을 때, Objective-C에서 commonMethod는 자유롭게 호출할 수 있지만, tupleMethod는 찾을수 없다며 에러를 뱉어냅니다.

스크린샷 2015-03-11 오후 6.29.58

하지만 주의할 점들만 빼면 좋은점들이 훨씬 많지요! 좀 더 유연하게 자신만의 스타일로 코딩을 할 수 있는 스위프트 덕분에 Objective-C에서 복잡하게 구현해야 했던 것들을 좀 더 쉽게 만들어 낼 수 있습니다. 예를들어 연산자 재정의나 제네릭 기능 같은 경우 Objective-C에서 어렵게 구현해야 했던 것들을 좀 더 간편한 방법으로 구현할 수 있는 길이 열리는데요, 이를 Objective-C에서 직접 접근하지 못하는 경우가 있다 하더라도, Swift에서 먼저 처리를 하고 특정 메소드를 통해 리턴해주는 방식으로 구현한다면 두 언어의 장점을 모두 흡수 할 수 있는 아주 멋진 프로젝트가 될 것입니다.

지난 번과 너무나 대조된 글이라서 좀 이상하지요? 예.. Swift는 계속 발전하고 있고, 우리가 만들어 가는 꼼수도 점점 늘어나고 있기 때문일 거예요 ㅎㅎ

결론
Objective-C는 Swift의 친구이자 멋진 동료가 될 수 있습니다! 100% Objective-C, 100% Swift 코드가 아닌 적절히 융합된, 서로의 장점을 가져다 쓸 수 있는 지금과 같은 체제를 계속 유지해 나갈 수 있으면 좋겠습니다. 애플이 Objective-C를 놓지 않고, Swift는 점점 발전시켜 주었으면 하는 바람입니다 🙂
 

Jo SeongGyu

2014/12/29

Apple_Swift_LogoSwift 로고
[출처 : Wikipedia – http://en.wikipedia.org/wiki/File:Apple_Swift_Logo.png ]

그렇습니다. Swift는 정말이지 뜻밖의 출현이었습니다.

무제

iOS 8과 더불어 새로운 기기가 발표될 거라고 생각했던 올 여름, 당황스럽게도 Swift 라는 아주 생소한 언어가 발표되었습니다. 힘차게 하강비행하는 듯한 칼새의 모습을 형상화한 로고가 나오는 순간, ‘저건 뭐지?’ 싶었는데, 새로운 언어라는 말에 저는 충격과 공포에 잠시 정신을 잃었던 것 같습니다. 이내 정신을 차렸지만 그 충격과 공포는 쉽사리 사라지지 않았습니다. ‘프로그래밍 언어라는 것이 뚝딱 만들어져 나올 수 없는데, 어떻게 저렇게 새로운 언어를 비밀리에 개발해서 내놓은거지?’ 등등 별별 생각이 다 들었어요. 어쨌거나 저쨌거나 언어에 종속될 수 밖에 없는 클라이언트 개발자는 눈물을 머금고 새로운 언어에 다가서 봤습니다.

첫 만남

Swift와의 첫만남은 ‘이게 뭐야’였어요. 스크립트 언어도 아닌 것이, 그렇다고 기존에 쓰던 Objective-C를 닮은 것도 아닌, 자바 비스무리한 새로운 변태같은 언어의 느낌. 딱 이런 느낌이었어요. 처음에는 당연히 Xcode 베타버전이라 크래쉬도 많이 나고, 불안정한 요소도 많았구요. 지금과는 문법도 조금씩 다른것들이 있었습니다. 여튼, 새로운 언어와의 첫만남은 한 마디로 ‘별로’ 였어요.

더 좋아진

Swift는 새로 출시된 언어답게 조금 더 발전된 기능들로 무장을 하고있습니다. 애플에서는 Swift의 특징을 Safe, Power, Modern으로 꼽았는데요, 새로나온 언어인 만큼 Modern함은 충분히 갖추고 있구요, Optional이라는 기능을 통해 Safe를 충족시키려 노력한 것을 볼 수 있습니다. 그러나 아직은 Power에 대한 의문은 남아있습니다. 기존 Objective-C 보다 성능면에서 대체적으로 떨어지기 때문인데요, 이 부분은 차후에 어떻게 개선되어 나갈지 지켜봐야 겠습니다.

그러나 더 발전해야할

물론 새로운 언어에서 좋아진 점들이 많지만, 아직은 부족한 부분들도 남아있습니다. 캡슐화가 아직 완벽히 지원되지 않고 있기 때문에 반(Half) 객체지향 언어라는 느낌이 강합니다. 애플에서는 앞으로 캡슐화를 할 수 있는 방안을 마련하도록 하겠다고 하였으나 이는 추후 지켜봐야 할 숙제라고 생각합니다. 또한 아직은 Swift를 완벽히 서포트 해주지 못하고 있는 Xcode도 발전에 조금 더 시간이 필요할 것 같습니다. 정식 배포버전이 베타버전에서 발전하여 문법도 조금씩 바뀌고, 불편한 점들을 개선한 것을 보면 위의 문제들은 시간이 해결해 줄 것이라고 생각합니다.

그래서..?

개인적으로 지극히 주관적인 입장으로 Swift는 2014년 말, 현 시점에서 아직까지 큰 프로젝트에 적용하기는 부담스럽다는 느낌입니다. Objective-C와 한 프로젝트 내에서 혼용하여 쓸 수 있다지만, 저는 그다지 그 연결에 흡족하지 못한 상태입니다. 그래서 현업 프로젝트에는 아직 적용하지 못하고 있어요. 그렇지만 iOS 또는 Mac OS 어플리케이션을 개발하는 사람이라면 꼭 배워두어야 할 것 같다는 생각입니다. 언젠가는 많은 발전을 통해 Swift가 대세가 될 날이 올 것 같기도 하거든요. 개인적으로는 생각보다 굉장히 파격적이고, 강력한 언어라고 생각합니다. 기본적으로 다른 언어 몇 가지를 익숙하게 다룰 줄 아는 프로그래머라면 Swift를 이해하는 첫 걸음은 Optional과 기존 Objective-C에서와는 조금 확장된 nil 이라는 개념이라고 생각하는데요, 여기(http://goo.gl/8VD1Rf)에 좋은 설명이 있어서 링크를 남겨둡니다. Optional과 nil 이라는 개념만 잘 이해해 두어도 Swift를 1/3은 정복했다고 생각합니다.

 

글을 끝까지 읽어주셔서 감사합니다. 아마 대부분 이 글을 읽으신 분들의 표정은 이러실거 같아요. 그래서 어쨌다고? 뭐라는겨?
스크린샷 2014-06-24 오후 6.51.15
사실 Swift의 실제 사용 후기에 대해 이것저것 말해보려고 했습니다만, 아마도 이정도로 충족하지 못하실거라 생각해요. 궁금한 점에 대해서 덧글 주시면 성심성의껏 답변드리도록 하겠습니다!

 

 

참고서적

Objective-C 개발자를 위한 Swift – 김근영 저
기존 Apple 어플리케이션 개발자들을 대상으로 썼지만, 다른 언어를 알고있는 프로그래머라면 충분히 이해하기 쉽게 설명된 Swift 기본 언어 책입니다.

만들면서 배우는 Swift: 스위프트로 시작하는 iOS 개발 – 야곰 저

기존 프로그래머가 아니더라도 아주 간단하게 Swift의 굵직한 특징들을 살펴볼 수 있고 간단한 iOS 앱을 따라 만들어 볼 수 있습니다.

 

[알림] 이 글은 이음소시어스와 그 개발팀의 견해와 일치하지 않을 수 있으며 지극히 주관적인 글임을 알립니다.