본문 바로가기
프로그래밍/iOS

[iOS] Swift 공부 - 14

by Cian 2024. 3. 14.

▶ Swift의 데이터 타입

Int 정수 타입. 기본적으로는 64비트 정수형. var age: Int = 30
UInt 부호 없는 정수 타입. 모든 값이 양수. var size: UInt = 100
Float 부동소수점 타입. 32비트 부동소수점 수를 나타냄. var height: Float = 175.5
Double 부동소수점 타입. 64비트 부동소수점 수를 나타냄. var distance: Double = 382.2
Bool 불리언 타입. 참(true) 또는 거짓(false)만을 가짐. var isHidden: Bool = false
String 문자열 타입. 텍스트 데이터를 나타냄. var name: String = "John Doe"
Character 문자 타입. 단일 문자를 나타냄. var letter: Character = 'A'
Optional 옵셔널 타입. 변수가 값이 없을 수도 있음을 나타냄. var website: String? = nil
Array 배열 타입. 동일 타입의 값들을 순서대로 저장. var numbers: [Int] = [1, 2, 3]
Dictionary 딕셔너리 타입. 키-값 쌍으로 데이터를 저장. var capitals: [String: String] = ["KR": "Seoul"]
Set 세트 타입. 중복 없는 동일 타입의 값들을 저장. var uniqueNumbers: Set<Int> = [1, 2, 3, 3]

 

 

 

일반적으로 초깃값을 주지 않을 경우에만 자료형을 쓴다

- Swift에서 변수나 상수를 선언할 때, 초깃값을 명시적으로 제공하지 않는 경우에는 해당 변수나 상수의 타입을 명시해야 한다. 이는 Swift의 타입 추론(type inference) 기능 때문인데, 타입 추론을 통해 컴파일러가 변수나 상수의 타입을 자동으로 판단하고 결정할 수 있다. 초깃값을 제공할 때는 Swift 컴파일러가 이 값을 기반으로 해당 변수나 상수의 타입을 추론할 수 있기 때문에, 별도로 타입을 명시하지 않아도 된다. 하지만, 초깃값을 제공하지 않는 경우에는 컴파일러가 타입을 추론할 수 있는 정보가 없으므로, 변수나 상수의 타입을 명시적으로 선언해주어야 한다. 예시로 초깃값이 있는 경우 타입을 명시하지 않아도 된다.

var name = "cian" // 'name'은 자동으로 'String' 타입으로 추론된다.

 

반대로 초깃값이 없는 경우 타입을 명시해야 한다.

var age: Int // 'age'는 Int 타입이라고 명시해야 한다.

 

 

타입 어노테이션과 타입 추론

Swift는 타입 안전(type-safe) 언어이다. 이는 모든 변수와 상수에 저장되는 값의 타입이 명확해야 한다는 것을 의미한다. Swift에서는 이를 위해 타입 어노테이션(type annotation)과 타입 추론(type inference) 두 가지 방법을 제공한다.

 

- 타입 어노테이션(Type Annotation)

타입 어노테이션은 개발자가 변수나 상수를 선언할 때, 저장될 값의 타입을 명시적으로 선언하는 방법이다. 이는 컴파일러에게 해당 변수나 상수가 어떤 타입의 값을 저장할 것인지 알려주는 역할을 한다. 타입 어노테이션은 변수나 상수 이름 뒤에 콜론(:)을 붙이고, 그 뒤에 타입 이름을 작성함으로써 사용된다.

var name: String = "Cian"
var age: Int

 

- 타입 추론(Type Inference)

타입 추론은 Swift 컴파일러가 변수나 상수에 할당된 초깃값을 기반으로 그 타입을 자동으로 판단하고 결정하는 기능입니다. 따라서 개발자는 모든 변수나 상수에 대해 타입을 명시적으로 선언하지 않아도 됩니다. 이는 코드를 더 간결하고 읽기 쉽게 만들어 줍니다.

var name = "Cian" // 'String' 타입으로 추론됩니다.
var age = 5050 // 'Int' 타입으로 추론됩니다.

 

정리하면, 타입 어노테이션은 개발자가 변수나 상수의 타입을 명시적으로 선언하는 것이고, 타입 추론은 Swift 컴파일러가 초깃값을 기반으로 변수나 상수의 타입을 자동으로 결정하는 것이다.

 

 

 

 swift 기본 파일

다음은 Swift에서 iOS 앱 프로젝트를 만들 때 자동으로 생성되는 주요 파일들이다. 해당 파일들은 앱의 다양한 측면을 관리하는 데 필요한데, 각각의 역할을 이해하는 것은 iOS 앱 개발의 기초를 이해하는 데 중요하다.

 

- AppDelegate

앱의 생명주기 관리를 담당하는 객체이다. 앱이 시작되고 종료될 때 수행해야 할 작업을 정의한다. 예를 들어, 앱이 백그라운드로 전환되거나 다시 활성화될 때 필요한 작업을 설정할 수 있다. 또한, 외부에서 오는 이벤트나 알림에 반응하는 코드를 여기에 작성할 수도 있다.

 

- SceneDelegate (iOS 13 이상에서 사용)

iOS 13부터 도입된 SceneDelegate는 앱 내의 scene(화면)의 생명주기를 관리한다. 여러 개의 scene을 동시에 관리할 수 있게 되면서, 같은 앱이 여러 화면(예: iPad에서의 멀티태스킹)에서 동시에 실행될 수 있게 되었다. SceneDelegate는 해당 scene이 활성화되거나 비활성화될 때, 혹은 사용자가 scene을 전환할 때 수행해야 할 작업을 정의한다.

 

- ViewController

앱의 화면 하나를 관리하는 객체이다. 사용자에게 보여지는 뷰(화면)의 내용을 관리하고, 사용자의 입력에 반응하여 필요한 작업을 수행한다. 예를 들어, 사용자가 버튼을 탭할 때 특정 작업을 실행하거나, 화면에 표시되는 데이터를 업데이트하는 역할을 한다. 하나의 앱은 여러 개의 ViewController로 구성될 수 있으며, 각각은 독립적인 화면을 담당한다.

 

- main.storyboard

앱의 주요 인터페이스를 구성하는 데 사용된다. 이 스토리보드 파일은 앱의 다양한 뷰(View)와 뷰 컨트롤러(ViewController) 사이의 관계를 시각적으로 표현하고, 앱의 사용자 인터페이스를 디자인하는 데 사용된다. 개발자는 main.storyboard를 사용하여 앱의 화면을 구성하고, 화면 간의 전환(logic)을 구현할 수 있다. 대부분의 UI 구성 요소와 화면 전환 로직은 이 스토리보드 내에서 시각적 도구를 통해 쉽게 설정할 수 있다.

 

- assets.xcassets

iOS 또는 macOS 앱 프로젝트에서 사용하는 이미지와 앱의 에셋을 관리하기 위한 컨테이너이다. 이 컨테이너 내에서 개발자는 앱에서 사용되는 모든 시각적 자원들, 예를 들어 아이콘, 이미지, 앱 아이콘, 그리고 기타 에셋들을 효율적으로 조직하고 관리할 수 있다.

 

-LaunchScreen.storyboard

앱이 시작될 때 잠깐 동안 사용자에게 보여지는 시작 화면(Launch Screen)을 디자인하는 데 사용된다. 이 스토리보드는 앱이 로딩되는 동안 사용자에게 빈 화면 대신 보여질 초기 화면을 구성하기 위해 사용되며, 앱의 첫인상을 결정짓는 중요한 요소가 될 수 있다. LaunchScreen.storyboard를 통해 앱 로고나 초기 화면 디자인을 설정할 수 있으며, 앱의 로딩 경험을 개선하는 데 기여한다. 이 스토리보드는 단순히 시각적 요소만을 포함하며, 사용자와의 상호작용이나 복잡한 로직을 포함하지 않는다.

 

 

▶ App Life Cycle

iOS 앱은 그 상태에 따라 다르게 동작하며, 이를 이해하는 것은 앱 개발 시 중요한 부분이다. 실행 모드와 상태는 앱이 사용자와 어떻게 상호작용하는지, 시스템 리소스는 어떻게 관리되는지를 결정한다.

 

- 앱의 3가지 실행 모드와 5가지 상태

앱은 크게 Not Running, Foreground (Active, Inactive), Background (Running, Suspend)의 상태를 가진다.

 

1. Not Runnin

   > 앱이 시작되지 않았거나, 시스템에 의해 종료된 상태이다.

2. Foreground

   > Active: 앱이 활성 상태이며 이벤트를 받고 있다. 사용자와의 상호작용이 이루어지는 주요 시간이다.

   > Inactive: 앱이 전경에 있지만, 이벤트를 받고 있지 않는다. 예를 들어, 전화가 오는 중간 상태나, 사용자가 알림 센터나 컨트롤 센터를 열었을 때이다.

3. Background

   >Running: 앱이 백그라운드에 있지만, 여전히 코드를 실행하고 있다. 사용자가 다른 앱으로 전환하거나 홈 화면으로 돌아갔을 때, 시스템이 앱을 백그라운드 상태로 전환한다.

   >Suspend: 앱이 백그라운드에 있지만, 코드를 실행하지 않는다. 시스템은 앱을 이 상태로 자동으로 전환하며, 필요에 따라 메모리를 회수하기 위해 앱을 종료할 수 있다.

 

- 상태 전환

   > Not Running -> Active: 사용자가 앱 아이콘을 터치하여 앱을 시작할 때 이 상태 전환이 일어난다.

   > Active -> Inactive -> Running: 사용자가 다른 앱으로 전환하거나 홈 화면으로 돌아가면, 앱은 먼저 Inactive 상태가 되었다가 백그라운드에서Running 상태로 전환된다.

   > Active -> Inactive -> Suspend: 앱이 Active에서 Inactive를 거쳐 Suspend 상태로 전환될 때, 백그라운드에서 코드 실행 없이 대기 상태가 된다.

   > Running -> Active: 백그라운드에서 실행 중인 앱이 다시 전경으로 오면서 Active 상태가 된다.

 

 

▶ View Life Cycle

뷰 컨트롤러의 생명 주기(View Life Cycle)는 iOS 앱에서 뷰 컨트롤러가 생성되고 화면에 표시되며 사라지는 과정을 관리한다. 이 과정에서 여러 단계를 거치며, 각 단계마다 특정 작업을 수행할 수 있는 메서드들이 호출된다.

 

1. viewDidLoad()

 - 뷰 컨트롤러의 뷰가 메모리에 로드된 직후 호출된다.

 - 주로 초기 데이터 설정, 뷰와 관련된 추가적인 초기화 작업을 수행한다.

 - 이 메서드는 뷰의 생명 주기 동안 한 번만 호출된다.

2. viewWillAppear(_:)

 - 뷰 컨트롤러의 뷰가 뷰 계층에 추가되기 직전에 호출된다.

 - 뷰가 화면에 나타나기 바로 전에 수행해야 할 작업들을 구현한다.

 - 예를 들어, 화면에 표시될 데이터를 갱신하거나, 네비게이션 바와 같은 UI 요소의 설정을 변경할 때 사용된다.

3. viewDidAppear(_:)

 - 뷰 컨트롤러의 뷰가 뷰 계층에 추가된 직후에 호출된다.

 - 뷰가 사용자에게 완전히 보여진 후에 수행해야 할 작업들을 구현한다.

 - 예를 들어, 애니메이션을 시작하거나, 사용자와의 상호작용을 위한 준비를 할 때 사용된다.

4. viewWillDisappear(_:)

 - 뷰 컨트롤러의 뷰가 뷰 계층에서 사라지기 직전에 호출된다.

 - 뷰가 화면에서 사라지기 전에 수행해야 할 작업들을 구현한다.

 - 예를 들어, 실행 중인 애니메이션을 중지하거나, 수정된 데이터를 저장할 때 사용된다.

5. viewDidDisappear(_:)

 - 뷰 컨트롤러의 뷰가 뷰 계층에서 완전히 제거된 후에 호출된다.

 - 뷰가 화면에서 완전히 사라진 후에 수행해야 할 작업들을 구현한다.

 - 예를 들어, 뷰 컨트롤러가 관리하는 리소스를 해제하거나, 다른 정리 작업을 수행할 때 사용된다.

추가 메서드

 - viewWillLayoutSubviews(): 뷰 컨트롤러가 자식 뷰들의 레이아웃을 조정하기 직전에 호출된다.

 - viewDidLayoutSubviews(): 뷰 컨트롤러가 자식 뷰들의 레이아웃 조정을 마친 직후에 호출된다.

 

 

 

배경색이 1초마다 계속 변경되고, 스위치를 이용해 기능 제어함과 동시에 배경 터치로 종료할 있는 앱 실습

import UIKit
import AVFoundation

class ViewController: UIViewController {
  
  var colorChangeTimer: Timer?
  var audioPlayer: AVAudioPlayer!

    @IBOutlet weak var musicSwitch: UISwitch!
    
    override func viewDidLoad() {
    super.viewDidLoad()
    
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
    view.addGestureRecognizer(tapGesture)
    
    NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
  }
  
  @objc func applicationWillEnterForeground() {
    startTimerAndMusic()
  }
  
  @objc func handleTapGesture() {
    stopTimerAndMusic()
      colorChangeTimer = nil
      audioPlayer = nil
    
    let alert = UIAlertController(title: "알림", message: "앱을 종료해주세요.", preferredStyle: .alert)
    let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
    alert.addAction(okAction)
    present(alert, animated: true, completion: nil)
  }
  
    @IBAction func switchDidChange(_ sender: UISwitch) {
        if sender.isOn {
            startTimerAndMusic()
        }else {
            stopTimerAndMusic()
        }
    }
    func startTimerAndMusic() {
    // 배경 음악 재생 설정
    if let soundURL = Bundle.main.url(forResource: "bgm", withExtension: "mp3") {
      do {
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
        audioPlayer.play()
      } catch {
        print("음악 파일 로드 또는 재생 중 에러 발생: \(error)")
      }
    }
    
    // 1초마다 반복되는 타이머 생성
    colorChangeTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
      // 랜덤한 빨간색, 초록색, 파란색 값을 생성
      let red = CGFloat(arc4random_uniform(256)) / 255.0
      let green = CGFloat(arc4random_uniform(256)) / 255.0
      let blue = CGFloat(arc4random_uniform(256)) / 255.0
      
      // 생성된 랜덤 색상을 사용하여 ViewController의 배경색 설정
      self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
    }
  }
  
  func stopTimerAndMusic() {
    // 타이머와 음악 재생 중지
    colorChangeTimer?.invalidate()
    colorChangeTimer = nil
    audioPlayer.stop()
  }
}

 

 

 

 

 

 

 

'프로그래밍 > iOS' 카테고리의 다른 글

[iOS] Swift 공부 - 16  (0) 2024.04.04
[iOS] Swift 공부 - 15  (0) 2024.03.28
[iOS] Swift 공부 - 13  (0) 2024.03.07
[iOS] Swift 공부 - 12  (0) 2024.03.07
[iOS] Swift 공부 - 11  (1) 2023.11.27