Swift - Object 문법적 차이점

2020. 11. 28. 14:51Swift

꼼꼼한 재은씨의 Swift: 문법편을 보고 정리한 내용입니다!

1. 파일 통합

Object-C는 C언어를 기반으로 만들어져 .h, .m 으로 .h - 헤더 즉 변수나 상수를 선언, 인터페이스에 대한 정의 .m - 작성되는 소스 파일을 헤더파일(.h) 에서 정의한 인터페이스를 구현하는 내용이 작성됌

  • Ob-C - 즉, 선언과 구현이 구분되는 형태.
  • Swift 헤더파일과 소스 파일이 모두 .swift확장자를 갖는 파일 하나로 통합됌. 선언, 각종 객체의 형식에 대한 실질적인 내용구현이 모두 하나의 파일에서 이루어짐.

2. 클래스의 정의와 구현

  • 클래스를 작성할 때 Object-C는 헤더파일에 클래스를 정의하고 소스파일에서는 정의된 인터페이스를 구현.
  • 스위프트에서는 클래스의 인터페이스 정의 없이 바로 클래스를 구현함. 또한 Object-C는 반드시 클래스 선언 시 반드시 상위 클래스를 상속받아야 하며, 아무것도 상속받을 필요가 없을 떄라도 최상위 클래스인 NSObject를 상속받아야 하지만, 스위프트에서는 상속받아야 할 클래스가 없으면 정말 아무것도 상속받지 않아도됌.

3. 상속

  • Object-C는 다중 상속을 지원하지 않지만, 자바의 인터페이스에 해당하는 게념인 프로토콜을 정의하여 클래스 객체가 준수해야 할 형식을 제공할 수 있음. 또한 카테고리 개념을 통해 상속대신 기존 객체 자체를 직접 확장할 수 있음.
  • 스위프트도 마찬가지. 다중 상속을 지원하지 않으며 프로토콜을 정의할 수 있음. 또한, 기존 객체를 직접 확장 할 수 있도록 Extension이 제공되는데, 이는 Object-C의 카테고리에 대응하는 개념임. 단, Object-C에서 클래스 객체만 확장할 수 있었던 카테고리에 비해 스위프트의 Extension은 클래스, 구조체, 프로토콜 등 대부분 객체에 적용가능.

Extension, Protocol은 공통적으로 클래스, 구조체, 열거형에 적용이 가능함.

4. 범용 타입

  • 개발의 편의와 효율성을 높이기 위해 모든 데이터 타입을 저장할 수 있는 범용 타입 객체가 필요할 때가 있는데, 오브젝티브-C에서는 이와 같은 범용 타입으로 id 타입을 제공합니다. id타입은 모든 타입의 데이터를 저장할 수 있을 뿐만 아니라, 호환성만 보장된다면 저장된 데이터를 어떠한 타입으로든 변환 할 수 있는 특성을 가지고 있습니다. 코코아 프레임워크나 코코아 터치 프레임워크에서는 범용 타입을 이용한 API들이 많이 사용되고 있습니다.
  • 스위프트 역시 동일한 코코아 프레임워크나 코코아 터치 프레임워크를 사용하기 떄문에 오브젝티브-C의 id타입에 대응하는 범용 타입의 객체가 필요합니다. 이 때문에 제공되는 것이 Any타입과 AnyObject 클래스 입니다. Any는 구조체, 클래스, 열거형, 함수 등 스위프트에서 제공하는 모든 타입의 값을 저장할 수 있는 타입인 반면, AnyObject는 클래스에 한해 범용으로 사용 가능한 데이터 타입입니다.

Any를 사용하면 이렇게도 가능하다! var anyArr : Int = [1, 2, "3", "4"] // 이 말은 즉, 정수형 Int 문자의 Character를 동시에 가질 수 있다! 원래 동시에 두 타입을 가지는건 불가능하다. Any타입은 모든 타입을 가지고 있기에 가능함 AnyObject - 모든 클래스가 암시적으로 준수하는 프로토콜

5. 메소드 호출

  • 오브젝티브-C는 스몰토크의 문법을 차용한 결과, 메소드 호출을 메시지 전송 방식으로 처리합니다. 즉, 객체의 메소드를 호출하는 대신 객체에 메시지를 보내서 필요한 기능을 처리합니다. 객체와 메시지는 공백을 통해 연결되며 대괄호([])를 사용하여 메시지 전송 단위를 감싸서 구분합니다. 이런 스몰토크의 분법이 낯설거나 익숙하지 않은 사람들이 많아서 오브젝티브-C를 다룰 떄에는 종종 주의가 필요하기도 했습니다.
  • 그러나 스위프트는 일반적인 객체지향에서의 메소드 호출방식을 따릅니다. 객체와 메소드 사이는 점(.)을 통해 연결되고, 메소드 호출 단위를 감싸는 구분자는 사용하지 않습니다.

오브젝티브-C [인스턴스명 incrementBy: 3]

스위프트 인스턴스명.incrementBy(3)

6. 포인터 사용

  • 오브젝티브-C는 C의 포인터 문법을 그대로 물려받았습니다. 객체에 대한 인스턴스 변수를 정의 할 때에는 항상 포인터를 사용하는 레퍼런스 참조를 기번으로 사용했죠. 모든 변수 앞에 포인터를 거의 의무적으로 붙여주다 보니, 오브젝티브-C에서 포인터를 사용한다고는 해도 C코드를 직접 작성하는 부분을 제외하면 크게 신경 쓸 부분이 없기는 했지만, 그럼에도 포인터를 사용해야 한다는 것은 초보자들에게는 적지 않은 부담을 작용했습니다.
  • 스위프트에서는 이러한 포인터 개념을 제거하여 개발자가 직접 레퍼런스를 참조하지 않도록 하는 대신, 객체의 종류에 따라 컴파일러가 직접 레퍼런스를 참조할 것인지 아니면 객체를 복사할 것인지를 결정합니다. 클래스는 포인터를 사용하지 않아도 자동으로 레퍼런스를 참조하고, 구조체는 객체를 복사하여 사용하는 방식으로 처리됩니다

포인터란? 메모리의 수솟값을 나타내는 정수타입의 값. 32비트 시스템에서는 32비트(4Byte)의 크기를 가지고, 64비트 시스템에서는 64비트(8Byte)의 크기를 가짐. 여기에 더해 포인터는 자신이 가리키고 있는 데이터가 몇바이트인지에 대한 정보를 추가로 가질 수 있는데, 이를 타입이 지정된 포인터(Types Pointer)라고 합니다.

😎클래스(Class) - 포인터를 사용하지 않아도 자동으로 레퍼런스 참조. 구조체(Struct) - 객체를 복사하여 사용하는 방식.

7. 객체지향 타입

  • 오브젝티브-C는 객체지향을 위한 타입으로 클래스를 제공함. @Interface 어노테이션을 이용하여 형식을 선언하고, @Implementation 어노테이션을 이용하여 실질적인 내용을 수현하죠. 이렇게 작성된 클래스를 사용할 때에는 인스턴스를 생성하여 사용합니다.
  • 그러나 스위프트에서는 객체지향용 타입으로 클래스뿐만 아니라 구조체, 열거형까지 제공합니다. 이들 객체 타입은 모두 인스턴스를 만들 수 있으며 인스턴스와 관련된 변수, 상수를 속성(Property)으로 선언하여 사용할 수 있습니다. 그뿐만 아니라 이들 객체 타입에 인스턴스 메소드와 타입 메소드를 작성하여 사용할 수도 있습니다.

스위프트 객체지향 타입으로는 Class(클래스), Struct(구조체), Enum(열거형)이 있다

8. 익명 함수

  • 현대 프로그래밍 개념에서 익명 함수의 사용은 람다 함수를 사용할 수 있게 해주는 리스프, 스킴같은 함수형 프로그래밍 언어로부터 도입되었다고 할 수 있습니다. 람다 함수는 함수기반으로 정의되는 코드 내에서 한 번만 사용하면 되는 코드마저 함수로 선언해서 사용해야 하는 번거로움을 피할 수 있게 해줌으로써 코드를 더욱 간결하게 만들어 줍니다.
  • 람다함수는 최근 자바8에서도 도입되는 등 프로그래밍 언어의 강력한 기능으로 고려되고 있습니다. 오브젝티브-C에서는 블록(Block)이라는 개념으로 익명 함수를 표현할 수 있었는데, 이 기능이 스위프트에서는 클로저를 이용한 익명 함수 정의 문법으로 제공됩니다.

오브젝티브-C에서는 블록(Block). 스위프트에선 클로저를 이용한 익명 함수 정의 문법.

9. 오류처리

  • 일반적으로 객체 지향 언어에서 제공하는 오류처리 기능은 오류발생이 예상되는 지점에 미리 오류를 검출하는 코드를 작성해두고, 실제로 오류가 발생할 때 정해진 코드 블록 바깥으로 오류정보를 던져 처리할 수 있도록 지원하는 방식입니다. 오브젝티브-C에서도 오류를 검출하기 위한 기능은 제공 되었지만, 이는 읽고 쓸 수 있는 매개변수를 사용하여 오류를 검출해내는 방법이 었을 뿐 오류 처리를 위한 구문이 별도로 제공된 것은 아니었습니다.
  • 그러나 스위프트2.0 버전부터 오류를 검출해내고 각 오류에 효과적으로 대응할 수 있도록 전문 구문을 제공하고 있습니다. 많은 프로그래밍 언어에서 널리 사용하느 Try ~ Catch구문을 채택한 스위프트는 코드를 실행하는 과정에서 오류가 발생하더라도 프로그램이 중단되는 것을 막아주고, 미리 준비된 대응 구문을 실행하여 효율적으로 오류에 대응할 수 있게 합니다.

Swift공부 한달차 초보자가 쓴 글입니다. 틀린점이 있을 수도 있습니다. 

틀린점, 오타 지적 달게 받겠습니다. 오늘도 글을 읽어주셔 감사합니다 :)  

다음엔 더 많은 정보를 가져오겠습니다 :) 

'Swift' 카테고리의 다른 글

Swift 맛보기  (0) 2020.11.30
Swift 기본연산자 - 삼항연산자  (2) 2020.11.29