시간을 다루는 코드를 작성할 때, 시:분:초를 계산하고 변환하는 작업이 꽤 빈번하게 발생하죠. 이때 초 단위로 계산을 통일하면 코드가 훨씬 간결해지고 일관성 있게 관리할 수 있습니다. 이번 포스팅에서는 Swift에서 시간을 초 단위로 변환하고, 이를 다시 시:분:초 형식으로 변환하는 방법을 알아보겠습니다.
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초
가 됩니다. 이제 계산은 초 단위로 이루어지기 때문에 더 일관되고 관리하기 쉬워집니다.
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초로 반환하죠. 덕분에 계산된 초를 쉽게 시간 형식으로 바꿀 수 있습니다.
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"이라는 형식의 문자열을 반환합니다. 이렇게 하면 시간 형식 변환이 매우 간단해집니다.
이제 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
메서드의 장점을 살려, 객체 생성 없이 유틸리티 메서드처럼 사용할 수 있게 하여 더 편리하게 시간을 다룰 수 있습니다.