이제는 Swift도 꽤나 익숙하게 들리는 언어가 되었습니다. 저에게만 그런가요?
아마도 Swift를 배우고 있거나 실제로 사용하는 분들도 꽤 계실거로 생각됩니다. 저도 아직까지는 Objective-C가 훨씬 편하고 익숙하지만, 그래도 Swift를 아예 무시할 수는 없겠죠. 언제 애플이 Objective-C를 팽할지 모르니까요… 또르르..
Swift 로고
[출처 : Wikipedia – http://en.wikipedia.org/wiki/File:Apple_Swift_Logo.png ]
지난번 글에서는 너무 Swift를 부정적으로만 표현한 것 아닌가 싶기도 하고, 지금은 좀 더 Swift의 많은 면을 볼 수 있어서 지난번과는 조금은 다른 관점(?)으로 글을 쓸 것 같아요. 더 좋은 쪽으로!?
요즘에는 왠만하면 프로젝트 내에서 신규 클래스는 Swift로 작성하려고 노력중입니다. 이렇게 Objective-C랑 짬뽕혼합하여 사용하다보니, 그리 나쁘지만은 않더라구요. Objective-C의 장점과 Swift의 장점을 모두 취할 수 있으니까요.유후
하.지.만. 언제나 그렇듯 위험은 곳곳에 숨어있습니다. 두 언어의 차이점에서 비롯된 이점도 있지만 문제점도 분명히 드러납니다. 좋은점이 있으면 좋지 못한 점도 있기 마련. 좋은 점과 좋지 못한 점, 둘 중 뭐를 먼저 알고 싶으세요? 아마도 좋지 못한 점이 먼저 나오는게 좋을 것 같아요 ㅎㅎ 사실 좋지 않은 점이라기 보다는 그냥 제가 삽질한 것들이라… 후우… 그냥… 뭐랄까.. 넋두리… 네… 그렇습니다. 여러분들은 겪지 않으시길 바라면서! 하핳
제가 겪었던 빅삽질 들을 소개합니다!
오예, 역시 프로그래밍은 삽질이 제맛이지
두 언어에는 서로 가지지 못한 것들이 존재합니다. 같은 듯 다른 듯 비슷한 기능들도 많은데요, 그 중 하나 카테고리(category)와 익스텐션(extension)이 되겠습니다.
Objective-C에서 저는 카테고리를 굉장히 즐겨쓰는 편입니다. 확장의 용이성과 간편함 때문인데요, 그에 대적할 기능이 스위프트에서는 익스텐션이라 말할 수 있겠습니다. 이에 관련된 에피소드를 소개합니다.
기존 프로젝트에서 저는 NSDictionary의 카테고리로 customMethod라는 메소드를 생성해 줬어요. 그런데 스위프트에서 코딩을 해주다가 저도모르게 NSDictionary의 익스텐션으로 customMethod라는 녀석을 만들어줬지 뭐예요? 서로 다른 이름의 기능이지만, 실제사용은 거의 똑같은 두 녀석. 결과는 어떻게 되었을까요?
1 2 3 4 5 |
@implementation NSDictionary (CustomMethod) - (void)customMethod { NSLog(@"Custom method from category"); } |
1 2 3 4 5 |
extension NSDictionary { func customMethod() { println("Custom method from extension"); } } |
결과는 카테고리의 승리였어요.
같은 이름으로 메소드를 호출해 주었을 때, 카테고리의 메소드가 호출이 되더라구요. 왜 그런가 곰곰이 찾아보고 고민해 봤는데, 아무래도 기능의 특성상 그런 것은 아닐까 조심스레 추측해 봅니다. 카테고리는 기존 클래스에 정의되어있는 메소드를 오버라이드 할 수 있습니다. 하지만 스위프트의 익스텐션은 그것이 불가능 하지요. 그렇기 때문에 런타임에서 유연하게 동작하는 특성과 오버라이딩이 가능한 특성 때문에 카테고리 메소드가 우위로 호출되는 것 같습니다. 그것도 모르고 저는 왜 자꾸 다른 결과물이 나오는지 갑갑해서 잠시 이성을 잃었답니다. 여튼, 이런 다르면서도 비슷한 기능들을 사용할 때, 주의해야겠어요.
또 한가지는 튜플(tuple)이었는데요, Objective-C에서는 튜플이라는 자료형이 존재하지 않지요. 다른 언어에도 있지만 Objective-C에서는 사용할 수 없던 녀석인데, Swift에서는 더 쉽게 사용할 수 있어서 몇몇 메소드에 적용을 해 봤어요. 그런데 그 메소드를 Objective-C 코드에서 사용해야 할 일이 생긴거예요. 하.지.만. Objective-C에서는 튜플 자료형을 사용하는 메소드에 접근할 수 없어요. 정확히 말하자면 튜플을 사용할 수 없어요(위의 애플 도큐먼트에서 확인 가능합니다). 그래서 Objective-C 메소드로 전달해줄 추가메소드를 작성해 주어야 했지요.
1 2 3 4 5 6 7 8 9 10 |
class TestClass: NSObject { class func tupleMethod(a: Int, b: Int) -> (a: Int, b: Int) { return (a,b) } class func commonMethod() { } } |
예를들어 위와같은 Swift 클래스에 두 클래스 함수가 구현되어 있을 때, Objective-C에서 commonMethod는 자유롭게 호출할 수 있지만, tupleMethod는 찾을수 없다며 에러를 뱉어냅니다.
하지만 주의할 점들만 빼면 좋은점들이 훨씬 많지요! 좀 더 유연하게 자신만의 스타일로 코딩을 할 수 있는 스위프트 덕분에 Objective-C에서 복잡하게 구현해야 했던 것들을 좀 더 쉽게 만들어 낼 수 있습니다. 예를들어 연산자 재정의나 제네릭 기능 같은 경우 Objective-C에서 어렵게 구현해야 했던 것들을 좀 더 간편한 방법으로 구현할 수 있는 길이 열리는데요, 이를 Objective-C에서 직접 접근하지 못하는 경우가 있다 하더라도, Swift에서 먼저 처리를 하고 특정 메소드를 통해 리턴해주는 방식으로 구현한다면 두 언어의 장점을 모두 흡수 할 수 있는 아주 멋진 프로젝트가 될 것입니다.
지난 번과 너무나 대조된 글이라서 좀 이상하지요? 예.. Swift는 계속 발전하고 있고, 우리가 만들어 가는 꼼수도 점점 늘어나고 있기 때문일 거예요 ㅎㅎ
결론Objective-C는 Swift의 친구이자 멋진 동료가 될 수 있습니다! 100% Objective-C, 100% Swift 코드가 아닌 적절히 융합된, 서로의 장점을 가져다 쓸 수 있는 지금과 같은 체제를 계속 유지해 나갈 수 있으면 좋겠습니다. 애플이 Objective-C를 놓지 않고, Swift는 점점 발전시켜 주었으면 하는 바람입니다 🙂