App Store 개발자들, 2022년 App Store 생태계에서 1조 1천억 달러 규모의 총 매출 및 판매 실적 기록 - Apple (KR)
App Store 개발자들, 2022년 App Store 생태계에서 1조 1천억 달러 규모의 총 매출 및 판매 실적 기록
Analysis Group의 독립적인 연구에 따르면, 2022년 App Store 생태계는 1조 1천억 달러 규모의 개발자 매출 및 판매 실적을 지원했다.
www.apple.com
App Store Metrics | Pocket Gamer.biz | PGbiz
App Store Metrics | Pocket Gamer.biz | PGbiz
App Store Metrics We originally created our metrics page in the fall of 2008 to celebrate the App Store reaching a milestone of what at the time seemed amazing, 10,000 apps. There was a tremendous response to that page and to the App Store which is well no
www.pocketgamer.biz
앱스토어의 지금까지의 기록을 알 수 있는 페이지이다. 앱스토어 출시 15주년인 올해 여러 정보들을 얻을 수 있다. 가장 많은 출시를 한 앱 종류는 게임이고, 그 다음으로 비즈니스 관련 등이다.
모바일인덱스 INSIGHT (mobileindex.com)
모바일인덱스 INSIGHT
국내 유일의 DMP 기반 앱 분석 서비스입니다. 앱 이용성 및 심화 분석 데이터, 경쟁앱 교차 분석 데이터 등과 앱 마켓 분석 데이터를 통해 선명한 모바일 시장 분석이 가능합니다.
www.mobileindex.com
앱스토어 말고도 플레이 스토어의 인기 앱 현황을 알 수 있는 사이트이다.
스위프트 들어가기
var i : Int = 500
var s = "String"
print(s)
/*실행 결과
String
*/
변수 선언은 상수는 let, 변수는 var를 사용하며 뒤에 콜론과 타입을 써주면 된다. 초기값을 지정할 수 있으며, 변수명 뒤에 바로 값을 입력하면 타입 지정을 생략할 수 있다. 세미콜론은 붙여도 되고 줄을 바꿔서 쓸거면 안 붙여도 된다.



= 옆의 공백에 따른 문제 발생
var i = 500
print(i)
/*var j= 500 // 에러 발생
print(i)
var k =500 // 에러 발생
print(i)*/
var l = 500
print(l)
=의 양 옆에 공백이 하나라도 있어야 컴파일 에러가 발생하지 않는다. 변수명이나 초기값에 =이 붙어있으면 안 되고 공백을 하나 이상 붙여야 한다.
/*
main.swift:4:6: error: '=' must have consistent whitespace on both sides
var j= 500 // 에러 발생
main.swift:7:7: error: '=' must have consistent whitespace on both sides
var k =500 // 에러 발생
*/
ㄴ 이런 에러가 발생한다.
자료형의 크기
var x = 10
print(type(of:x))
let s1 = MemoryLayout.size(ofValue: x) // 8
let t1 = MemoryLayout<Int>.size
print(s1, t1)
var y : Float = 0.6
print(type(of:y))
let s2 = MemoryLayout.size(ofValue: y) // 4
let t2 = MemoryLayout<Float>.size
print(s2, t2)
/*실행결과
Int
8 8
Float
4 4
*/
type(of: 변수명)을 사용하면 해당 변수의 자료형의 종류를 알 수 있다.
Int형의 크기는 운영체제나 컴파일러에 따라서 달라질 수 있지만 실습을 통해 확인해봤을 때는 8Byte인 것을 확인할 수 있었다. 같은 방법으로 Float의 크기를 출력해보았다.
출력하기
for n in 1...5 {
print(n, terminator: "끝\n")
}
print(1, 2, 3, 4, 5, separator: " ㅇ.ㅇb ", terminator: "끝\n")
/*실행 결과
1끝
2끝
3끝
4끝
5끝
1 ㅇ.ㅇb 2 ㅇ.ㅇb 3 ㅇ.ㅇb 4 ㅇ.ㅇb 5끝
*/
print() 메서드는 입력한 것들을 출력해준다. 매개변수로는 입력할 것들 여러 개, seperator, terminator를 입력할 수 있다. seperator는 첫 번째 매개변수에 들어갈 것들이 여러 개일 때 그것들을 serperator에 입력한 문자열로 구분해서 출력한다.
terminator에는 print() 메서드 종료 후 어떤 것을 출력할 것인지를 입력하면 된다.
Default parameter

https://developer.apple.com/documentation/swift/print(_:separator:terminator:)
print(_:separator:terminator:) | Apple Developer Documentation
Writes the textual representations of the given items into the standard output.
developer.apple.com
print() 메서드를 확인해 보면 separator와 terminator가 각각 " "와 "\n"으로 설정되어 있는 것을 알 수 있다. 그 말은 해당 매개변수에 값을 넘겨주지 않아도 기본으로 미리 설정되어 있는 값으로 동작된다는 것이다.
자료형의 최대, 최소값
print("Int32 Min = \(Int32.min) Int32 Max = \(Int32.max)")
print("Int64 Min = \(Int64.min) Int32 Max = \(Int64.max)")
print("Int Min = \(Int.min) Int Max = \(Int.max)")
print("UInt32 Min = \(UInt32.min) UInt32 Max = \(UInt32.max)")
print("UInt64 Min = \(UInt64.min) UInt64 Max = \(UInt64.max)")
/*실행 결과
Int32 Min = -2147483648 Int32 Max = 2147483647
Int64 Min = -9223372036854775808 Int32 Max = 9223372036854775807
Int Min = -9223372036854775808 Int Max = 9223372036854775807
UInt32 Min = 0 UInt32 Max = 4294967295
UInt64 Min = 0 UInt64 Max = 18446744073709551615
*/
자료형의 최대, 최소값을 확인해 보자.
Int형의 확인은 Int의 min과 max를 사용해서 확인할 수 있다.
Int형은 Int8, Int16, Int32, Int64로 나뉘어져 있으며
부호없는 정수형 Int8, Int16, Int32, Int64도 사용할 수 있다.
애플에서는 크기를 직접 지정하기보다는 Int를 사용하기를 권장한다.
print("Double Min = \(Double.min) Double Max = \(Double.max)") // 에러 발생
print("Double Min = \(Double.leastNormalMagnitude) Double Max = \(Double.greatestFiniteMagnitude)")
/*실행 결과
main.swift:1:29: error: type 'Double' has no member 'min'
print("Int32 Min = \(Double.min) Int32 Max = \(Double.max)")
~~~~~~ ^~~
main.swift:1:55: error: type 'Double' has no member 'max'
print("Int32 Min = \(Double.min) Int32 Max = \(Double.max)")
ㄴ Double.min, Double.max 사용 시
Double Min = 2.2250738585072014e-308 Double Max = 1.7976931348623157e+308
*/
Double형은 min과 max를 사용할 수 없다...
대신에 Double.leastNormalMagnitude와 Double.greatestFiniteMagnitude를 사용해서 최소값과 최대값을 확인할 수 있다.
그럼 Float과 Double의 경우는 어떤 것을 사용해야 할까?
웬만해서는 Float보다 Double을 사용해야한다. 정확도가 Float은 6자리, Double은 15자리이기 때문에 아주 작은 수를 다룰 때 Float을 사용하면 오차가 발생할 수 있다.
var floatVal : Float = 0.123456789123
print(floatVal)
/*실행 결과
0.12345679
*/
Float형 변수를 Double값으로 초기화 해보자. 출력해보면 유효 자릿수를 넘어가는 범위는 반올림되어 표현되는 것을 알 수 있다.
Character
var ch : Character = "c"
var ch1 = "Character?"
print(ch)
print(ch1, type(of: ch1))
/*실행 결과
c
Character? String
*/
Character형은 Character라고 명시를 해주어야 한다. 그렇지 않으면 자동으로 컴파일러가 String으로 추론하여 해당 변수는 String형이 된다.
String
var hello1 = "안녕"
var hello2 = "하세요"
print(hello1, hello2, separator: "")
print("\(hello1)\(hello2)")
/*실행 결과
안녕하세요
안녕하세요
*/
문자열을 사용하려면 String형을 사용하면 된다. Character형과는 다르게 String을 생략해서 사용하여도 자동으로 String형이라고 인식된다. 문자열 사이에 특정 값을 넣고 싶으면 \() 사이에 해당 변수명을 집어넣으면 된다. 이를 문자열 보간(string interpolation)이라고 한다.
특수 문자와 이스케이프 시퀀스
print("\"", "\'")
print("\n")
print("\u{D7EE}")
print("\u{A972}")
/*실행 결과
" '
ퟮ
ꥲ
*/
문자열에 개행, 탭, 캐리지 리턴 등을 사용할 수 있도록 해주는 것이 이스케이프 시퀀스이다. 예를 들어, \n을 사용하면 다음 줄로 넘어갈 수 있다. 유니코드도 출력할 수 있는데 위처럼 옛한글도 출력 가능하다.
변수와 상수
var num1 = 1234;
let num2 = 9876;
num1 = 4321;
num2 = 6789;
print(num1, num2)
/*실행 결과
main.swift:5:1: error: cannot assign to value: 'num2' is a 'let' constant
num2 = 6789;
^~~~
main.swift:2:1: note: change 'let' to 'var' to make it mutable
let num2 = 9876;
^~~
var
ㄴ 오류가 발생한다!
*/
변수는 말 그대로 나중에 값을 변경할 수 있는 것이고 상수는 초기값을 넣은 후에는 변경할 수 없다.
변수는 var 키워드를, 상수는 let 키워드를 이용하여 표현한다.
나중에 값이 바뀌지 않는다는 것을 확실하게 아는 변수는 let을 이용하여 상수로 표현하는 것이 성능 상 더 좋다.
타입 어노테이션과 타입 추론
타입 어노테이션은 변수나 상수를 선언할 때 그 타입을 명시할 시에 사용하는 것이다. 지금까지 썼던 var num : Int가 타입 어노테이션을 사용한 것이다. 해당 자료형을 명시하지 않았을 경우에는 컴파일러가 타입 추론을 해서 임의로 자료형을 부여한다.
상수 값 할당
let num1 : Int
num1 = 1234
print(num1)
let num2
num2 = 4321
print(4321)
/*실행 결과
main.swift:6:1: error: found an unexpected second identifier in constant declaration; is there an accidental break?
num2 = 4321
^
main.swift:6:1: note: join the identifiers together
num2 = 4321
^~~~
num2num2
main.swift:6:1: note: join the identifiers together with camel-case
num2 = 4321
^~~~
num2Num2
main.swift:5:1: note: change 'let' to 'var' to make it mutable
let num2
^~~
var
main.swift:3:7: error: cannot find 'num' in scope
print(num)
^~~
ㄴ 아래 것은 오류 발생!
*/
let으로 선언한 상수는 타입 어노테이션을 사용했을 때 초기값을 나중에 할당해도 된다. 처음에는 선언만 해놓고 나중에 값을 할당해도 된다는 말이다. 하지만 역시 값을 할당한 뒤에는 다른 값을 할당할 수 없으므로 주의해야 한다.
위의 경우는 타입 어노테이션을 사용했을 때는 선언한 변수의 초기화를 나중에 해도 오류가 발생하지 않았지만 사용하지 않았을 경우는 컴파일 오류가 발생하는 것을 확인할 수 있다.
튜플(Tuple)
튜플을 어떤 타입이든 묶어서 저장할 수 있다. 아래 예시를 보면 Int, Double, String을 모두 한번에 저장한 것을 알수 있다.
let myNum = (1, 5.8, "32")
print(myNum.2)
/*실행 결과
32
*/



그렇다면 과연 튜플의 자료형은 무엇일까?
let myNum = (1, 5.8, "32")
print(type(of: myNum))
print(type(of: myNum.0))
print(type(of: myNum.1))
print(type(of: myNum.2))
/*실행 결과
(Int, Double, String)
Int
Double
String
*/
특이한 결과가 나왔다. (Int, Double, String)이 출력되었는데 이를 보면 튜플은 어떤 한 자료형으로 특정되는 것이 아니라 다양한 자료형이 묶인 형태로 표현된다는 것을 알 수 있다.
let myNum = (1, 5.8, "32")
let (num1, num2, num3) = myNum
print(num1, num2, num3)
/*
let myNum2 = (1, 5.8, "32")
let (num1, num2, num3, num4) = myNum2
print(num1, num2, num3, num4)
*/
/*실행 결과
1 5.8 32
main.swift:7:32: error: '(Int, Double, String)' is not convertible to '(_, _, _, _)', tuples have a different number of elements
let (num1, num2, num3, num4) = myNum2
^~~~~~
ㄴ 밑에거는 오류 발생!
*/
튜플은 다른 튜플의 값을 가져올 수도 있다. 위의 예시를 보면 num1에는 1, num2에는 5.8, num3에는 "32"가 저장된 것을 알 수 있다. 그런데 값을 받는 쪽의 요소 개수가 더 많다면 오류가 발생한다.
let myNum = (num1: 1, num2: 5.8, num3: "32")
print(type(of: myNum))
print(myNum.num1, myNum.0)
print(myNum.num2, myNum.1)
print(myNum.num3, myNum.2)
/*실행 결과
(num1: Int, num2: Double, num3: String)
1 1
5.8 5.8
32 32
*/
튜플의 각 요소에는 이름을 붙여줄 수도 있다.
이 튜플의 자료형이 무엇인지 출력해보면 이름을 포함한 자료형들이 출력되는 것을 알 수 있다. 그리고 이름으로 출력하는 것도 가능하지만 원래대로 요소의 위치 값으로 출력할 수도 있다.
빈 튜플

https://developer.apple.com/documentation/swift/void
Void | Apple Developer Documentation
The return type of functions that don’t explicitly specify a return type, that is, an empty tuple .
developer.apple.com
빈 튜플은 Void로 표현할 수 있다. Void는 ()이라는 비어있는 튜플의 자료형과 같은 의미이다.
'공부 > Swift' 카테고리의 다른 글
| [Swift][9주차] Xcode 및 Mac 사용 (0) | 2023.10.30 |
|---|---|
| [Swift][6주차] 클로저, 클래스 (0) | 2023.10.16 |
| [Swift][5주차] 함수(메서드), guard, 일급객체 및 클로저 (0) | 2023.10.02 |
| [Swift][4주차] 제어문 및 함수와 메서드 (0) | 2023.09.25 |
| [Swift][3주차] 연산자와 Optional (0) | 2023.09.18 |