Swift에서 시간을 효율적으로 다루는 방법

이재원·2024년 9월 15일
0

Swift

목록 보기
13/13
post-thumbnail
post-custom-banner

Swift에서 시간을 다루는 효율적인 방법: 초로 변환하고 다시 시:분:초로 출력하기

시간을 다루는 코드를 작성할 때, 시:분:초를 계산하고 변환하는 작업이 꽤 빈번하게 발생하죠. 이때 초 단위로 계산을 통일하면 코드가 훨씬 간결해지고 일관성 있게 관리할 수 있습니다. 이번 포스팅에서는 Swift에서 시간을 초 단위로 변환하고, 이를 다시 시:분:초 형식으로 변환하는 방법을 알아보겠습니다.

1. 초 단위로 통일하기: convertedSeconds

우리가 시간을 처리할 때, 시(hours), 분(minutes), 초(seconds)로 나뉘어 있는 데이터를 초 단위로 변환하면 계산이 훨씬 쉬워집니다. convertedSeconds라는 속성을 추가해 각 시간을 초로 합산하는 코드를 만들 수 있습니다. 예를 들어:

struct Time {
    let hours: Int
    let minutes: Int
    let seconds: Int

    var convertedSeconds: Int {
        return (hours * 3600) + (minutes * 60) + seconds
    }
}

여기서는 시, 분, 초를 각각 초 단위로 변환하여 합산합니다. 예를 들어 1시간 1분 1초를 이 속성으로 변환하면 3661초가 됩니다. 이제 계산은 초 단위로 이루어지기 때문에 더 일관되고 관리하기 쉬워집니다.

2. 초를 다시 시:분:초로 변환: fromSeconds

초 단위로 모든 계산을 했으면, 다시 시:분:초 형식으로 변환해야 할 때가 있습니다. 이때 fromSeconds라는 정적 메서드를 사용하면 초를 시:분:초로 변환할 수 있습니다.

static func fromSeconds(_ seconds: Int) -> Time {
    let hours = seconds / 3600
    let minutes = (seconds % 3600) / 60
    let remainingSeconds = (seconds % 3600) % 60
    return Time(hours: hours, minutes: minutes, seconds: remainingSeconds)
}

여기서 static 메서드로 선언한 이유는 객체 인스턴스를 생성하지 않고도 바로 사용할 수 있도록 하기 위함입니다. 즉, Time 객체를 생성하지 않아도 Time.fromSeconds(3661)처럼 호출할 수 있죠. 이를 통해 초 단위를 시:분:초로 간단하게 변환할 수 있습니다.

static 메서드를 사용하는 것은, 해당 기능이 특정 객체의 상태와 관계없이 유용한 유틸리티 함수로 사용될 때 매우 유리합니다. 예를 들어, 초 단위를 시:분:초로 변환하는 작업은 객체의 상태에 의존하지 않기 때문에 정적 메서드로 선언하여 바로 호출할 수 있게 만든 것이죠.

이 메서드는 초를 다시 시, 분, 초로 변환하는 역할을 합니다. 3661초를 넣으면 1시간 1분 1초로 반환하죠. 덕분에 계산된 초를 쉽게 시간 형식으로 바꿀 수 있습니다.

3. 시간을 보기 좋게 출력하기: formattedTimeString

시간을 사람이 읽기 좋은 시:분:초 형식으로 변환하려면, Int에 확장을 추가하여 formattedTimeString이라는 속성을 만들어보죠.

extension Int {
    var formattedTimeString: String {
        let time = Time.fromSeconds(self)
        let hoursString = String(format: "%02d", time.hours)
        let minutesString = String(format: "%02d", time.minutes)
        let secondsString = String(format: "%02d", time.seconds)

        return "\(hoursString) : \(minutesString) : \(secondsString)"
    }
}

이 코드는 초를 입력받아 시:분:초 형식의 문자열로 변환해줍니다. fromSeconds 메서드에 self를 인수로 전달하는데, 이때 self는 Int 값 자체를 나타냅니다. 예를 들어 3661.formattedTimeString을 호출하면 self는 3661을 의미하고, 포맷팅을 통해 "01 : 01 : 01"이라는 형식의 문자열을 반환합니다. 이렇게 하면 시간 형식 변환이 매우 간단해집니다.

4. 실제 사용 예시

이제 Time 객체에서 시간을 초로 변환하고, 다시 시:분:초로 변환하는 과정을 하나의 흐름으로 볼 수 있습니다.

let time = Time(hours: 1, minutes: 1, seconds: 1)

// Time 객체를 초 단위로 변환
let totalSeconds = time.convertedSeconds
print(totalSeconds)  // 출력: 3661

// 초를 다시 시:분:초 형식으로 변환
print(totalSeconds.formattedTimeString)  // 출력: "01 : 01 : 01"

이렇게 시간을 초 단위로 변환하고 다시 형식에 맞게 변환하는 과정을 통해 코드가 간결하고 명확해집니다. 특히 여러 계산을 할 때, 초 단위로 일관되게 처리하는 방식이 시간을 더 효율적으로 관리할 수 있게 해줍니다.

마무리

Swift에서 시간을 다룰 때, 초 단위로 변환하고 다시 시:분:초로 변환하는 구조를 사용하면 더 명확하고 간결한 코드를 작성할 수 있습니다. 모든 계산을 초로 통일한 후, 필요할 때만 다시 시:분:초로 변환하면 코드가 복잡해지는 것을 방지할 수 있습니다.

또한 static 메서드의 장점을 살려, 객체 생성 없이 유틸리티 메서드처럼 사용할 수 있게 하여 더 편리하게 시간을 다룰 수 있습니다.

출처
https://green1229.tistory.com/398

profile
20학번 새내기^^(였음..)
post-custom-banner

0개의 댓글