모든 포스터는 애플 공식 홈페이지의 swift 문서를 참고하고 있으며, 각종 다른 블로그들의 글들을 참고할 수 있다.
그러므로 참고할 때마다 해당하는 문서의 원본 페이지를 본문의 하단부에 기입해 놓겠습니다.
또한 다른 언어와 많은 비교가 있을 것입니다. (C, Kotlin, Java..)
스위프트 공식문서를 따라가면
Swift includes modern features like type inference, optionals,
and closures, which make the syntax concise yet expressive.
Swift ensures your code is fast and efficient,
while its memory safety and native error handling make the language safe by design.
Writing Swift code is interactive and fun in Swift Playgrounds, playgrounds in Xcode,
and REPL.
이와 같은 글을 확인할 수 있다.
필자는 영어를 잘 못하므로 바로 gpt에다가 번역해 달라고 물어봤다.
결론은 간결하고, 표현력 있게 언어를 사용할 수 있고, 빠르며 메모리 안전성이 좋다로 한 줄 설명가능할 것 같다.
스위프트 다른 언어와 차이가 뭐가 있을까?
이 또한 공식문서에서 찾을 수 있다.
간단히 다음과 같이 해석할 수 있겠다.
1. 변수는 사용 시 초기화 필수
2. OutofBounds
3. overflow
4. nil
5. 메모리 자동 관리
첫 번째부터 한 번 얘기해 보자.
변수 사용 시 초기화. 이것은 당연한 것이다. C언어를 생각해 보자. C언어에서 다음 코드를 실행해 보면?
#include <stdio.h> //1
int main(){ //2
int a; //3
printf("%d",a); //4
return 0;//5
}//6
4번 줄에서 에러가 난다. a라는 int 자료형의 변수를 선언해 놓고 어떤 값인지 초기화를 해주지 않았다. 즉, 쓰레기 값을 갖고 있다는 것이다.
초기화되기 전에 해당하는 값을 사용하면 당연히 안 된다. 어떤 언어든 이건 말이 안 되는 행위이다. (아닐 수도..?)
두 번째를 봐보자.
OutofBounds. 이것은 첫 번째에서 확장된 개념이지 않을까 싶다. swift의 자세한 메모리 할당 방식은 모르겠지만 , C언어를 예시로 생각해 볼까?
#include <stdio.h> //1
int main(){//2
int Array[5]={1,2,3,4,5};//3
int b = Array[5]; //4
return 0; //5
}
다음과 같이 int 자료형의 크기가 5인 배열을 만들었다고 해 보자. 인덱스는 0번부터 시작하기에 5번 인덱스는 접근하지 못할 것이다.
왜 그럴까? 이론적으로 생각해 보자. 배열 사이즈를 5라고 설정해 보자. Array [0]의 첫 주소를 0x000000이라고 한다면 int 자료형은 4byte이기에 Array [4]는 0x000010의 주소를 가질 것이다. 즉 3번 줄 의미는 0x000010까지 접근 가능하다는 것이다.
근데 Array [5]의 접근은 무슨 말일까? "Array [0]으로부터 5개의 int 자료형만큼 떨어진 곳의 주소를 접근해라"라는 의미로 해석할 수 있다. 주소로 보면 0x000014일 것이다. 앞서 우리가 할당한 것은 최대 0x000010이었다. 근데 우리가 지금 0x000014를 접근한다는 것은 해서는 안 되는 행동을 하는 것이다.
친구한테 A라는 물건을 3일 동안 빌린다고 약속했다고 해보자. 그런데 사용하다 보니 친구에게 아무 말도 없이 하루 더 사용하게 된다면? 이건 약속을 어긴 것이다. Array [5]를 접근하는 것 자체가 이런 의미이다. 약속을 어긴 것이고, 이런 행위를 OutofBounds라고 한다.
초기에 설정한 크기를 넘는 접근은 하지 말도록 하자.
세 번째를 보자.
overflow를 보자. overflow는 단어 그대로 해석하면, 흘러넘쳤다는 것이다. 자료형마다는 담을 수 있는 크기가 제한이 된다. 필자는 매번 자료형을 상자에 비유해서 설명한다. 예를 들어서 내가 바나나 한 송이를 갖고 있는데 이것을 냉장고에 넣어서 보관한다고 해보자.
그러면 굳이 큰 상자에다가 넣어서 냉장고에 보관할 이유가 있을까? 또한 한 송이보다 작은 크기의 상자에 넣어서 냉장고에 보관한다면?
두 가지의 생각을 할 수 있지만 후자의 경우가 overflow의 경우이다. 내가 담아야 될 크기보다 작게 상자에 보관하면, 한 송이를 상자에 크기에 맞게 잘라서 다 담지 못하고 냉장고에 보관하게 될 것이다. overflow가 이것이다. 내가 담아야 될 값이 있었는데, 그 값을 온전히 저장하지 못 한 채 보관되는 것이다.
그럼 이런 일이 일어나지 않게 하려면 어떻게 해야 될까? 아까 생각했던 전자의 경우를 택하면 된다. 내가 애초에 크기가 큰 상자에 바나나 한 송이를 보관하면 이런 overflow가 일어나지 않는다. 그러면 이런 의문이 생길 수 있다. "어? 그러면 매번 내가 큰 상자에 바나나를 보관하면 되는 거 아닌가요? 그러면 overflow가 일어날 일이 없잖아요?".
당연하게 들을 수 있는 생각이다. 하지만 우리 생각해 보자. 내가 바나나 한 송이를 넣기 위해 큰 상자를 계속 냉장고에 보관하게 된다면 다른 상자는 넣어서 보관할 수 있을까? 당연하게도 안 된다. 우리의 메모리는 제한적이기 때문에 담을 수 있는 양이 정해져 있다. 그러면 상자를 무작정 크게 설정하고 담으면 메모리가 낭비된다는 것이고, 이것 또한 하면 좋지 않은 행위이다.
이미 알고 있겠지만 정답은 내가 사용할 자료형의 크기만큼 초기에 설정해서 사용하는 것이 좋다.
네 번째를 보자.
nil이다. 필자는 이것을 스위프트에서 처음 본다. (다른 언어에서 먼저 나왔을 수도 있음...)
아마 스위프트에서 독자적으로 만들어낸 것이 아닐까?라는 추측을 해본다. 그리고 필자가 해석해 보고자 이것은 다른 언어에서 None, NULL과 같은 존재인 것 같다.
코딩을 하다 보면 값이 "아무것도 없다"라는 것을 정의해야 될 때가 있다. 단순하게 int 자료형일 때 0이라는 것이 아니라, 진짜 없을 無이다.
자꾸 c언어를 예시로 들게 되는데, 다음 예문을 보자.
#include <stdio.h> //1
int main(){ //2
int a = 1; //3
int *b = NULL; //4
return 0; //5
}
보면 3번 줄에 a라는 int자료형의 변수가 하나가 선언과 동시에 1이라고 초기화가 되는 것을 확인할 수 있고, 4번 줄에서는 int자료형의 포인터인 b변수를 선언하는 것을 볼 수 있다. 근데 잘 보니까 NULL이라는 값을 목격할 수 있다. 엥 NULL?
c언어에서 포인터는 가리킨다는 개념으로 많이 설명된다. 즉 b는 다른 누군가를 가리킨다는 것이다. b가 누군가를 가리킬 수 있는데, 지금 NULL이라는 값은 "아무것도 없다." 즉, 아무도 가리키지 않는 상태라고 할 수 있다.
이런 식으로 스위프트에서는 nil이라는 것을 두어서 아무것도 없는 상태를 정의한다. 근데 이것이 좀 더 MZ(?)스럽게 구현이 돼있는 것 같다.
nil의 그 자체로만 봤을 때는 無이지만, nil을 만들 수 있는 구문을 보면 좀 재미있다. nil이 들어갈 수 있게 만드는 구문은?,! 가 있다.
정확한 명칭은 Optional이라고 한다.
다음 예시를 보자.
var a: Int? = 10
var b: Int = 30
이런 예문이 있다고 해보자.
a라는 int자료형의 변수를 만들었는데 뒤에? 가 붙었다. 이것은 Optional Int로 해석된다. 즉 Int일 수도 있고, nil일 수도 있다는 것이다.
이런 식으로 int일 수도 있지만, nil인 아무것도 아닌 상태일 수 있게끔 하는 것이 스위프트의 장점이다.
마지막.
메모리 자동 관리이다. 이 부분은 java의 가비지 컬렉션의 기능인 것 같다. 메모리를 자동을 관리해 준다는 것인데, 공식문서를 봐보자.
ARC라는 기법을 사용하여, 메모리를 자동으로 관리해준다고 한다. 즉, 자바의 가비지 컬렉터와 매우 유사한 것 같다.(실제로 동작 원리가 비슷한지는 모름..)
그렇기에, 개발자가 직접 메모리에 관해서 생각할 이유가 없으니, 쉽게 구현할 수 있을 것이다.
다음에는 개발환경을 구축하고 실행하는 것을 포스팅할 예정이다.
마지막으로 오류 수정, 지적 매우 환영입니다. 틀린 부분이 있다면 말씀해 주세요.
swift 공식문서 : https://developer.apple.com/documentation/swift
swift ARC : https://docs.swift.org/swift-book/documentation/the-swift-programming-language/automaticreferencecounting
'언어 공부 > swift' 카테고리의 다른 글
[Swift] Day 1 개발환경 구축 (0) | 2024.01.12 |
---|