๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Swift

Swift ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ๊ธฐ๋ณธ(The Basics)(1/2)

by BreadDev 2025. 4. 10.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ์—๋Š” Swift ๊ธฐ๋ณธ ๊ฐœ๋… ์ •๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒํŠธ๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์šฉ์ด ๋งŽ์•„์„œ 2๊ฐœ์˜ ํฌ์ŠคํŠธ๋กœ ๋‚˜๋ˆ„์–ด ์„ค๋ช…ํ•  ์˜ˆ์ •์ด๋ฉฐ, Swift์˜ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ณ€์ˆ˜์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ Swift ๊ธฐ๋ณธ ๊ฐœ๋…

Swift๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • ์ •์ˆ˜๋ฅผ ์œ„ํ•œ Int
  • ๋ถ€๋™ ์†Œ์ˆ˜์  ๊ฐ’์„ ์œ„ํ•œ Double
  • ๋…ผ๋ฆฌ๊ฐ’์„ ์œ„ํ•œ Bool
  • ํ…์ŠคํŠธ๋ฅผ ์œ„ํ•œ String
  • ๊ธฐ๋ณธ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์ธ Array, Set, Dictionary

ํƒ€์ž…-์„ธ์ดํ”„(type-safe): Swift๋Š” ํƒ€์ž…-์„ธ์ดํ”„ ์–ธ์–ด๋กœ, ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ, ์ž˜๋ชป๋œ ํƒ€์ž…์˜ ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์„ ์ปดํŒŒ์ผ ์‹œ์ ์— ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜ (Constants and Variables)

์„ ์–ธ ๋ฐฉ๋ฒ•

// ์ƒ์ˆ˜ ์„ ์–ธ (๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€)
let maximumNumberOfLoginAttempts = 10

// ๋ณ€์ˆ˜ ์„ ์–ธ (๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
var currentLoginAttempt = 0

let: ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ, ํ•œ ๋ฒˆ ๊ฐ’์ด ํ• ๋‹น๋˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

var: ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค์›Œ๋“œ๋กœ, ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ์ดˆ๊ธฐํ™”

var environment = "development"
let maximumNumberOfLoginAttempts: Int

if environment == "development" {
    maximumNumberOfLoginAttempts = 100
} else {
    maximumNumberOfLoginAttempts = 10
}
// ์ด์ œ maximumNumberOfLoginAttempts๋Š” ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ณ€์ˆ˜ ํ•œ๋ฒˆ์— ์„ ์–ธ

var x = 0.0, y = 0.0, z = 0.0

ํƒ€์ž… ๋ช…์‹œ (Type Annotations)

var welcomeMessage: String
welcomeMessage = "Hello"

// ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์— ๋™์ผํ•œ ํƒ€์ž… ์ง€์ •
var red, green, blue: Double

ํƒ€์ž… ๋ช…์‹œ: ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ, ๋ณ€์ˆ˜๋ช… ๋’ค์— ์ฝœ๋ก (:)๊ณผ ํƒ€์ž…๋ช…์„ ์ ์–ด์ค๋‹ˆ๋‹ค.

๋ณ€์ˆ˜/์ƒ์ˆ˜ ์ด๋ฆ„ ๊ทœ์น™

let π = 3.14159
let ไฝ ๅฅฝ = "ไฝ ๅฅฝไธ–็•Œ"
let ๐Ÿถ๐Ÿฎ = "dogcow"

Swift ๋ณ€์ˆ˜๋ช…์€ ์œ ๋‹ˆ์ฝ”๋“œ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณต๋ฐฑ์ด๋‚˜ ์ˆ˜ํ•™ ๊ธฐํ˜ธ, ํ™”์‚ดํ‘œ ๋“ฑ์€ ํฌํ•จํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ’ ์ถœ๋ ฅํ•˜๊ธฐ

var friendlyWelcome = "Hello!"
print(friendlyWelcome)
// "Hello!" ์ถœ๋ ฅ

// ๋ฌธ์ž์—ด ๋ณด๊ฐ„๋ฒ•(String interpolation)
print("The current value is \(friendlyWelcome)")
// "The current value is Hello!" ์ถœ๋ ฅ

๋ฌธ์ž์—ด ๋ณด๊ฐ„๋ฒ•: ๋ฌธ์ž์—ด ๋‚ด์— ๋ณ€์ˆ˜๋‚˜ ํ‘œํ˜„์‹์„ ํฌํ•จ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, \(๋ณ€์ˆ˜๋ช…) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์„ ์ž‘์„ฑ

// ํ•œ ์ค„ ์ฃผ์„์€ ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

/* ์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„์€
   ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. */

/* ์—ฌ๋Ÿฌ ์ค„ ์ฃผ์„์€
   /* ์ค‘์ฒฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. */
   ์ด๋ ‡๊ฒŒ ๋ง์ด์ฃ . */

์„ธ๋ฏธ์ฝœ๋ก  ์‚ฌ์šฉ

Swift์—์„œ๋Š” ๊ฐ ๊ตฌ๋ฌธ ๋์— ์„ธ๋ฏธ์ฝœ๋ก (;)์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ, ํ•œ ์ค„์— ์—ฌ๋Ÿฌ ๊ตฌ๋ฌธ์„ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

let cat = "๐Ÿฑ"; print(cat)
// "๐Ÿฑ" ์ถœ๋ ฅ

๐Ÿ“Œ ์ •์ˆ˜ (Integers)

Swift๋Š” ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ์ •์ˆ˜ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • 8, 16, 32, 64๋น„ํŠธ ํ˜•ํƒœ์˜ ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜(Int8, Int16, Int32, Int64)
  • 8, 16, 32, 64๋น„ํŠธ ํ˜•ํƒœ์˜ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜(UInt8, UInt16, UInt32, UInt64)

Int์™€ UInt

// Int๋Š” ํ˜„์žฌ ํ”Œ๋žซํผ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค
// 32๋น„ํŠธ ํ™˜๊ฒฝ: Int32 ํฌ๊ธฐ
// 64๋น„ํŠธ ํ™˜๊ฒฝ: Int64 ํฌ๊ธฐ
let myInt = 42

// UInt๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ˜„์žฌ ํ”Œ๋žซํผ์˜ ๋„ค์ดํ‹ฐ๋ธŒ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค
let myUInt: UInt = 42

Int: ๋ถ€ํ˜ธ ์žˆ๋Š” ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ, ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

UInt: ๋ถ€ํ˜ธ ์—†๋Š”(์–‘์ˆ˜๋งŒ ๊ฐ€๋Šฅ) ์ •์ˆ˜ ํƒ€์ž…์œผ๋กœ, ํ”Œ๋žซํผ์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ •์ˆ˜ ๋ฒ”์œ„ ํ™•์ธ

let minValue = UInt8.min  // 0
let maxValue = UInt8.max  // 255

๐Ÿ“Œ ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž (Floating-Point Numbers)

Swift๋Š” ๋‘ ๊ฐ€์ง€ ๋ถ€๋™ ์†Œ์ˆ˜์  ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

// Double: 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์ , 15์ž๋ฆฌ ์ •๋ฐ€๋„
let pi = 3.14159265359

// Float: 32๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์ , 6์ž๋ฆฌ ์ •๋ฐ€๋„
let e: Float = 2.71828

Double: 64๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํƒ€์ž…์œผ๋กœ, ๋†’์€ ์ •๋ฐ€๋„๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Float: 32๋น„ํŠธ ๋ถ€๋™ ์†Œ์ˆ˜์  ํƒ€์ž…์œผ๋กœ, Double๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ •๋ฐ€๋„๊ฐ€ ๋‚ฎ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ํƒ€์ž… ์„ธ์ดํ”„ํ‹ฐ์™€ ํƒ€์ž… ์ถ”๋ก  (Type Safety and Type Inference)

ํƒ€์ž… ์ถ”๋ก 

// ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ ์ดˆ๊ธฐ๊ฐ’์— ๋”ฐ๋ผ ํƒ€์ž…์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค
let meaningOfLife = 42    // Int๋กœ ์ถ”๋ก 
let pi = 3.14159          // Double๋กœ ์ถ”๋ก 
let anotherPi = 3 + 0.14159  // Double๋กœ ์ถ”๋ก 

ํƒ€์ž… ์ถ”๋ก : ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•  ๋•Œ ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์„ ๋ณด๊ณ  ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด (Numeric Literals)

Swift์—์„œ๋Š” ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ์ˆซ์ž ๋ฆฌํ„ฐ๋Ÿด์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

// 10์ง„์ˆ˜
let decimalInteger = 17

// 2์ง„์ˆ˜ (0b ์ ‘๋‘์‚ฌ)
let binaryInteger = 0b10001       // 17

// 8์ง„์ˆ˜ (0o ์ ‘๋‘์‚ฌ)
let octalInteger = 0o21           // 17

// 16์ง„์ˆ˜ (0x ์ ‘๋‘์‚ฌ)
let hexadecimalInteger = 0x11     // 17

// ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ฆฌํ„ฐ๋Ÿด
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1    // 12.1875
let hexadecimalDouble = 0xC.3p0   // 12.1875

// ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ํฌ๋งทํŒ…
let oneMillion = 1_000_000
let justOverOneMillion = 1_000_000.000_000_1

๋ฆฌํ„ฐ๋Ÿด: ์†Œ์Šค ์ฝ”๋“œ์— ์ง์ ‘ ํ‘œ์‹œ๋˜๋Š” ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ˆซ์ž ํƒ€์ž… ๋ณ€ํ™˜ (Numeric Type Conversion)

์ •์ˆ˜ ๋ณ€ํ™˜

let twoThousand: UInt16 = 2_000
let one: UInt8 = 1
// ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ง์ ‘ ๋”ํ•  ์ˆ˜ ์—†์Œ
let twoThousandAndOne = twoThousand + UInt16(one)  // ํƒ€์ž… ๋ณ€ํ™˜ ํ•„์š”

์ •์ˆ˜์™€ ๋ถ€๋™ ์†Œ์ˆ˜์  ๋ณ€ํ™˜

let three = 3
let pointOneFourOneFiveNine = 0.14159
let pi = Double(three) + pointOneFourOneFiveNine  // ๋ช…์‹œ์  ๋ณ€ํ™˜ ํ•„์š”

// ๋ถ€๋™ ์†Œ์ˆ˜์ ์—์„œ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜ (์†Œ์ˆ˜์  ์ดํ•˜ ๋ฒ„๋ฆผ)
let integerPi = Int(pi)  // 3

ํƒ€์ž… ๋ณ€ํ™˜: ํ•œ ํƒ€์ž…์˜ ๊ฐ’์„ ๋‹ค๋ฅธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์œผ๋กœ, Swift์—์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํƒ€์ž… ๋ณ„์นญ (Type Aliases)

ํƒ€์ž… ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ์กด ํƒ€์ž…์— ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

typealias AudioSample = UInt16

var maxAmplitudeFound = AudioSample.min  // 0

ํƒ€์ž… ๋ณ„์นญ: ๊ธฐ์กด ํƒ€์ž…์— ์ƒˆ๋กœ์šด ์ด๋ฆ„์„ ๋ถ€์—ฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.


์ด๊ฒƒ์œผ๋กœ Swift ๊ธฐ๋ณธ(The Basics)์˜ ์ฒซ ๋ฒˆ์งธ ํŒŒํŠธ๋ฅผ ๋งˆ์น˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” Bool, ํŠœํ”Œ, ์˜ต์…”๋„, ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ์—ญ์„ค๊ณผ ์ „์ œ์กฐ๊ฑด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.