λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[Swift] λ³€μˆ˜μ™€ ν”„λ‘œνΌν‹°2

by hyebin (Helia) 2024. 3. 15.
λ°˜μ‘ν˜•

* 2023λ…„ Apple Developer Academy @ POSTECH μ—μ„œ swift μŠ€ν„°λ””λ₯Ό ν•˜λ©° κ³΅λΆ€ν•œ λ‚΄μš©μž…λ‹ˆλ‹€

 

4. ν•„μš”μ„±

  • 데이터 보쑴/관리
    • 데이터 μ €μž₯
      • λ³€μˆ˜λŠ” 데이터λ₯Ό μ €μž₯
      • 이λ₯Ό 톡해 값을 κΈ°μ–΅ν•˜κ³  ν•„μš”ν•  λ•Œ λ‹€μ‹œ μ‚¬μš©
    • 데이터 μ‘°μž‘
      • λ³€μˆ˜λŠ” μ €μž₯된 데이터λ₯Ό μ‘°μž‘.
      • ex-값을 μ¦κ°€μ‹œν‚€κ±°λ‚˜ κ°μ†Œμ‹œν‚€κ±°λ‚˜, 두 값을 λ”ν•˜κ±°λ‚˜ λΉΌλŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰
    • 데이터 전달
      • λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 데이터λ₯Ό 전달
      • ex-ν•œ ν•¨μˆ˜μ—μ„œ λ‹€λ₯Έ ν•¨μˆ˜λ‘œ 데이터λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ λ·° μ»¨νŠΈλ‘€λŸ¬μ—μ„œ 뷰둜 데이터λ₯Ό 전달
      • 데이터λ₯Ό λ³΄μ‘΄ν•˜κ³  ν•„μš”μ‹œμ— μ°Έμ‘°ν•˜κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•œκ²ƒμ΄ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ°€μž₯ 큰 λͺ©μ 
      • μ£Όμ†Œλ‘œ λͺ¨λ“  것을 κ΄€λ¦¬ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— μ£Όμ†ŒλŠ” μš΄μ˜μ²΄μ œκ°€ κ΄€λ¦¬ν•˜κ³  μš°λ¦¬λŠ” λ³€μˆ˜ μ΄λ¦„λ§Œ κ°€μ§€κ³  κ΄€λ¦¬ν•˜λ©΄ λ³€μˆ˜μ˜ 이름이 λΆ™μ—¬μ§„ 곡간을 μš΄μ˜μ²΄μ œκ°€ μ•Œμ•„μ„œ μ°Ύμ•„κ°€μ„œ 값을 λ„£κ±°λ‚˜ μˆ˜μ •ν•  수 있음
  • νš¨μœ¨μ„±
    • μ½”λ“œμ˜ μž¬μ‚¬μš©
      • λ³€μˆ˜λŠ” 값을 μ €μž₯ν•˜κ³  λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆμœΌλ―€λ‘œ μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬μ€Œ
      • ex-μ‚¬μš©μžμ˜ 이름을 μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©
    • ν”„λ‘œκ·Έλž¨μ˜ μƒνƒœ 관리
      • λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ” 데 μ‚¬μš©
      • ex-κ²Œμž„μ—μ„œ ν˜„μž¬ 점수λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžκ°€ λ§ˆμ§€λ§‰μœΌλ‘œ λ°©λ¬Έν•œ νŽ˜μ΄μ§€λ₯Ό μ €μž₯
    • λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ½”λ“œμ˜ μž¬ν™œμš©μ„±κ³Ό 가독성을 λ†’μ—¬μ£Όκ³ , 쀑볡을 μ œκ±°ν•˜μ—¬ μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•΄μ€€λ‹€λŠ” μž₯점이 있음

 

5. λͺ…λͺ…κ·œμΉ™

이름 μ„€λͺ… μ˜ˆμ‹œ
낙타 ν‘œκΈ°λ²•(Camel Case)
= μ†Œλ¬Έμž 카멜 ν‘œκΈ°λ²•
- 각 λ‹¨μ–΄μ˜ 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ ν‘œκΈ°ν•˜λ˜ μ΄λ¦„μ˜ 첫 λ¬ΈμžλŠ” μ†Œλ¬Έμžλ‘œ μž‘μ„±
- λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ…
camelCase
userName
파슀칼 ν‘œκΈ°λ²•(Pascal Case)
= λŒ€λ¬Έμž 카멜 ν‘œκΈ°λ²•
- 각 λ‹¨μ–΄μ˜ 첫 문자λ₯Ό λŒ€λ¬Έμžλ‘œ ν‘œκΈ°ν•˜λ©° μ΄λ¦„μ˜ 첫 문자 λ˜ν•œ λŒ€λ¬Έμžλ‘œ μž‘μ„± 
- 클래슀λͺ…
PascalCase
UserName
λ±€ ν‘œκΈ°λ²•(Snake Case) - 각 단어 사이λ₯Ό μ–Έλ”λ°”λ‘œ ꡬ뢄
- λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”λͺ…, 컬럼λͺ…
snake_case
user_name
μΌ€λ°₯ ν‘œκΈ°λ²•(Kebab Case) - 각 단어 사이λ₯Ό ν•˜μ΄ν”ˆμœΌλ‘œ ꡬ뢄
- HTML νƒœκ·Έ id, class 속성
kebab-case
ν—κ°€λ¦¬μ•ˆ ν‘œκΈ°λ²•
(Hungarian Notation)
- 이름 μ•žμ— λ³€μˆ˜μ˜ νƒ€μž…μ„ μ ‘λ‘μ–΄λ‘œ λ„£μ–΄μ£ΌλŠ” ν‘œκΈ°λ²•
- ch(char), str(string), i(int), db(double), b(boolean) 
strUserName
iUserAge
  • 이름은 낙타 ν‘œκΈ°λ²•μœΌλ‘œ μž‘μ„±ν•΄μ•Ό 함
  • 이름은 μ„€λͺ…적이고 μ˜λ―Έκ°€ μžˆμ–΄μ•Ό 함
    • 이름은 λΆ„λͺ…ν•˜κ³  μ •ν™•ν•˜κ²Œ λ³€μˆ˜, ν•¨μˆ˜, ν˜Ήμ€ λ‹€λ₯Έ κ°œμ²΄κ°€ 무엇을 λ‚˜νƒ€λ‚΄λŠ”μ§€/ν•˜λŠ”μ§€λ₯Ό λ¬˜μ‚¬ν•  수 μžˆμ–΄μ•Ό 함
  • μ•½μ–΄(abbreviation)λ‚˜ λ‘λ¬Έμžμ–΄(acronym)λŠ” ν”Όν•΄μ•Ό 함
    • 전체 단어λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ
    • λ‹€λ₯Έ κ°œλ°œμžλ“€μ΄ 읽고 μ΄ν•΄ν•˜κΈ° 쉽도둝
  • λ³€μˆ˜μ™€ μƒμˆ˜μ—λŠ” λͺ…사λ₯Ό, ν•¨μˆ˜λ‚˜ λ©”μ†Œλ“œμ—λŠ” 동사λ₯Ό μ‚¬μš©
    • μ½”λ“œλ² μ΄μŠ€ μ „μ²΄μ—μ„œ 각 개체의 λͺ©μ μ„ λΆ„λͺ…ν•˜κ³  일관성 있게 μ§€μ •ν•  수 있음
  • μ΄λ‹ˆμ…œκ³Ό λ‘λ¬Έμžμ–΄λ₯Ό κ΅¬λ³„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λŒ€λ¬Έμž μ‚¬μš©
    • HTTP, URL, HTML
  • λΆ€μšΈκ°’μ—λŠ” μ†Œλ¬Έμž μ‚¬μš©
    • isDone, hasError, isEnabled
  • λ³€μˆ˜μ™€ μƒμˆ˜ μ΄λ¦„μ—λŠ” 낙타 ν‘œκΈ°λ²• μ‚¬μš©, νƒ€μž…λͺ…μ—λŠ” 파슀칼 ν‘œκΈ°λ²• μ‚¬μš©
    • νƒ€μž…κ³Ό νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄
  • μ˜ˆμ™Έ
    • 단 λ‹€μŒκ³Ό 같은 μ˜ˆμ™Έ κ²½μš°μ—λŠ” μ‚¬μš© λΆˆκ°€
    • 미리 μ •ν•œ μ˜ˆμ•½μ–΄ λ˜λŠ” ν‚€μ›Œλ“œ
    • ν•΄λ‹Ή μ½”λ“œ λ²”μœ„ λ‚΄μ—μ„œ 미리 μ‚¬μš©λ˜λŠ” κΈ°μ‘΄ 이름과 λ™μΌν•œ 이름
    • μ—°μ‚°μžλ‘œ μ‚¬μš©λ  수 μžˆλŠ” 기호(+,-,*,/)
    • 숫자둜 μ‹œμž‘ν•˜λŠ” 이름
    • 곡백이 ν¬ν•¨λœ 이름
    • ν•¨μˆ˜, λ©”μ„œλ“œ, μΈμŠ€ν„΄μŠ€ 이름은 μ²«κΈ€μžλ₯Ό μ†Œλ¬Έμžλ‘œ μ‚¬μš©ν•˜λŠ”
// Variables and Constants
let numberOfItems: Int
var firstName: String

// Functions and Methods
func calculateTotal() -> Double
func showErrorMessage(message: String)

// Types
struct Person {
    var firstName: String
    var lastName: String
}

enum Result {
    case success
    case failure
}

 

6. μ„ μ–Έ

  • Swiftμ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ €λ©΄ 데이터 νƒ€μž…μ„ λͺ…μ‹œν•˜κ³  λ³€μˆ˜ 이름을 μ§€μ •
var num: Int  // μ •μˆ˜ν˜• λ³€μˆ˜ num을 μ„ μ–Έ 
var pi: Float  // μ‹€μˆ˜ν˜• λ³€μˆ˜ piλ₯Ό μ„ μ–Έ 
var ch: Character // λ¬Έμžν˜• λ³€μˆ˜ chλ₯Ό μ„ μ–Έ
  • SwiftλŠ” λ³€μˆ˜ μ„ μ–Έ μ‹œ λ³€μˆ˜μ˜ 데이터 νƒ€μž…μ„ μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ 됨
    • 이 경우 μ»΄νŒŒμΌλŸ¬κ°€ λ³€μˆ˜μ˜ 데이터 νƒ€μž…μ„ μžλ™μœΌλ‘œ μΆ”λ‘ 
    • νƒ€μž… μΆ”λ‘ (Type Inference)
var num = 10  // numμ΄λΌλŠ” λ³€μˆ˜μ— μ •μˆ˜ν˜• 데이터 10을 ν• λ‹Ήν•˜κ³ , νƒ€μž… 좔둠을 톡해 Int νƒ€μž…μœΌλ‘œ μ§€μ •λ©λ‹ˆλ‹€. 
var pi = 3.14  // piλΌλŠ” λ³€μˆ˜μ— μ‹€μˆ˜ν˜• 데이터 3.14λ₯Ό ν• λ‹Ήν•˜κ³ , νƒ€μž… 좔둠을 톡해 Float νƒ€μž…μœΌλ‘œ μ§€μ •λ©λ‹ˆλ‹€. 
var ch = "a"  // chλΌλŠ” λ³€μˆ˜μ— λ¬Έμžν˜• 데이터 'a'λ₯Ό ν• λ‹Ήν•˜κ³ , νƒ€μž… 좔둠을 톡해 Character νƒ€μž…μœΌλ‘œ μ§€μ •λ©λ‹ˆλ‹€.
  • λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ ν›„, λ³€μˆ˜μ— 값을 ν• λ‹Ήν•˜κ±°λ‚˜ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ—¬ μ‚¬μš©ν•  수 있음
    • λ³€μˆ˜μ˜ 값은 μ–Έμ œλ“ μ§€ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€
num = 20  // num λ³€μˆ˜μ— 20을 ν• λ‹Ήν•©λ‹ˆλ‹€. 
pi = 3.14159  // pi λ³€μˆ˜μ— 3.14159λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. 
ch = "b"  // ch λ³€μˆ˜μ— 'b'λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€.

 

7. λ³€μˆ˜μ˜ νƒ€μž…κ³Ό λ©”λͺ¨λ¦¬

λ³€μˆ˜μ˜ νƒ€μž…

μ •μˆ˜

Int 일반적인 μ •μˆ˜. 32bit λ˜λŠ” 64bit의 값이 됨 (μ‹€ν–‰ν•˜λŠ” CPU에 따라 달라짐)
UInt Int와 λ™μΌν•˜μ§€λ§Œ +,- λΆ€ν˜Έκ°€ μ—†μŒ → μŒμˆ˜κ°€ μ•„λ‹Œ μ •μˆ˜
Byte 8bit 폭의 κ°’
Int8, Int16, Int32, Int64 - κ°’μ˜ 크기λ₯Ό μ§€μ •ν•˜κ³  λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것과 같은 경우, 이것듀을 μ΄μš©ν•˜λŠ” 것이 μ•ŒκΈ° 쉬움
- 각 λ³€μˆ˜μ˜ bit수λ₯Ό λ‚˜νƒ€λƒ„
- λΆ€ν˜Έ μ—†λŠ” μ •μˆ˜ “UInt8~” 등도 갖좔어짐
  • 각 λΉ„νŠΈλ³„λ‘œ ν‘œν˜„ κ°€λŠ₯ν•œ μ •μˆ˜ 자릿수 크기가 λ‹€λ₯΄λ©°, .min .maxλ₯Ό 톡해 ν‘œν˜„ κ°€λŠ₯ν•œ μ •μˆ˜ λ²”μœ„ 확인 κ°€λŠ₯

μ‹€μˆ˜

Float 32bit 폭의 뢀동 μ†Œμˆ˜μ  κ°’. μ†Œμˆ˜μ  6μžλ¦¬κΉŒμ§€.
Double 64bit 폭의 뢀동 μ†Œμˆ˜. μ†Œμˆ˜μ  15μžλ¦¬κΉŒμ§€.
Float32, Float64, Float80, Float96 - κ°’μ˜ 크기λ₯Ό μ§€μ •ν•˜μ—¬ 뢀동 μ†Œμˆ˜μ μ„ μ·¨κΈ‰ν•˜κ³  싢은 κ²½μš°μ— μ‚¬μš©ν•¨
- Doubleμ—μ„œλ„ 정밀도가 λΆ€μ‘±ν•œ 경우 96bit ν­κΉŒμ§€ μ‚¬μš©ν•  있음

 

ν…μŠ€νŠΈ

String - 일반적인 ν…μŠ€νŠΈ
- 큰 λ”°μ˜΄ν‘œ (”)둜 λ‘˜λŸ¬μ„œ ν‘œν˜„ 
- +μ—°μ‚°μž, ==비ꡐ 등이 κ°€λŠ₯함
Character - 1개의 문자 ν…μŠ€νŠΈ ・ 큰 λ”°μ˜΄ν‘œ (”)둜 λ‘˜λŸ¬μ„œ ν‘œν˜„
- μœ λ‹ˆμ½”λ“œ9 문자λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— νŠΉμˆ˜κΈ°ν˜Έλ„ μ‚¬μš©ν•  수 있음

 

λΆ€μšΈ(이진)

Bool - 논리 κ°’
- true λ˜λŠ” false
- false/true λŒ€μ‹  0,1을 λ„£μ–΄μ„œ μ‚¬μš©ν•  수 μ—†μŒ
- 1bit(0 or 1)

 

μ˜΅μ…”λ„

Optional - 값이 μžˆμ„ μˆ˜λ„ 있고, 없을 μˆ˜λ„ μžˆλŠ” λ³€μˆ˜
-  var str : String? = nil 
-  var nums : [Int]? = nil 

 

Any

Any - λͺ¨λ“  νƒ€μž…μ„ μ €μž₯함
- μžλ£Œν˜•μ„ Any으둜 λͺ…μ‹œν•΄μ£Όλ©΄, Anyνƒ€μž…μ—λŠ” Value νƒ€μž…(ꡬ쑰체, μ—΄κ±°ν˜•), Reference νƒ€μž…(클래슀, ν΄λ‘œμ €) 상관없이 μ €μž₯ κ°€λŠ₯함
var things: [Any] = []
 
things.append(1)
things.append(1.0)
things.append("sodeul")
things.append(false)        
things.append(Human.init()))        
things.append({ print("I am Sodeul!") })

 

AnyObject

AnyObject - λͺ¨λ“  class νƒ€μž…μ„ μ €μž₯
- μ €μž₯ν•˜λ €λŠ” 객체의 νƒ€μž…μ΄ 클래슀이기만 ν•˜λ©΄ 됨
var things: [AnyObject] = []
 
things.append(1)                                // Argument type 'Int' expected to be an instance of a class
things.append(1.0)                              // Argument type 'Double' expected to be an instance of a class
things.append("sodeul")                         // Argument type 'String' expected to be an instance of a class
things.append(false)                            // Argument type 'Bool' expected to be an instance of a class
things.append(Teacher.init()))        
things.append({ print("I am Sodeul!") })        // Argument type '()->()' expected to be an instance of a class

 

 

λΉ„νŠΈ bit πŸ†š λ°”μ΄νŠΈ Byte

λΉ„νŠΈ bit λ°”μ΄νŠΈ Byte
0κ³Ό 1 λ‘κ°€μ§€λ§Œ κ°€μ§ˆ 수 μžˆλŠ” μΈ‘μ • λ‹¨μœ„ 8개의 λΉ„νŠΈλ‘œ κ΅¬μ„±λœ λ°μ΄ν„°μ˜ 양을 λ‚˜νƒ€λ‚΄λŠ” λ‹¨μœ„
  • 1 byte = 256개의 정보 내포
    • 1 byte = 2(0κ³Ό 1 두 개) ^ 8 bits = 256

 

λ³€μˆ˜μ˜ λ©”λͺ¨λ¦¬

  • Bool: 1 byte
  • Int8: 1 byte
  • UInt8: 1 byte
  • Int16: 2 bytes
  • UInt16: 2 bytes
  • Int32: 4 bytes
  • UInt32: 4 bytes
  • Int64: 8 bytes
  • UInt64: 8 bytes
  • Float: 4 bytes
  • Double: 8 bytes
  • Character: 16 bits (2 bytes)
  • String: 16 bits (2 bytes)
λ°˜μ‘ν˜•