Swift vs Objective-C
1. 파일 통합
Swift | Objective-C |
📌 헤더 파일과 소스 파일이 모두 .swift 확장자를 갖는 파일 하나로 통합 📌 변수나 상수, 각종 객체의 형식에 대한 선언과 내용 구현이 모두 하나의 파일에서 이루어짐 |
📌 C언어처럼 헤더 파일과 소스 파일로 구분 📌 .h 확장자로 작성되는 헤더 파일은 변수나 상수에 대한 선언 📌 인터페이스에 대한 정의가 작성 📌 .m 확장자로 작성되는 소스 파일은 헤더 파일에서 정의한 인터페이스를 구현하는 내용이 작성 📌 선언과 구현이 분리되는 형태 |
2. 클래스의 정의와 구현
Swift | Objective-C |
📌 클래스의 인터페이스 정의 없이 바로 클래스 구현 📌 상속 받아야 할 클래스가 없으면 정말 아무것도 상속받지 않아도 됌 |
📌 헤더 파일에 클래스의 인터페이스를 정의 📌 소스 파일에서는 정의된 인터페이스를 구현 📌 클래스 선언 시 반드시 상위 클래스를 상속 받아야 함 📌 아무것도 없을때라도 최상위 클래스인 NSObject를 상속 받아야 함 |
// Swift 클래스 구현
class Player{
}
// Objective-C 클래스 선언 - 헤더파일
@interface Player : NSObject
@End
// Objective-C 클래스 구현 - 소스파일
@implementation Player
@end
3. 상속
Swift | Objective-C |
📌 다중 상속을 지원하지 않음 📌 프로토콜을 정의할 수 있다. 📌 기존 객체를 직접 확장할 수 있도록 Extension이 제공되는데, 이는 Objective-C의 카테고리(Category) 에 대응하는 개념 📌 *Extension은 클래스, 구조체, 프로토콜 등 대부분 객체에 적용가능 |
📌 다중 상속을 지원하지 않음 📌 자바의 *인터페이스(Interface)에 해당하는 개념인 *프로토콜(Protocol)을 정의하여 클래스 객체가 준수해야할 형식을 제공할 수 있다. 📌 *카테고리(Category) 개념을 통해 상속 대신 기존 객체 자체를 직접 확장할 수 있다. 📌 카테고리(Category)는 클래스 객체만 확장 가능 |
📝 *Extension
새로운 함수적 기능을 class, structure, enumeration, or protocol type에 확장한다는 의미
📝 *인터페이스(Interface)
자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용
📝 *프로토콜(Protocol)
클래스 사이에 공유되는 메서드 목록
📝 *카테고리(Category)
클래스 정의를 그룹짓거나 연관된 메서드를 묶어 쉽게 모듈화 해줌
4. 범용 타입
Swift | Objective-C |
📌 *Any 타입과 *AnyObject 클래스 제공 | 📌 *id 타입 제공 |
📝 *id 타입
id 타입은 모든 타입의 데이터를 저장할 수 있을 뿐만 아니라, 호환성만 보장된다면 저장된 데이터를 어떠한 타입으로든 변환할 수 있는 특성이 있다.
코코아 프레임워크나 코코아 터치 프레임워크에서는 범용타입을 이용한 API들이 많이 사용되고 있다.
📝 *Any 타입
구조체, 클래스, 열거형, 함수 등 스위프트에서 제공하는 모든 타입의 값을 저장할 수 있다.
📝 *AnyObject 클래스
클래스에 한해 범용으로 사용 가능한 데이터 타입
5. 메소드 호출
Swift | Objective-C |
📌 일반적인 객체지향에서의 메서드 호출 방식을 따름 📌 객체와 메소드 사이는 점 . 을 통해 연결 📌 메소드 호출 단위를 감싸는 구분자는 사용하지 않는다 |
📌 메소드 호출을 메시지 전송 방식으로 처리 📌 객체의 메소드를 호출하는 대신 객체에 메세지를 보내서 필요한 기능을 처리 📌 객체와 메시지는 공백을 통해 연결되며, 대괄호 [ , ] 를 사용하여 메시지 전송 단위를 감싸서 구분 |
// Swift 메소드 호출
인스턴스명.incrementBy(3)
// Objective-C 메소드 호출
[ 인스턴스명 incrementBy : 3 ]
6. nil의 의미
Swift | Objective-C |
📌 옵셔널 타입의 기본값으로 사용 📌 값이 존재하지 않음을 의미 📌 NULL 상수가 정의되어 있지 않음 |
📌 존재하지 않는 객체에 대한 참조를 위해 쓴다 📌 C에 정의된 NULL 상수 사용, 두 상수는 기술적으로 혼용 가능 |
// Swift
// 옵셔널 타입의 기본값으로 nil이 대입
var name : String? = nil
// Objective-C
// 객체의 빈 참조에 사용되는 nil
UIViewController *uvc = nil;
// 포인터 자료형의 빈 참조에 사용되는 NULL
int *sPtr = NULL;
7. 포인터 사용
Swift | Objective-C |
📌 포인터 개념을 제거하여 개발자가 직접 레퍼런스를 참조하지 않도록 함 📌 객체의 종류에 따라 컴파일러가 직접 레퍼런스를 참조할 것인지 아니면 객체를 복사할 것인지 결정 📌 클래스는 포인터를 사용하지 않아도 자동으로 레퍼런스를 참조하고, 구조체는 객체를 복사하여 사용하는 방식 |
📌 C의 포인터 문법을 그래도 물려받음 📌 객체에 대한 인스턴스 변수를 정의할 때에는 항상 포인터를 사용하는 레퍼런스 참조를 기본으로 사용 📌 포인터를 사용해야 한다는 것이 초보자들에게 적지 않은 부담으로 작용 |
8. 객체지향 타입
Swift | Objective-C |
📌 객제지향용 타입으로 클래스뿐만 아니라 구조체, 열거형까지 제공 📌 객체 타입은 모두 인스턴스를 만들 수 있으며 인스턴스와 관련된 변수, 상수를 *속성(property)으로 선언하여 사용할 수 있다. 📌 객체 타입에 인스턴스 메소드와 타입 메소드를 작성하여 사용할 수 있다. |
📌 객체지향을 위한 타입으로 클래스 제공 📌 @Interface 어노테이션을 이용하여 형식을 선언 📌 @Implementation 어노테이션을 이용하여 실질적인 내용을 구현, 이렇게 작성된 클래스를 사용할 때에는 인스턴스를 생성하여 사용 |
📝 *속성(property)
Swift 에는 두 종류의 속성 (attributes) 이 있다.
선언에 적용하는 속성과 타입에 적용하는 속성이 있습니다.
속성은 선언 또는 타입에 대한 추가적인 정보를 제공합니다.
예를 들어 함수 선언에 discardableResult 속성은 함수가 값을 반환하지만 반환값이 사용되지 않을 때 컴파일러는 경고를 생성하지 않는 것을 나타냅니다.
일딴 정리만... 사실 나도 속성이 뭔지 하나도 모르겠다... 메모는 나중에 한번씩 추가로 정리
// Swift 객체지향 타입들 예시
// 클래스(Class)
class SampleClass {
}
// 구조체(Structure)
struct SampleStruct {
}
// 열거형(Enumeration)
enum SampleEnum {
}
9 . 익명 함수
Swift | Objective-C |
📌 *클로저를 이용한 익명 함수 정의 문법 제공 | 📌 *블록(Block)이라는 개념으로 익명 함수를 표현할 수 있다 |
📝 *클로저
클로저 (Closure)는 코드블럭으로 C와 Objective-C의 블럭(blocks)과 다른 언어의 람다(lambdas)와 비슷하다.
클로저는 어떤 상수나 변수의 참조를 캡쳐(capture)해 저장할 수 있습니다. Swift는 이 캡쳐와 관련한 모든 메모리를 알아서 처리합니다.
라고 https://jusung.gitbook.io/the-swift-language-guide/ 에 나와있네..? 🙂
📝 *블록(Block)
블록(block)은 C, Objective-C 및 C++에서 마치 변수처럼 다른 곳으로 어떤 메소드나 함수 조각을 전달하기 위한 언어 수준에서 정의된 기능
10. 오류 처리
Swift | Objective-C |
📌 오류를 검출해내고 각 오류에 효과적으로 대응할 수 있도록 전용 구문을 제공 📌 많은 프로그래밍 언어에 널리 사용하는 Try - Catch 구문을 채택 📌 코드를 실행하는 과정에서 오류가 발생하더라도 프로그램이 중단되는 것을 막아주고, 미리 준비된 대응 구문을 실행하여 효율적으로 오류에 대응할 수 있다. |
📌 오류를 검출하기 위한 기능은 제공되었지만, 이를 읽고 쓸 수 있는 매개변수를 사용하여 오류를 검출해내는 방법이였을 뿐 오류 처리를 위한 구문이 별도로 제공된 것은 아니다. |
'메모장' 카테고리의 다른 글
Swift 변수와 상수 1 (1) | 2023.03.02 |
---|---|
Swift 반복문 [ while 편 ] (5) | 2023.02.28 |
Swift 반복문 [ for - in 편 ] (5) | 2023.02.27 |
Swift 기능/특징 (1) | 2023.02.26 |
Swift 언어의 탄생과 배경/특징 (4) | 2023.02.26 |