투케이2K

55. (TWOK/UTIL) [Ios/Objc] C_Util - string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스 본문

투케이2K 유틸파일

55. (TWOK/UTIL) [Ios/Objc] C_Util - string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스

투케이2K 2022. 6. 23. 15:03

[설 명]

프로그램 : Ios / Objective-C

설 명 : C_Util - string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스

 
 

[소스 코드]

import Foundation
import UIKit

@objc class C_Util: NSObject {
    
    
    // MARK: - [클래스 설명]
    /*
    // -----------------------------------------
    1. 프로그램 상 필요한 유틸 파일 모음 클래스
    // -----------------------------------------
    2. extension 관련 정의 클래스
    // -----------------------------------------
    3. getNowDateTime24 : 24 시간 형태 현재 날짜 확인
    // -----------------------------------------
    4. getNowDateTime24Number : 24 시간 형태 현재 날짜 확인 [숫자 형태]
    // -----------------------------------------
    5. showMobileBuildInfo : 모바일 빌드 정보 확인
    // -----------------------------------------
    6. getMobileCode : 모바일 버전 코드 확인 (ex : 1 : Build)
    // -----------------------------------------
    7. getMobileVersion : 모바일 버전 명 확인 (ex : 1.0.0 : Version)
    // -----------------------------------------
    8. getMobilePackageName : 모바일 번들 ID 패키지명 확인 (ex : com.test.app)
    // -----------------------------------------
    9. getMobileSize : 모바일 화면 디바이스 사이즈 구하기 (S / M / L)
    // -----------------------------------------
    10. matchString : 문자열 정규식 수행 메소드
    // -----------------------------------------
    11. hexStringToData : 헥사 문자열 데이터를 바이트 배열 값으로 반환 실시
    // -----------------------------------------
    12. dataToHexString : 바이트 배열 값을 헥사 문자열 데이터로 반환 실시
    // -----------------------------------------
    13. fixStringToDate : 고정 문자열 데이터를 Date 형식으로 반환 실시
    // -----------------------------------------
    14. dateToMilliseconds : 현재 날짜 및 시간을 타임 스탬프 형식 문자열로 반환 실시
    // -----------------------------------------
    15. millisecondsToDate : 타임 스탬프 형식 문자열 데이터를 24 시간 Date 날짜 형식으로 포맷 후 문자열 반환 실시
    // -----------------------------------------
    16. getDateMinus : 타임 스탬프 값 기준 두 날짜 차이 확인 (초, 분, 시간 반환)
    // -----------------------------------------
    17. stringNotNull : 문자열 데이터 null 체크 수행 실시 (널이 아닌 경우 true / 널인 경우 false)
    // -----------------------------------------
    18. stringMultiContains : 문자열 데이터에서 다중 contains 값 포함 확인 (다중 값 포함 시 true / 아닌 경우 false)
    // -----------------------------------------
    19. stringJsonObjectEnable : String 문자열 데이터를 Json Object 형식으로 변경 가능 한지 체크 (변경 가능 시 true / 아닌 경우 false)
    // -----------------------------------------
    20. dic_To_JsonObject_String : 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시
    // -----------------------------------------
    21. jsonObject_To_Dic : jsonObject 형식 문자열 데이터를 딕셔너리로 반환 실시
    // -----------------------------------------
    22. htmlTagRemoveString : html 태그 제거 및 문자열 데이터 반환 실시
    // -----------------------------------------
    23. stringToByte : string 문자열 데이터를 byte (data) 값으로 반환 실시
    // -----------------------------------------
    24. byteToString : byte (data) 데이터를 string 문자열 데이터로 반환 실시
    // -----------------------------------------
    25. charCount : 특정 문자 개수 카운트 반환 실시
    // -----------------------------------------
    26. removeArrayStringOverlap : array string 배열 중복 데이터 제거 실시
    // -----------------------------------------
    27. stringIsNumber : string 문자열 데이터 모두 정수 구성 여부 확인
    // -----------------------------------------
    28. dataToByteString : Data 를 Byte 바이트 값 문자열로 리턴 실시
    // -----------------------------------------
    29. doubleCutLength : Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시
    // -----------------------------------------
    30. arraySubList : subList 사용해 array list 가변 배열 데이터 부분 데이터 반환 실시
    // -----------------------------------------
    31. getNowKorDate24 : 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환
    // -----------------------------------------
    32. arrayDic_To_jsonArrayInJsonObj_String : 배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환
    // -----------------------------------------
    33. jsonArrayInJsonObj_To_arrayDic : JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환
    // -----------------------------------------
    34. arrayIntersect : Array 배열 데이터 교집합 수행 실시
    // -----------------------------------------
    35. stringIsUrlParsing : String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
    // -----------------------------------------
    36. arrayToEncodeString : 배열 데이터에서 한글 데이터 깨지는 것을 막기 위해 배열 전체 데이터 String 으로 인코딩 실시
    // -----------------------------------------
    37. dicToEncodeString : 딕셔너리 데이터에서 한글 데이터 깨지는 것을 막기 위해 딕셔너리 전체 데이터 String 으로 인코딩 실시
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [Objective C 소스 코드에서 호출 방법]
    /*
    // -----------------------------------------
    1. import 선언 실시 : 프로젝트이름-Swift.h 명시 (#import "objectiveProject-Swift.h")
    // -----------------------------------------
    2. String 문자열 널 판단 실시 :
       NSString *strData = @"";
       if ([[C_Util shared] stringNotNullWithStr:strData] == true)
     
       strData = @"twok";
       if ([[C_Util shared] stringNotNullWithStr:strData] == true)
    // -----------------------------------------
    3. 딕셔너리 데이터 Json String 문자열로 반환 :
       NSMutableDictionary *mutableDic = [[NSMutableDictionary alloc] init];
       [mutableDic setObject:@"투케이" forKey:@"name"];
       [mutableDic setObject:@29 forKey:@"age"];
     
       NSString *jsonString = [[C_Util shared] dic_To_JsonObject_StringWith_dicData: mutableDic];
       jsonString.description.UTF8String
    // -----------------------------------------
    4. Json String 문자열 데이터를 딕셔너리로 변환 실시 :
       NSMutableDictionary *dicData = [[C_Util shared] jsonObject_To_DicWithJsonString:jsonString];
       bool nameContains = [dicData objectForKey:@"name"]; // [특정 key 포함]
       NSString *nameData = [dicData objectForKey:@"name"]; // [value 확인]
     
       printf("[dicData :: %s] \n", dicData.description.UTF8String);
       printf("[nameContains :: %d] \n", nameContains);
       printf("[nameData :: %s] \n", nameData.description.UTF8String);
    // -----------------------------------------
    */
    
    
    
    
    
    // MARK: - [클래스 싱글톤 설정 실시]
    @objc static let shared = C_Util()
    




    // MARK: - [24 시간 형태 현재 날짜 확인]
    @objc func getNowDateTime24() -> String {
        
        /*
        // -----------------------------------------
        [getNowDateTime24 메소드 설명]
        // -----------------------------------------
        1. 24 시간 형태 현재 날짜 및 시간 출력 메소드
        // -----------------------------------------
        2. 호출 방법 : C_Util().getNowDateTime24()
        // -----------------------------------------
        */
        
        // [date 객체 설정 수행 실시]
        let nowDate = Date() // 현재의 Date 날짜 및 시간
        let dateFormatter = DateFormatter() // Date 포맷 객체 선언
        dateFormatter.locale = Locale(identifier: "ko") // 한국 지정
        
        
        // [date 포맷 타입 정의]
        // dateFormatter.dateFormat = "yyyy.MM.dd kk:mm:ss E요일" // Date 포맷 타입 지정
        dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss" // Date 포맷 타입 지정
        let date_string = dateFormatter.string(from: nowDate) // 포맷된 형식 문자열로 반환

        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getNowDateTime24() :: 24 시간 형태 현재 날짜 확인]")
        print("-------------------------------")
        print("date_string :: ", date_string)
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return date_string
    }
    
    
    
    
    
    // MARK: - [24 시간 형태 현재 날짜 확인 : 숫자 형태]
    @objc func getNowDateTime24Number() -> String {
        
        /*
        // -----------------------------------------
        [getNowDateTime24Number 메소드 설명]
        // -----------------------------------------
        1. 24 시간 형태 현재 날짜 및 시간 출력 메소드
        // -----------------------------------------
        2. 호출 방법 : C_Util().getNowDateTime24Number()
        // -----------------------------------------
        */
        
        
        // [date 객체 설정 수행 실시]
        let nowDate = Date() // 현재의 Date 날짜 및 시간
        let dateFormatter = DateFormatter() // Date 포맷 객체 선언
        dateFormatter.locale = Locale(identifier: "ko") // 한국 지정
        
        
        // [date 포맷 타입 정의]
        dateFormatter.dateFormat = "yyyyMMddkkmmss" // Date 포맷 타입 지정
        //dateFormatter.dateFormat = "kkmmss" // Date 포맷 타입 지정
        let date_string = dateFormatter.string(from: nowDate) // 포맷된 형식 문자열로 반환
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getNowDateTime24Number() :: 24 시간 형태 현재 날짜 확인]")
        print("-------------------------------")
        print("date_string :: ", date_string)
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return date_string
    }
    
    
    
    
    
    // MARK: - [모바일 빌드 정보 확인]
    @objc func showMobileBuildInfo(){
        
        /*
        // -----------------------------------------
        [showMobileBuildInfo 메소드 설명]
        // -----------------------------------------
        1. 모바일 빌드 정보 확인 메소드
        // -----------------------------------------
        2. 호출 방법 : C_Util().showMobileBuildInfo()
        // -----------------------------------------
        */
        
        // [초기 변수 선언 실시]
        var appName = ""
        var appVersion = ""
        var appBuildVersion = ""
        var appBundleIdentifier = ""
        if let infomation = Bundle.main.infoDictionary {
            if let Name = infomation["CFBundleDisplayName"] as? String {
                appName = Name
            }
            if let Version = infomation["CFBundleShortVersionString"] as? String {
                appVersion = Version
            }
            if let BuildVersion = infomation["CFBundleVersion"] as? String {
                appBuildVersion = BuildVersion
            }
            if let BundleIdentifier = infomation["CFBundleIdentifier"] as? String {
                appBundleIdentifier = BundleIdentifier
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> showMobileBuildInfo() :: 모바일 빌드 정보 확인]")
        print("-------------------------------")
        print("appName :: ", appName)
        print("-------------------------------")
        print("appVersion :: ", appVersion)
        print("-------------------------------")
        print("appBuildVersion :: ", appBuildVersion)
        print("-------------------------------")
        print("appBundleIdentifier :: ", appBundleIdentifier)
        print("====================================")
        print("")
    }
    
    
    
    
    
    // MARK: - [모바일 버전 코드 확인]
    @objc func getMobileCode() -> String {
        
        /*
        // -----------------------------------------
        [getMobileCode 메소드 설명]
        // -----------------------------------------
        1. 모바일 버전 코드 확인 메소드 (ex : 1 : Build)
        // -----------------------------------------
        2. 호출 방법 : C_Util().getMobileCode()
        // -----------------------------------------
        */
        
        // [초기 변수 선언 실시]
        var appBuildVersion = ""
        if let infomation = Bundle.main.infoDictionary {
            if let BuildVersion = infomation["CFBundleVersion"] as? String {
                appBuildVersion = BuildVersion
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getMobileCode() :: 모바일 버전 코드 확인]")
        print("-------------------------------")
        print("code :: ", appBuildVersion)
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return appBuildVersion
    }
    
    
    
    
    
    // MARK: - [모바일 버전명 확인]
    @objc func getMobileVersion() -> String {
        
        /*
        // -----------------------------------------
        [getMobileVersion 메소드 설명]
        // -----------------------------------------
        1. 모바일 버전 명 확인 메소드 (ex : 1.0.0 : Version)
        // -----------------------------------------
        2. 호출 방법 : C_Util().getMobileVersion()
        // -----------------------------------------
        */
        
        // [초기 변수 선언 실시]
        var appVersion = ""
        if let infomation = Bundle.main.infoDictionary {
            if let Version = infomation["CFBundleShortVersionString"] as? String {
                appVersion = Version
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getMobileVersion() :: 모바일 버전 명 확인]")
        print("-------------------------------")
        print("version :: ", appVersion)
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return appVersion
    }
    
    
    
    
    
    // MARK: - [모바일 번들 ID 패키지명 확인]
    @objc func getMobilePackageName() -> String {
        
        /*
        // -----------------------------------------
        [getMobilePackageName 메소드 설명]
        // -----------------------------------------
        1. 모바일 번들 ID 패키지명 확인 (ex : com.test.app)
        // -----------------------------------------
        2. 호출 방법 : C_Util().getMobilePackageName()
        // -----------------------------------------
        */
        
        // [초기 변수 선언 실시]
        var appBundleIdentifier = ""
        if let infomation = Bundle.main.infoDictionary {
            if let BundleIdentifier = infomation["CFBundleIdentifier"] as? String {
                appBundleIdentifier = BundleIdentifier
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getMobilePackageName() :: 모바일 번들 ID 패키지명 확인]")
        print("-------------------------------")
        print("package :: ", appBundleIdentifier)
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return appBundleIdentifier
    }
    
    
    
    
    
    // MARK: - [모바일 화면 크기 구하기]
    @objc func getMobileSize() -> String {
        
        /*
        // -----------------------------------------
        [getMobileSize 메소드 설명]
        // -----------------------------------------
        1. 모바일 화면 크기 구하기
        // -----------------------------------------
        2. 호출 방법 : C_Util().getMobileSize()
        // -----------------------------------------
        3. 리턴 반환 : S / M / L
        // -----------------------------------------
        */
        
        // [리턴 데이터 반환 변수 선언]
        var returnData = ""
        
        // [뷰 전체 논리적 폭 길이 : css 측정 값]
        let _screenLogicalWidth = UIScreen.main.bounds.size.width
        
        // [뷰 전체 논리적 높이 길이 : css 측정 값]
        let _screenLogicalHeight = UIScreen.main.bounds.size.height
        
        // [뷰 스케일 값]
        let _screenScale = UIScreen.main.scale
        
        // [뷰 전체 물리적 폭 길이 : 실제 디바이스 표현 화소]
        let _screenPhysicalWidth = (_screenLogicalWidth * (_screenScale * _screenScale)) / 2
        
        // [뷰 전체 물리적 높이 길이 : 실제 디바이스 표현 화소]
        let _screenPhysicalHeight = (_screenLogicalHeight * (_screenScale * _screenScale)) / 2
        
        // [디바이스 기기 모델 확인 실시]
        let _deviceModel = UIDevice.current.model
        
        // [디바이스 기기 버전 확인 실시]
        let _deviceVersion = UIDevice.current.systemVersion
        
        // [디바이스 기기 이름 확인 실시]
        let _deviceName = UIDevice.current.name
        
        // [디바이스 OS 확인 실시]
        let _deviceOs = UIDevice.current.systemName
        
        // [디바이스 화면 인치 사이즈 구하기]
        let screenBounds = UIScreen.main.bounds
        let screenScale = UIScreen.main.scale
        let screenSize = CGSize(width: screenBounds.size.width * screenScale, height: screenBounds.size.height * screenScale)
        let ppi = screenScale * (UIDevice.current.userInterfaceIdiom == .pad ? 132 : 163)
        let horizontal = screenSize.width / ppi
        let vertical = screenSize.height / ppi
        let diagonal = sqrt(pow(horizontal, 2) + pow(vertical, 2))
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getMobileSize() :: 모바일 화면 크기 확인]")
        print("-------------------------------")
        print("[_deviceModel :: \(_deviceModel)]")
        print("-------------------------------")
        print("[_deviceVersion :: \(_deviceVersion)]")
        print("-------------------------------")
        print("[_deviceName :: \(_deviceName)]")
        print("-------------------------------")
        print("[_deviceOs :: \(_deviceOs)]")
        print("-------------------------------")
        print("[_screenLogicalWidth :: \(_screenLogicalWidth)]")
        print("-------------------------------")
        print("[_screenLogicalHeight :: \(_screenLogicalHeight)]")
        print("-------------------------------")
        print("[_screenScale :: \(_screenScale)]")
        print("-------------------------------")
        print("[_screenPhysicalWidth :: \(_screenPhysicalWidth)]")
        print("-------------------------------")
        print("[_screenPhysicalHeight :: \(_screenPhysicalHeight)]")
        print("-------------------------------")
        print("[diagonal [인치] :: \(diagonal)]")
        print("====================================")
        print("")
        
        // [화면 사이즈 확인 및 디바이스 기기 종류 확인]
        if _screenLogicalWidth == 390 && _screenLogicalHeight == 844 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 13 / iPhone 13 Pro / iPhone 12 / iPhone 12 Pro]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 375 && _screenLogicalHeight == 812 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 13 mini / iPhone 12 mini / iPhone 11 Pro / iPhone XS / iPhone X]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 428 && _screenLogicalHeight == 926 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 13 Pro Max / iPhone 12 Pro Max]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 375 && _screenLogicalHeight == 667 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone SE 2nd gen / iPhone 8 / iPhone 7 / iPhone 6s / iPhone 6]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 414 && _screenLogicalHeight == 896 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 11 Pro Max / iPhone 11 / iPhone XR / iPhone XS Max]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 414 && _screenLogicalHeight == 736 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 8 Plus]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 476 && _screenLogicalHeight == 847 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 7 Plus / iPhone 6s Plus / iPhone 6 Plus]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 320 && _screenLogicalHeight == 568 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone SE 1st gen / iPhone 5C / iPhone 5S / iPhone 5 / iPod touch 6th gen / iPod touch 5th gen]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 320 && _screenLogicalHeight == 480 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPhone 4S / iPhone 4 / iPhone 3GS / iPhone 3G / iPhone 1st gen / iPod touch 4th gen]")
            print("-------------------------------")
            print("[Device :: iPod touch 3rd gen / iPod touch 2nd gen / iPod touch 1st gen]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 744 && _screenLogicalHeight == 1133 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Mini (6th gen)]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 810 && _screenLogicalHeight == 1080 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad 9th gen / iPad 8th gen / iPad 7th gen]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 1024 && _screenLogicalHeight == 1366 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Pro (5th gen 12.9) / iPad Pro (4th gen 12.9) / iPad Pro (3rd gen 12.9) / iPad Pro (2nd gen 12.9)]")
            print("-------------------------------")
            print("[Device :: iPad Pro (1st gen 12.9)]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 834 && _screenLogicalHeight == 1194 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Pro (5th gen 11) / iPad Pro (4th gen 11) / iPad Pro (3rd gen 11)]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 820 && _screenLogicalHeight == 1180 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Air (4th gen)]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 768 && _screenLogicalHeight == 1024 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Mini (5th gen) / iPad 6th gen / iPad 5th gen / iPad Pro (1st gen 9.7)]")
            print("-------------------------------")
            print("[Device :: iPad mini 4 / iPad Air 2 / iPad mini 3 / iPad mini 2 / iPad Air]")
            print("-------------------------------")
            print("[Device :: iPad 4th gen / iPad mini / iPad 3rd gen / iPad 2 / iPad 1st gen]")
            print("====================================")
            print("")
        }
        else if _screenLogicalWidth == 834 && _screenLogicalHeight == 1112 {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: iPad Air (3rd gen) / iPad Pro (2nd gen 10.5)]")
            print("====================================")
            print("")
        }
        else {
            print("")
            print("====================================")
            print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
            print("-------------------------------")
            print("[Device :: ELSE]")
            print("====================================")
            print("")
        }
        
        // [화면 인치 사이즈 기준으로 디바이스 크기 리턴 데이터 반환 실시]
        if diagonal <= 3 {
            /*
            [디바이스 종류]
            1. 시계
            */
            returnData = "S"
        }
        else if diagonal <= 4 {
            /*
            [디바이스 종류]
            1. 아이폰 3G , 아이폰 4 , 아이폰 4S
            2. 아이폰 5 , 아이폰 5S , 아이폰 5c
            3. 아이폰 SE (2016)
            */
            returnData = "S"
        }
        else if diagonal <= 5 {
            /*
            [디바이스 종류]
            1. 아이폰 6 , 아이폰 6s , 아이폰 7
            2. 아이폰 8 , 아이폰 SE2 (2020)
            */
            returnData = "M"
        }
        else if diagonal <= 6 {
            /*
            [디바이스 종류]
            1. 아이폰 6 Plus , 아이폰 6s Plus , 아이폰 7 Plus
            2. 아이폰 8 Plus , 아이폰 X , 아이폰 XS
            3. 아이폰 11 Pro , 아이폰 12 mini , 아이폰 13 mini
            */
            returnData = "M"
        }
        else if diagonal <= 7 {
            /*
            [디바이스 종류]
            1. 아이폰 XS Max , 아이폰 XR , 아이폰 11
            2. 아이폰 11 Pro Max , 아이폰 12 , 아이폰 12 Pro
            3. 아이폰 12 Pro Max , 아이폰 13 , 아이폰 13 pro
            4. 아이폰 13 Pro Max
            */
            returnData = "L"
        }
        else {
            returnData = "L"
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
        print("-------------------------------")
        print("[디바이스 화면 사이즈 :: \(returnData)]")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return returnData
    }
    
    
    
    
    
    // MARK: - [정규식 수행 메소드]
    @objc func matchString(string: String) -> String {
        
        /*
        // -----------------------------------------
        [matchString 메소드 설명]
        // -----------------------------------------
        1. 정규식 수행 메소드
        // -----------------------------------------
        2. 호출 방법 : C_Util().matchString(string: "hello @@ TWOK !! 투케이 222")
        // -----------------------------------------
        3. 리턴 반환 : 정규식을 수행한 문자열 데이터 반환
        // -----------------------------------------
        */
        
        // [결과를 반환할 변수 선언 실시]
        var returnData = ""
        
        // [사전 인풋 데이터 널 체크 수행 실시]
        if string != nil && string.count>0 && string != "" { // [인풋 값이 널이 아닌 경우]
            
            let strArr = Array(string) // [문자열 한글자씩 확인을 위해 배열에 담는다]
            
            let pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]$" // [정규식 : 한글, 영어, 숫자만 허용 (공백, 특수문자 제거)]
            //let pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9\\s]$" // [정규식 : 한글, 영어, 숫자, 공백만 허용 (특수문자 제거)]
            
            // [문자열 길이가 한개 이상인 경우만 패턴 검사 수행]
            var resultString = ""
            if strArr.count > 0 {
                if let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) {
                    var index = 0
                    while index < strArr.count { // [string 문자 하나 마다 개별 정규식 체크]
                        let checkString = regex.matches(in: String(strArr[index]), options: [], range: NSRange(location: 0, length: 1))
                        if checkString.count == 0 {
                            index += 1 // [정규식 패턴 외의 문자가 포함된 경우]
                        }
                        else { // 정규식 포함 패턴의 문자
                            resultString += String(strArr[index]) // [리턴 문자열에 추가]
                            index += 1
                        }
                    }
                }
                
                // [리턴 변수에 삽입 실시]
                returnData = resultString
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> matchString() :: 문자열 정규식 수행 실시]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환]
        return returnData
    }
    
    
    
    
    
    // MARK: - [hex string to byte array : 헥사 문자열을 바이트 배열로 반환]
    @objc func hexStringToData(string: String) -> Data {
        
        /*
        // -----------------------------------------
        [hexStringToData 메소드 설명]
        // -----------------------------------------
        1. 헥사 문자열 데이터를 바이트 배열로 반환 수행
        // -----------------------------------------
        2. 호출 방법 : C_Util().hexStringToData(string: "01 23 45 67 89 ab cd ef")
        // -----------------------------------------
        3. 리턴 반환 : 헥사 문자열 데이터를 바이트 배열로 반환
        // -----------------------------------------
        */
        
        // [사전 인풋 데이터 널 체크 수행 실시]
        var _string = ""
        var data: Data = Data()
        if (string != nil && string.count>0 && string != ""){
            
            // [0x , 0X , 공백 데이터 제거 실시]
            _string = string.replacingOccurrences(of: "0x", with: "")
            _string = string.replacingOccurrences(of: "0X", with: "")
            _string = string.replacingOccurrences(of: " ", with: "")
            
            // [문자열 한글자씩 분리해서 배열에 담은 후 바이트 값으로 변환]
            let stringArray = Array(_string)
            for i in stride(from: 0, to: _string.count, by: 2) { // [문자열 2개씩 지정]
                let pair: String = String(stringArray[i]) + String(stringArray[i+1])
                if let byteNum = UInt8(pair, radix: 16) {
                    let byte = Data([byteNum])
                    data.append(byte)
                }
                else{
                    fatalError()
                }
            }
        }
        
        // [바이트 배열에 담긴 값 확인 실시]
        var byteStr = ""
        if data != nil && data.count > 0 {
            byteStr = "["
            for i in stride(from: 0, through: data.count-1, by: 1) {
                
                byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
                
                if i != data.count-1 { // [배열 형태로 찍기 위함]
                    byteStr += ", "
                }
            }
            byteStr += "]"
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> hexStringToData() :: 헥사 데이터를 바이트 배열 값으로 반환 실시]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("format :: \(_string)")
        print("-------------------------------")
        print("return :: \(byteStr)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return data
    }
    
    
    
    
    
    // MARK: - [byte array to hex string : 바이트 배열 값을 헥사 문자열 데이터로 반환]
    @objc func dataToHexString(data: Data) -> String {
        
        /*
        // -----------------------------------------
        [dataToHexString 메소드 설명]
        // -----------------------------------------
        1. 바이트 배열을 헥사 문자열 데이터로 반환 실시
        // -----------------------------------------
        2. 호출 방법 :
           var dataValue : Data = Data()
         
           dataValue.append(1)
           dataValue.append(35)
           dataValue.append(69)
           dataValue.append(103)
           dataValue.append(137)
           dataValue.append(171)
           dataValue.append(205)
           dataValue.append(239)
         
           C_Util().dataToHexString(data: dataValue)
        // -----------------------------------------
        3. 리턴 반환 : 바이트 배열 데이터를 헥사 문자열 데이터로 반환
        // -----------------------------------------
        */
        
        // [리턴 데이터 변수 선언]
        var returnData = ""
        var byteStr = ""
        
        // [사전 인풋 데이터 널 체크 수행 실시]
        if data != nil && data.count>0 {
            
            // [바이트 배열 값 확인 실시]
            byteStr = "["
            for i in stride(from: 0, through: data.count-1, by: 1) {
                
                byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
                
                if i != data.count-1 { // [배열 형태로 찍기 위함]
                    byteStr += ", "
                }
            }
            byteStr += "]"
            
            // [헥사 문자열 데이터로 변환 실시]
            returnData = data.map { String(format: "%02hhx ", $0) }.joined()
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> dataToHexString() :: 바이트 배열 값을 헥사 문자열 데이터로 반환 실시]")
        print("-------------------------------")
        print("input :: \(byteStr)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [고정 날짜 DATE 날짜 반환 메소드 : 2000-01-01 00:00:00]
    @objc func fixStringToDate(_str : String) -> Date {
        
        /*
        // -----------------------------------------
        [fixStringToDate 메소드 설명]
        // -----------------------------------------
        1. 특정 날짜 문자열 데이터를 Date 형식으로 반환 수행 실시
        // -----------------------------------------
        2. 호출 방법 : C_Util().fixStringToDate(_str: "2000-01-01 00:00:00")
        // -----------------------------------------
        3. 리턴 반환 : 고정 날짜 문자열 데이터를 Date 형식으로 반환 실시
        // -----------------------------------------
        */
        
        // -----------------------------------------
        
        // MARK: [_str 인풋 데이터 형식]
        // [24시간 형태] : yyyy-MM-dd kk:mm:ss
        // [고정 시간 사용] : 2000-01-01 00:00:00
        
        // -----------------------------------------
        
        // [Date 포맷 객체]
        let dateFormatter = DateFormatter()
        
        // -----------------------------------------
        
        // [Date 포맷 형식]
        dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss"
        //dateFormatter.dateFormat = "yyyy-MM-dd" // 포맷 형식
        
        // -----------------------------------------
        
        // [인풋으로 들어온 날짜 형식 string 을 Date 값으로 변환 실시]
        let convertDate:Date = dateFormatter.date(from: _str)!
        
        // -----------------------------------------
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> fixStringToDate() :: 특정 날짜 및 시간 고정 Date 형식으로 반환 실시]")
        print("-------------------------------")
        print("input :: \(_str)")
        print("-------------------------------")
        print("return :: \(convertDate)")
        print("====================================")
        print("")
        
        // -----------------------------------------
        
        // [리턴 데이터 반환 실시]
        return convertDate
    }
    
    
    
    
    
    // MARK: - [현재 날짜 및 시간을 타임 스탬프 형식 반환 : milliseconds]
    @objc func dateToMilliseconds() -> String {
        
        /*
        // -----------------------------------------
        [dateToMilliseconds 메소드 설명]
        // -----------------------------------------
        1. 현재 날짜 및 시간을 타임 스탬프 형식 반환 : milliseconds
        // -----------------------------------------
        2. 호출 방법 : C_Util().dateToMilliseconds()
        // -----------------------------------------
        3. 리턴 반환 : 타임 스탬프 데이터를 String 형식으로 반환 실시 : [13자리] 1648349189806
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        // [리턴 데이터에 값 삽입 실시]
        returnData = String(describing: Int64((Date().timeIntervalSince1970 * 1000.0).rounded()))
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> dateToMilliseconds() :: 현재 날짜 및 시간을 타임 스탬프 형식 반환 실시]")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [타임 스탬프 형식 문자열 데이터를 날짜로 포맷해서 반환 실시]
    @objc func millisecondsToDate(str: String) -> String {
        
        /*
        // -----------------------------------------
        [millisecondsToDate 메소드 설명]
        // -----------------------------------------
        1. 타임 스탬프 형식 문자열 데이터를 24 시간 날짜로 포맷해서 반환 실시
        // -----------------------------------------
        2. 호출 방법 : C_Util().millisecondsToDate(str: "1648349189806")
        // -----------------------------------------
        3. 리턴 반환 : 24 시간 형태 Date 문자열 데이터
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        // [사전 인풋값 체크 수행 실시]
        if str != nil && str.count>0 && str != "" {
            
            // [Date 포맷 객체]
            let dateFormatter = DateFormatter()
            dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss"
            
            // [타임 스탬프 값을 Date 로 변환]
            let convertDate:Date = Date(timeIntervalSince1970: TimeInterval(Int64(str) ?? 0) / 1000)
            
            // [리턴 결과에 삽입 실시]
            returnData = String(describing: dateFormatter.string(from: convertDate))
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> millisecondsToDate() :: 타임 스탬프 형식 문자열 데이터를 날짜 형식 문자열 데이터 반환]")
        print("-------------------------------")
        print("input :: \(str)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [두 날짜 차이 계산 수행 실시 : 타임 스탬프 값 기준]
    @objc func getDateMinus(bigDate:String, smallDate:String) -> Int{
        
        /*
        // -----------------------------------------
        [getDateMinus 메소드 설명]
        // -----------------------------------------
        1. 날짜 형식 : date 형식을 milli seconds 형식으로 받는다 (ex: 1644466392686)
        // -----------------------------------------
        2. bigDate (큰 날짜) - smallDate (작은 날짜) 연산 수행
        // -----------------------------------------
        3. 리턴 형식 : 초 , 분 , 시간 단위 선택
        // -----------------------------------------
        4. 호출 예시 :
          - C_Util().getDateMinus(bigDate:"1644466392686", smallDate:"1644466392686") // [동일]
          - C_Util().getDateMinus(bigDate:"1644466392686", smallDate:"1644466169826") // [다름]
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 선언]
        var returnData = 0
        
        
        // [인풋으로 들어온 값에 공백이 있는 경우 제거 실시]
        var _bigDate = String(describing: bigDate ?? "")
        var _smallDate = String(describing: smallDate ?? "")
        
        _bigDate = _bigDate.replacingOccurrences(of: " ", with: "")
        _smallDate = _smallDate.replacingOccurrences(of: " ", with: "")
        
        
        // [인풋으로 들어온 값이 널이 아닌지 확인 실시]
        if _bigDate != nil && _bigDate.count>0 && _bigDate != ""
            && _smallDate != nil && _smallDate.count>0 && _smallDate != "" {
            
            
            // [인풋으로 들어온 값이 모두 숫자로 구성되어 있는지 확인 실시]
            var _bigDate_NotNumber = false
            var _smallDate_NotNumber = false
            
            for _big_char in _bigDate {
                if _big_char.isNumber == false { // 정수 값이 아닌 경우
                    _bigDate_NotNumber = true
                }
            }
            for _small_char in _smallDate {
                if _small_char.isNumber == false { // 정수 값이 아닌 경우
                    _smallDate_NotNumber = true
                }
            }
            
            
            // [로직 처리 수행 실시]
            if _bigDate_NotNumber == false && _smallDate_NotNumber == false { // 모두 정수로 구성된 경우
                
                let _big_int64 = Int64(_bigDate) ?? 0 // 형변환
                let _small_int64 = Int64(_smallDate) ?? 0 // 형변환

                
                let b_date = Date(timeIntervalSince1970: TimeInterval(Int64(_big_int64) ?? 0) / 1000) // 정식 날짜로 출력
                let s_date = Date(timeIntervalSince1970: TimeInterval(Int64(_small_int64) ?? 0) / 1000) // 정식 날짜로 출력
                
                
                let minus = (_big_int64 - _small_int64) // 밀리세컨드 빼기 수행
                let seconds = minus / 1000 // 초 단위 기준 차이
                let minute = seconds / 60 // 분 단위 기준 차이
                let hour = minute / 60 // 시간 단위 기준 차이


                print("")
                print("====================================")
                print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 결과 확인]")
                print("-------------------------------")
                print("_bigDate [인풋 날짜_1] : ", _bigDate)
                print("_smallDate [인풋 날짜_2] : ", _smallDate)
                print("-------------------------------")
                print("b_date [인풋 날짜_1] : ", b_date)
                print("s_date [인풋 날짜_2] : ", s_date)
                print("-------------------------------")
                print("minus [빼기 수행] :: ", minus)
                print("seconds (초) 차이 :: ", seconds)
                print("minute (분) 차이 :: ", minute)
                print("hour (시간) 차이 :: ", hour)
                print("====================================")
                print("")
                
                
                // [원하는 타입 선택 후 리턴 결과 반환 실시]
                returnData = Int(minute) // [분]
                //returnData = Int(seconds) // [초]
                return returnData
            }
            else { // 문자가 포함된 경우
                print("")
                print("====================================")
                print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 에러]")
                print("-------------------------------")
                print("_bigDate [인풋 날짜_1] : ", _bigDate)
                print("-------------------------------")
                print("_smallDate [인풋 날짜_2] : ", _smallDate)
                print("-------------------------------")
                print("error [문자 에러] : ", "비정상 데이터")
                print("====================================")
                print("")
                
                // [결과 리턴 수행 실시]
                return returnData
            }
        }
        else {
            print("")
            print("====================================")
            print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 에러]")
            print("-------------------------------")
            print("_bigDate [인풋 날짜_1] : ", _bigDate)
            print("-------------------------------")
            print("_smallDate [인풋 날짜_2] : ", _smallDate)
            print("-------------------------------")
            print("error [널 에러] : ", "비정상 데이터")
            print("====================================")
            print("")
            
            // [결과 리턴 수행 실시]
            return returnData
        }
    }
    
    
    
    
    
    // MARK: - [string 문자열 데이터 널 체크 수행 실시]
    @objc func stringNotNull(str: String) -> Bool {
        
        /*
        // -----------------------------------------
        [stringNotNull 메소드 설명]
        // -----------------------------------------
        1. string 문자열 데이터 널 체크 수행 실시
        // -----------------------------------------
        2. 호출 방법 : C_Util().stringNotNull(str: "hello투케이")
        // -----------------------------------------
        3. 리턴 반환 : 널이 아닌 경우 true / 널인 경우 false
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = false
        
        // [인풋 데이터 널 체크 수행 실시]
        if str != nil
            && str.count>0
            && str != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && str.isEmpty == false {
            
            // [리턴 결과 데이터 삽입]
            returnData = true
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringNotNull() :: string 문자열 데이터 널 체크 수행 실시]")
        print("-------------------------------")
        print("input :: \(str)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [String 문자열 데이터 다중 contains 포함 여부 확인 실시]
    @objc func stringMultiContains(str: String, array:Array<String>) -> Bool {
        
        /*
        // -----------------------------------------
        [stringMultiContains 메소드 설명]
        // -----------------------------------------
        1. String 문자열 데이터 다중 contains 포함 여부 확인 실시
        // -----------------------------------------
        2. 호출 방법 : C_Util().stringMultiContains(str: "hello투케이TWOK", array: ["투케이", "TWOK"])
        // -----------------------------------------
        3. 리턴 반환 : 다중 값을 포함하는 경우 true / 포함하지 않는 경우 false
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = true
        
        // [인풋 데이터 널 체크 수행 실시]
        if str != nil
            && str.count>0
            && str != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && str.isEmpty == false
            
            && array != nil
            && array.count>0
            && array.isEmpty == false {
            
            // [for 문을 돌면서 다중 값 포함 확인 실시]
            for i in stride(from: 0, through: array.count-1, by: 1) {
                if str.contains(array[i]) == true {
                    // [특정 값을 포함하는 경우]
                }
                else {
                    // [특정 값을 포함하지 않는 경우]
                    returnData = false
                }
            }
        }
        else {
            // [리턴 데이터 값 삽입]
            returnData = false
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringMultiContains() :: string 문자열 데이터 다중 contains 포함 여부 확인 실시]")
        print("-------------------------------")
        print("input [str] :: \(str)")
        print("-------------------------------")
        print("input [array] :: \(array)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [String 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]
    @objc func stringJsonObjectEnable(str: String) -> Bool {
        
        /*
        // -----------------------------------------
        [stringJsonObjectEnable 메소드 설명]
        // -----------------------------------------
        1. String 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시
        // -----------------------------------------
        2. 호출 방법 :
         let jsonData = "{\n" +
                         "  \"name\" : \"투케이\",\n" +
                         "  \"age\" : 29,\n" +
                         "  \"color\" : [\"red\", \"yellow\"]\n" +
                         "}";
         
         C_Util().stringJsonObjectEnable(str: jsonData)
        // -----------------------------------------
        3. 리턴 반환 : Json Object 형식으로 변경 가능한 경우 true / 아닌 경우 false
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = false
        
        // [인풋 데이터 널 체크 수행 실시]
        if str != nil
            && str.count>0
            && str != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && str.isEmpty == false {
            
            // [딕셔너리 객체 생성 실시 및 json 데이터 받음]
            var jsonObj : Dictionary<String, Any> = [String : Any]()
            do {
                // [딕셔너리에 데이터 저장 실시]
                jsonObj = try JSONSerialization.jsonObject(with: Data(str.utf8), options: []) as! [String:Any]
                
                // [리턴 결과 삽입 실시]
                returnData = true
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> stringJsonObjectEnable() :: string 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]")
                print("-------------------------------")
                print("catch :: ", error.localizedDescription)
                print("====================================")
                print("")
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringJsonObjectEnable() :: string 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]")
        print("-------------------------------")
        print("input :: \(str)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }





    // MARK: - [딕셔너리 데이터를 Json Object 형식 문자열로 변환 수행 실시]
    @objc func dic_To_JsonObject_String(_dicData:Dictionary<String, Any>) -> String {
        
        /*
        // -----------------------------------------
        [dic_To_JsonObject_String 메소드 설명]
        // -----------------------------------------
        1. 딕셔너리 데이터를 Json Object 형식 문자열로 변환 수행 실시
        // -----------------------------------------
        2. 호출 방법 :
           let dic_1 : Dictionary<String, Any> = ["name":"투케이", "age":29] // [딕셔너리]

           C_Util().dic_To_JsonObject_String(_dicData: dic_1)
        // -----------------------------------------
        3. 리턴 반환 : Json Object 형식 문자열
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        // [인풋 데이터 널 체크 수행 실시]
        if _dicData != nil
            && _dicData.count>0
            && _dicData.isEmpty == false {
            
            // [딕셔너리 데이터를 json 으로 변경 실시]
            do {
                let jsonCreate = try JSONSerialization.data(withJSONObject: _dicData, options: .prettyPrinted)
                
                // [json 데이터를 리턴 변수에 삽입 실시]
                returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> dic_To_JsonObject_String() :: 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시]")
                print("-------------------------------")
                print("catch :: ", error.localizedDescription)
                print("====================================")
                print("")
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> dic_To_JsonObject_String() :: 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시]")
        print("-------------------------------")
        print("input [_dicData] :: \(_dicData.description)")
        print("-------------------------------")
        print("return [Json String] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }





    // MARK: - [Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]
    @objc func jsonObject_To_Dic(jsonString: String) -> Dictionary<String, Any> {
        
        /*
        // -----------------------------------------
        [jsonObject_To_Dic 메소드 설명]
        // -----------------------------------------
        1. Json Object 형식 문자열을 딕셔너리로 변환 수행 실시
        // -----------------------------------------
        2. 호출 방법 :
         let jsonData = "{\n" +
                         "  \"name\" : \"투케이\",\n" +
                         "  \"age\" : 29,\n" +
                         "  \"color\" : [\"red\", \"yellow\"]\n" +
                         "}";
         
         let dicData : Dictionary<String, Any> = C_Util().jsonObject_To_Dic(jsonString: jsonData)
        // -----------------------------------------
        3. 리턴 반환 : 딕셔너리 데이터 반환
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData : Dictionary<String, Any> = [String : Any]()
        
        // [인풋 데이터 널 체크 수행 실시]
        if jsonString != nil
            && jsonString.count>0
            && jsonString != ""
            && jsonString.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && jsonString.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && jsonString.isEmpty == false {
            
            // [딕셔너리 데이터 변환 수행 실시]
            do {
                let dicCreate = try JSONSerialization.jsonObject(with: Data(jsonString.utf8), options: []) as! [String:Any]
                
                // [리턴 변수에 삽입 실시]
                returnData = dicCreate
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> jsonObject_To_Dic() :: Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]")
                print("-------------------------------")
                print("catch :: ", error.localizedDescription)
                print("====================================")
                print("")
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> jsonObject_To_Dic() :: Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]")
        print("-------------------------------")
        print("input [jsonString] :: \(jsonString)")
        print("-------------------------------")
        print("return [Dictionary] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    


    // MARK: - [html 태그 제거 및 리턴 문자열 반환 메소드]
    @objc func htmlTagRemoveString(_data:String) -> String {
        
        /*
        // -----------------------------------------
        [htmlTagRemoveString 메소드 설명]
        // -----------------------------------------
        1. html 태그 제거 및 리턴 문자열 반환 메소드
        // -----------------------------------------
        2. 호출 방법 :
         let data = "<p>test url</p><p><a href=&quot;https://www.naver.com&quot;>https://www.naver.com</a></p><p>&amp;nbsp;</p><p>입니다</p><p>&amp;nbsp;</p>";
         
         C_Util().htmlTagRemoveString(_data: data)
        // -----------------------------------------
        3. 리턴 반환 : html 태그 제거 문자열 데이터
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        // [인풋 데이터 널 체크 수행 실시]
        if _data != nil
            && _data.count>0
            && _data != ""
            && _data.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && _data.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && _data.isEmpty == false {
            
            guard let encodedData = _data.data(using: .utf8)
            else {
                print("")
                print("====================================")
                print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
                print("-------------------------------")
                print("error [1] :: data 변환 에러")
                print("====================================")
                print("")
                return returnData
            }
            
            // [html 태그를 제거 하기 위해 옵션 설정 실시]
            let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
                .documentType: NSAttributedString.DocumentType.html,
                .characterEncoding: String.Encoding.utf8.rawValue
            ]
            
            do {
                // [html 태그 1차 제거 실시]
                let attributed = try NSAttributedString(data: encodedData,
                                                        options: options,
                                                        documentAttributes: nil)
                returnData = attributed.string
                
                
                // [html 태그 2차 제거 실시]
                var checkCount = 0;
                for i in stride(from: 0, through: returnData.count-1, by: 1) {
                    let charIndex = returnData.index(returnData.startIndex, offsetBy: i)
                    
                    if returnData[charIndex] == "&" {
                        checkCount = checkCount + 1 // [카운트 증가 실시]
                    }
                }
                if checkCount > 0 {
                    for k in stride(from: 0, through: checkCount-1, by: 1) {
                        guard let encodedData = returnData.data(using: .utf8)
                        else {
                            print("")
                            print("====================================")
                            print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
                            print("-------------------------------")
                            print("error [2] :: data 변환 에러")
                            print("====================================")
                            print("")
                            return returnData
                        }
                        do {
                            let attributed = try NSAttributedString(data: encodedData,
                                                                    options: options,
                                                                    documentAttributes: nil)
                            returnData = attributed.string
                        }
                        catch {
                            print("")
                            print("====================================")
                            print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
                            print("-------------------------------")
                            print("catch [2] :: \(error.localizedDescription)")
                            print("====================================")
                            print("")
                        }
                    }
                }
                
                
                // [문자열 연속 공백 제거 실시]
                var str_array = Array(returnData)
                var remove_array : Array<Int> = []
                
                var nullCheck = 0
                for j in stride(from: 0, through: str_array.count-1, by: 1) {
                    if j != str_array.count-1 {
                        var first = str_array[j].description.replacingOccurrences(of: " ", with: "")
                        first = first.trimmingCharacters(in: .whitespacesAndNewlines)
                        
                        var second = str_array[j+1].description.replacingOccurrences(of: " ", with: "")
                        second = second.trimmingCharacters(in: .whitespacesAndNewlines)
                        
                        if first.count == 0 && second.count == 0 {
                            remove_array.append(j)
                        }
                    }
                }
                if remove_array != nil && remove_array.count>0 && remove_array.isEmpty == false {
                    for k in stride(from: 0, through: remove_array.count-1, by: 1){
                        str_array.remove(at: remove_array[k]-k) // [한개씩 배열데이터를 삭제할 때 마다 인덱스 값을 맞추기 위함]
                    }
                }
                returnData = ""
                for v in stride(from: 0, through: str_array.count-1, by: 1){
                    returnData = returnData + String(describing: str_array[v])
                }
                
                
                // [문자열 양쪽 끝 공백 제거 실시]
                returnData = returnData.trimmingCharacters(in: .whitespacesAndNewlines)
            }
            catch {
                print("")
                print("====================================")
                print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
                print("-------------------------------")
                print("catch [1] :: \(error.localizedDescription)")
                print("====================================")
                print("")
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 실시]")
        print("-------------------------------")
        print("input :: \(_data)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    


    // MARK: - [String to Byte (Data) 변환 수행 메소드]
    @objc func stringToByte(string: String) -> Data {
        
        /*
        // -----------------------------------------
        [stringToByte 메소드 설명]
        // -----------------------------------------
        1. string 문자열 데이터를 byte (data) 값으로 반환
        // -----------------------------------------
        2. 호출 방법 : C_Util().stringToByte(string: "hello")
        // -----------------------------------------
        3. 리턴 반환 : Data 값 반환 실시
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData : Data = Data()
        var byteStr = ""
        
        // [인풋 데이터 널 체크 수행 실시]
        if string != nil
            && string.count>0
            && string != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && string.isEmpty == false {
            
            // [리턴 변수에 삽입 실시]
            returnData = string.data(using: .utf8)!
            
            // [바이트 배열 값 확인 실시]
            byteStr = "["
            for i in stride(from: 0, through: returnData.count-1, by: 1) {
                
                byteStr += String(describing: returnData[i]) // [개별 바이트 값을 삽입]
                
                if i != returnData.count-1 { // [배열 형태로 찍기 위함]
                    byteStr += ", "
                }
            }
            byteStr += "]"
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringToByte() :: string 문자열 데이터를 byte (data) 값으로 반환 실시]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("return [length] :: \(returnData)")
        print("-------------------------------")
        print("return [data] :: \(byteStr)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [Byte (Data) To String 변환 수행 메소드]
    @objc func byteToString(data: Data) -> String {
        
        /*
        // -----------------------------------------
        [byteToString 메소드 설명]
        // -----------------------------------------
        1. Byte (Data) 데이터를 String 값으로 반환
        // -----------------------------------------
        2. 호출 방법 :
         var dataValue : Data = Data()
       
         dataValue.append(104)
         dataValue.append(101)
         dataValue.append(108)
         dataValue.append(108)
         dataValue.append(111)
         
         C_Util().byteToString(data: dataValue)
        // -----------------------------------------
        3. 리턴 반환 : String 값 반환 실시
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        var byteStr = ""
        
        // [인풋 데이터 널 체크 수행 실시]
        if data != nil
            && data.count>0
            && data.isEmpty == false {
            
            // [리턴 변수에 삽입 실시]
            returnData = String(decoding: data, as: UTF8.self)
            
            // [바이트 배열 값 확인 실시]
            byteStr = "["
            for i in stride(from: 0, through: data.count-1, by: 1) {
                
                byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
                
                if i != returnData.count-1 { // [배열 형태로 찍기 위함]
                    byteStr += ", "
                }
            }
            byteStr += "]"
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> byteToString() :: Byte (Data) 데이터를 String 값으로 반환 실시]")
        print("-------------------------------")
        print("input [length] :: \(data)")
        print("-------------------------------")
        print("input [byte] :: \(byteStr)")
        print("-------------------------------")
        print("return [string] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    


    // MARK: - [특정 문자 개수 값 반환 메소드]
    @objc func charCount(string: String, char: String) -> Int {
        
        /*
        // -----------------------------------------
        [charCount 메소드 설명]
        // -----------------------------------------
        1. 특정 문자 개수 값 반환
        // -----------------------------------------
        2. 호출 방법 : C_Util().charCount(string: "hello,Twok,투케이", char: ",")
        // -----------------------------------------
        3. 리턴 반환 : 특정 문자 개수 int 값 반환
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = 0
        
        // [인풋 데이터 널 체크 수행 실시]
        if string != nil
            && string.count>0
            && string != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && string.isEmpty == false
            
            && char != nil
            && char.count == 1
            && char != ""
            && char.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && char.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && char.isEmpty == false {
            
            let array = Array(string)
            // [for 문을 돌면서 특정 문자 포함 확인]
            for i in stride(from: 0, through: array.count-1, by: 1) {
                
                if String(describing: array[i]) == String(describing: char) {
                    
                    // [리턴 변수에 삽입 실시]
                    returnData = returnData + 1
                }
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> charCount() :: 특정 문자 개수 값 반환 실시]")
        print("-------------------------------")
        print("input [string] :: \(string)")
        print("-------------------------------")
        print("input [char] :: \(char)")
        print("-------------------------------")
        print("return [count] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }




    // MARK: - [배열 중복 데이터 제거 메소드]
    @objc func removeArrayStringOverlap(array: Array<String>) -> Array<String> {
        
        /*
        // -----------------------------------------
        [removeArrayStringOverlap 메소드 설명]
        // -----------------------------------------
        1. 배열 중복 데이터 제거 메소드
        // -----------------------------------------
        2. 호출 방법 :
         var strArray : Array<String> = []
         strArray.append("하나")
         strArray.append("둘")
         strArray.append("하나")
         
         C_Util().removeArrayStringOverlap(array: strArray)
        // -----------------------------------------
        3. 리턴 반환 : 중복 제거된 배열 데이터 반환 실시
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnArray : Array<String> = []

        
        // [인풋 데이터 널 체크 수행 실시]
        if array != nil
            && array.count>0
            && array.isEmpty == false {
            
            do {
                // [Set 을 사용해 Array 배열 중복 데이터 제거 실시]
                let arraySet : Set<String> = Set(array)
                
                // [Set to Array 변환 수행 실시]
                returnArray = Array(arraySet)
            }
            catch {
                print("")
                print("====================================")
                print("[C_Util >> removeArrayStringOverlap() :: Array<String> 베열 중복 데이터 제거 실시]")
                print("-------------------------------")
                print("error :: \(error.localizedDescription)")
                print("====================================")
                print("")
            }
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> removeArrayStringOverlap() :: Array<String> 베열 중복 데이터 제거 실시]")
        print("-------------------------------")
        print("input :: \(array.description)")
        print("-------------------------------")
        print("return :: \(returnArray.description)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnArray
    }
    
    


    // MARK: - [String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시]
    @objc func stringIsNumber(string: String) -> Bool {
        
        /*
        // -----------------------------------------
        [stringIsNumber 메소드 설명]
        // -----------------------------------------
        1. String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시
        // -----------------------------------------
        2. 호출 방법 :
         C_Util().stringIsNumber(string: "12345")
         C_Util().stringIsNumber(string: "-12345")
         C_Util().stringIsNumber(string: "123hello")
        // -----------------------------------------
        3. 리턴 반환 : string 문자열 데이터가 모두 정수값으로 된 경우 true / 아니면 false
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = true
        
        // [인풋 데이터 널 체크 수행 실시]
        if string != nil
            && string.count>0
            && string != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && string.isEmpty == false {
            
            // [isNumber 사용해 정수값 체크 실시]
            var count = 0
            for _char in string {
                if _char.isNumber == true { // [정수 값 인 경우]
                }
                else { // [정수 값이 아닌 경우]
                    if count == 0 && _char == "-" || _char == "+" { // [처음 문자가 - , + 인 경우는 통과 실시]
                    }
                    else {
                        // [리턴 변수에 삽입 실시]
                        returnData = false
                    }
                }
                count = count + 1
            }
        }
        else {
            // [리턴 변수에 삽입 실시]
            returnData = false
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringIsNumber() :: string 문자열 데이터 모두 정수 값 구성 여부 확인 실시]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }





    // MARK: - [Data 를 Byte 바이트 값 문자열로 리턴 실시]
    @objc func dataToByteString(data: Data) -> String {
        
        /*
        // -----------------------------------------
        [dataToByteString 메소드 설명]
        // -----------------------------------------
        1. Data 를 Byte 바이트 값 문자열로 리턴 실시
        // -----------------------------------------
        2. 호출 방법 :
         var dataValue : Data = Data()
       
         dataValue.append(104)
         dataValue.append(101)
         dataValue.append(108)
         dataValue.append(108)
         dataValue.append(111)
         
         C_Util().dataToByteString(data: dataValue)
        // -----------------------------------------
        3. 리턴 반환 : [104, 101, 108, 108, 111] 배열 형태 문자열
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        // [인풋 데이터 널 체크 수행 실시]
        if data != nil
            && data.count>0
            && data.isEmpty == false {
            
            // [바이트 배열 값 확인 실시]
            returnData = "["
            for i in stride(from: 0, through: data.count-1, by: 1) {
                
                returnData += String(describing: data[i]) // [개별 바이트 값을 삽입]
                
                if i != data.count-1 { // [배열 형태로 찍기 위함]
                    returnData += ", "
                }
            }
            returnData += "]"
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> dataToByteString() :: Data 를 Byte 바이트 값 문자열로 리턴 실시]")
        print("-------------------------------")
        print("input [length] :: \(data)")
        print("-------------------------------")
        print("return [string] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    


    // MARK: - [Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]
    @objc func doubleCutLength(double: Double, length: Int) -> String {
        
        /*
        // -----------------------------------------
        [doubleCutLength 메소드 설명]
        // -----------------------------------------
        1. Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시
        // -----------------------------------------
        2. 호출 방법 :
         C_Util().doubleCutLength(double: 123.4567, length: 2)
         C_Util().doubleCutLength(double: -123.4567, length: 2)
        // -----------------------------------------
        3. 리턴 반환 : 123.45 : 소수점 특정 자릿수 기준 제한 문자열 데이터
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if double != nil
            
            && length != nil
            && length >= 0 {
            
            
            // [인풋으로 들어온 double 데이터 확인 실시]
            var strData = String(describing: double)
            var strArray = Array(strData)
            
            
            // [마이너스 값 체크 여부 플래스 정의]
            var checkMinus = false
            
            
            // [마이너스 데이터 값 체크 실시]
            if strArray[0] == "-" {
                checkMinus = true // [마이너스 시작 플래스 설정]
            }
            
            
            // [마이너스로 시작하는 경우]
            if checkMinus == true {
                strArray.remove(at: 0)
            }
            
            
            // [배열 데이터 값을 string 변환 실시]
            strData = ""
            for j in stride(from: 0, through: strArray.count-1, by: 1) {
                strData = strData + strArray[j].description
            }
            
            
            // [for 문을 돌면서 . 점 개수 카운트 및 위치 확인 실시]
            var dotCount = 0
            var dotLocation = 0
            var dotLength = 0
            for i in stride(from: 0, through: strArray.count-1, by: 1) {
                if strArray[i] == "." {
                    dotCount = dotCount + 1 // [. 점 개수 카운트 증가]
                    dotLocation = i // [점 위치값 지정 실시]
                    dotLength = strArray.count - (i + 1) // [소수점 이하 자리수 카운트 개수 확인]
                }
            }
            /*
            print("")
            print("====================================")
            print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
            print("-------------------------------")
            print("checkMinus [마이너스 값 여부] :: \(checkMinus)")
            print("-------------------------------")
            print("dotCount [점 개수] :: \(dotCount)")
            print("-------------------------------")
            print("dotLocation [점 위치] :: \(dotLocation)")
            print("-------------------------------")
            print("formatStrData [포맷 데이터] :: \(strData)")
            print("====================================")
            print("")
            // */
            
            
            // [점 개수 값을 확인해서 포맷 수행 실시]
            if dotCount == 1 {
                // [위치 값 재조절 실시]
                dotLocation = dotLocation + length
                
                
                // [NumberFomatter 을 사용해서 특정 자릿수 기준으로 포맷 실시]
                let numberFomatter = NumberFormatter() // NumberFormatter 객체 생성
                numberFomatter.roundingMode = .floor // 특정 자릿수 기준으로 버림 설정
                numberFomatter.maximumSignificantDigits = dotLocation  // 자르기를 원하는 자릿수 지정 실시
                
                
                // [리턴 결과 변수에 삽입 실시]
                returnData = numberFomatter.string(for: Double(strData) ?? 0)!
                if checkMinus == true { // 마이너스 기호인 경우 최종 부호 추가
                    returnData = "-" + returnData
                }
                
                
                // [원본 데이터보다 더 많은 수 자리를 지정한 경우 0 으로 채움]
                /*
                print("")
                print("====================================")
                print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
                print("-------------------------------")
                print("소수점 이하 개수 :: \(dotLength)")
                print("-------------------------------")
                print("자르려는 소수점 자릿수 :: \(length)")
                print("====================================")
                print("")
                // */
                if length > dotLength {
                    let zeroCount = length - dotLength
                    for k in stride(from: 0, through: zeroCount-1, by: 1){
                        returnData = returnData + "0"
                    }
                }
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
        print("-------------------------------")
        print("input [double] :: \(double)")
        print("-------------------------------")
        print("input [length] :: \(length)")
        print("-------------------------------")
        print("return [string] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    



    // MARK: - [인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시]
    @objc func arraySubList(list: Array<Any>, startIdx: Int, endIdx: Int) -> Array<Any> {
        
        /*
        // -----------------------------------------
        [arraySubList 메소드 설명]
        // -----------------------------------------
        1. 인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시
        // -----------------------------------------
        2. 호출 방법 :
         // [배열 선언]
         var anyArray : Array<Any> = []


         // [배열에 데이터 삽입 실시]
         anyArray.append("하나")
         anyArray.append("둘")
         anyArray.append("셋")
         anyArray.append("넷")
         anyArray.append("다섯")

         
         // [유틸 파일 호출]
         C_Util().arraySubList(list: anyArray, startIdx: 0, endIdx: anyArray.count-1) // [배열 전체 데이터]
         C_Util().arraySubList(list: anyArray, startIdx: 1, endIdx: 3) // [배열 부분 데이터 : 1, 2, 3 인덱스 데이터 출력]
        // -----------------------------------------
        3. 리턴 반환 : [하나, 둘, 셋, 넷, 다섯] / [둘, 셋, 넷]
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData : Array<Any> = []
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if list != nil && list.count>0 && list.isEmpty == false
            && startIdx >= 0 && startIdx <= endIdx
            && endIdx >= 0 && endIdx >= startIdx {
            
            // [부분 데이터 범위 지정]
            let subList = list[startIdx ..< (endIdx+1)]
            
            /*
            print("")
            print("====================================")
            print("[C_Util >> arraySubList() :: Array 부분 배열 데이터 반환 실시]")
            print("-------------------------------")
            print("input [list] :: \(list.description)")
            print("input [startIdx] :: \(startIdx)")
            print("input [endIdx] :: \(endIdx)")
            print("-------------------------------")
            print("subList [length] :: \(subList.count)")
            print("subList [list] :: \(subList)")
            print("====================================")
            print("")
            // */
            
            // [리턴 변수에 삽입]
            for i in stride(from: startIdx, through: endIdx, by: 1) {
                returnData.append(subList[i])
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> arraySubList() :: Array 부분 배열 데이터 반환 실시]")
        print("-------------------------------")
        print("input [list] :: \(list.description)")
        print("input [startIdx] :: \(startIdx)")
        print("input [endIdx] :: \(endIdx)")
        print("-------------------------------")
        print("return [length] :: \(returnData.count)")
        print("return [list] :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    
    @objc func getNowKorDate24() -> String {
        
        /*
        // -----------------------------------------
        [getNowKorDate24 메소드 설명]
        // -----------------------------------------
        1. 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환
        // -----------------------------------------
        2. 호출 방법 : C_Util().getNowKorDate24()
        // -----------------------------------------
        3. 리턴 반환 : 20220413155123
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [한국 날짜 및 시간 데이터 반환 실시]
        let date = Date()
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyyMMddHHmmss" // 24 시간 대 설정
        formatter.locale = Locale(identifier: "ko_kr") // 한국 시간 지정
        formatter.timeZone = TimeZone(abbreviation: "KST") // 한국 시간대 지정
        
        
        // [리턴 변수에 삽입 실시]
        returnData = formatter.string(from: date) // string 형태
        
        
        // [리턴 데이터가 모두 숫자로 구성되었는지 확인 실시]
        var notNumber = false
        for _char in returnData {
            if _char.isNumber == false { // 정수 값이 아닌 경우
                notNumber = true
            }
        }
        if notNumber == true {
            print("")
            print("====================================")
            print("[C_Util >> getNowKorDate24() :: 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환]")
            print("-------------------------------")
            print("returnData :: \(returnData)")
            print("-------------------------------")
            print("notNumber :: \(notNumber)")
            print("-------------------------------")
            print("error :: 모두 숫자로 구성되어있지 않음")
            print("====================================")
            print("")
            
            // [리턴 데이터 초기화]
            returnData = ""
        }

        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> getNowKorDate24() :: 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환]")
        print("-------------------------------")
        print("returnData [데이터] :: \(returnData)")
        print("-------------------------------")
        print("returnData [길이] :: \(returnData.count)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }




    // MARK: - [배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환 실시]
    @objc func arrayDic_To_jsonArrayInJsonObj_String(list: Array<Any>) -> String {
        
        /*
        // -----------------------------------------
        [arrayDic_To_jsonArrayInJsonObj_String 메소드 설명]
        // -----------------------------------------
        1. 배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환 실시
        // -----------------------------------------
        2. 호출 방법 :
         // [배열 선언]
         var anyArray : Array<Any> = []

         
         // [딕셔너리 선언]
         var dicData : Dictionary<String, Any> = [String : Any]()
         dicData["name"] = "TWOK"
         dicData["age"] = 29
         
         
         // [배열에 딕셔너리 객체 삽입 실시]
         anyArray.append(dicData)

         
         // [유틸 파일 호출 실시]
         C_Util().arrayDic_To_jsonArrayInJsonObj_String(list: anyArray)
        // -----------------------------------------
        3. 리턴 반환 :
         return :: [
           {
             "age" : 29,
             "name" : "TWOK"
           }
         ]
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if list != nil && list.count>0 && list.isEmpty == false {
            do {
                // [json 데이터 생성 실시]
                let jsonCreate = try JSONSerialization.data(withJSONObject: list, options: .prettyPrinted)
                returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> arrayDic_To_jsonArrayInJsonObj_String() :: [배열 + 딕셔너리] >> [JsonArray + JsonObject] 형태 String 문자열 반환]")
                print("-------------------------------")
                print("catch :: \(error.localizedDescription)")
                print("====================================")
                print("")
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> arrayDic_To_jsonArrayInJsonObj_String() :: [배열 + 딕셔너리] >> [JsonArray + JsonObject] 형태 String 문자열 반환]")
        print("-------------------------------")
        print("input :: \(list.description)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return returnData
    }




    // MARK: - [JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환 실시]
    @objc func jsonArrayInJsonObj_To_arrayDic(string: String) -> Array<Dictionary<String, Any>> {
        
        /*
        // -----------------------------------------
        [jsonArrayInJsonObj_To_arrayDic 메소드 설명]
        // -----------------------------------------
        1. JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환 실시
        // -----------------------------------------
        2. 호출 방법 :
         // [jsonArray 형식 문자열 선언 실시]
         let jsonArrayString = "[\n" +
         "  {\n" +
         "    \"age\" : 29,\n" +
         "    \"name\" : \"TWOK\"\n" +
         "  }\n" +
         "]"
         
         
         // [유틸 파일 호출 실시]
         C_Util().jsonArrayInJsonObj_To_arrayDic(string: jsonArrayString)
        // -----------------------------------------
        3. 리턴 반환 :
         return :: [["name": TWOK, "age": 29]]
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData : Array<Dictionary<String, Any>> = []
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if string != nil
            && string.count>0
            && string != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
            && string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
            && string.isEmpty == false {
            
            do {
                // [jsonArray - jsonObject 형식 데이터를 Array 와 Dictionary 사용해서 받음]
                returnData = try JSONSerialization.jsonObject(with: Data(string.utf8), options: []) as! Array<Dictionary<String, Any>>
            }
            catch {
                print("")
                print("====================================")
                print("[C_Util >> jsonArrayInJsonObj_To_arrayDic() :: [JsonArray + JsonObject] 형태 String 데이터를 [배열 + 딕셔너리] 데이터로 반환]")
                print("-------------------------------")
                print("catch :: \(error.localizedDescription)")
                print("====================================")
                print("")
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> jsonArrayInJsonObj_To_arrayDic() :: [JsonArray + JsonObject] 형태 String 데이터를 [배열 + 딕셔너리] 데이터로 반환]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("return :: \(returnData.description)")
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    



    // MARK: - [Array 배열 데이터 교집합 수행 실시]
    @objc func arrayIntersect(array_1:Array<Any>, array_2:Array<Any>) -> Array<Any> {
        
        /*
        // -----------------------------------------
        [arrayIntersect 메소드 설명]
        // -----------------------------------------
        1. Array 배열 데이터 교집합 수행 실시
        // -----------------------------------------
        2. 호출 방법 :
         var anyArray_1 : Array<Any> = []
         anyArray_1.append("하나")
         anyArray_1.append("둘")
         anyArray_1.append("셋")
         
         var anyArray_2 : Array<Any> = []
         anyArray_2.append("둘")
         anyArray_2.append("셋")
         anyArray_2.append("넷")
         
         C_Util().arrayIntersect(array_1: anyArray_1, array_2: anyArray_2)
        // -----------------------------------------
        3. 리턴 반환 :
         return :: ["둘", "셋"]
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData : Array<Any> = []
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if array_1 != nil
            && array_1.count>0
            && array_1.isEmpty == false
            
            && array_2 != nil
            && array_2.count>0
            && array_2.isEmpty == false {
            
            ///*
            // [for 문을 사용해서 일치하는 데이터 확인 실시]
            for i in stride(from: 0, through: array_1.count-1, by: 1) {
                for j in stride(from: 0, through: array_2.count-1, by: 1) {
                    
                    if String(describing: array_1[i]) == String(describing: array_2[j]) {
                        
                        // [리턴 배열에 삽입 실시]
                        returnData.append(array_1[i])
                    }
                }
            }
            // */
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> arrayIntersect() :: Array 배열 데이터 교집합 수행 실시]")
        print("-------------------------------")
        print("input [array_1] :: \(array_1.description)")
        print("-------------------------------")
        print("input [array_2] :: \(array_2.description)")
        print("-------------------------------")
        print("return :: \(returnData.description)")
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    


    // MARK: - [String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]
    @objc func stringIsUrlParsing(string: String) -> Bool {
        
        /*
        // -----------------------------------------
        [stringIsUrlParsing 메소드 설명]
        // -----------------------------------------
        1. String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
        // -----------------------------------------
        2. 호출 방법 :
         C_Util().stringIsUrlParsing(string: "https://www.naver.com") // [변경 가능]
         C_Util().stringIsUrlParsing(string: "http://www.test.app?key=1234") // [변경 가능]
         
         C_Util().stringIsUrlParsing(string: "http://www.test.app?key=yHfsatdJyL\r\n") // [변경 불가 : 엔터 값]
        // -----------------------------------------
        3. 리턴 반환 : URL 형식으로 변환 가능한 경우 true / 아니면 false 리턴
        // -----------------------------------------
        */
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = false
        
        // [인풋 데이터 널 체크 수행 실시]
        if string != nil
            && string.count>0
            && string != ""
            && string != "null"
            && string.isEmpty == false {
            
            // [URL 타입 선언 확인 실시]
            do {
                if let url = URL(string: string) { // [웹뷰 로드 주소 URL 체크]
                    
                    let request = URLRequest(url: url) // [URLRequest 로 정상 변환 가능한지 확인]
                    
                    // [리턴 변수에 삽입 실시]
                    returnData = true
                }
                else {
                    // [리턴 변수에 삽입 실시]
                    returnData = false
                }
            }
            catch {
                print("")
                print("====================================")
                print("[C_Util >> stringIsUrlParsing() :: String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]")
                print("-------------------------------")
                print("catch :: \(error.localizedDescription)")
                print("====================================")
                print("")
                
                // [리턴 변수에 삽입 실시]
                returnData = false
            }
        }
        else {
            // [리턴 변수에 삽입 실시]
            returnData = false
        }
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> stringIsUrlParsing() :: String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]")
        print("-------------------------------")
        print("input :: \(string)")
        print("-------------------------------")
        print("return :: \(returnData)")
        print("====================================")
        print("")
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
    
    
    
    // MARK: - [배열 데이터에서 한글 데이터 깨지는 것을 막기 위해 배열 전체 데이터 String 으로 인코딩 실시]
    @objc func arrayToEncodeString(array:Array<Any>) -> String {
        
        /*
        // -----------------------------------------
        [arrayToEncodeString 메소드 설명]
        // -----------------------------------------
        1. 배열 데이터에서 한글 데이터 깨지는 것을 막기 위해 배열 전체 데이터 String 으로 인코딩 실시
        // -----------------------------------------
        2. 호출 방법 :
         NSArray *array = [[NSArray alloc] initWithObjects:@"투케이", @29, nil];
         
         NSString *arrayData = [[C_Util shared] arrayToEncodeStringWithArray:array];
         
         printf("[array data :: %s] \n", arrayData.description.UTF8String);
        // -----------------------------------------
        3. 리턴 반환 :
         [
           "투케이",
           29
         ]
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if array != nil
            && array.count>0
            && array.isEmpty == false {
            
            do {
                let jsonCreate = try JSONSerialization.data(withJSONObject: array, options: .prettyPrinted)
                
                // [json 데이터를 리턴 변수에 삽입 실시]
                returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> arrayToEncodeString() :: 배열 전체 데이터 String 으로 인코딩 실시]")
                print("-------------------------------")
                print("catch :: ", error.localizedDescription)
                print("====================================")
                print("")
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> arrayToEncodeString() :: 배열 전체 데이터 String 으로 인코딩 실시]")
        print("-------------------------------")
        print("input :: \(array.description)")
        print("-------------------------------")
        print("return :: \(returnData.description)")
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return returnData
    }






    // MARK: - [딕셔너리 데이터에서 한글 데이터 깨지는 것을 막기 위해 딕셔너리 전체 데이터 String 으로 인코딩 실시]
    @objc func dicToEncodeString(dic:Dictionary<String, Any>) -> String {
        
        /*
        // -----------------------------------------
        [dicToEncodeString 메소드 설명]
        // -----------------------------------------
        1. 딕셔너리 데이터에서 한글 데이터 깨지는 것을 막기 위해 딕셔너리 전체 데이터 String 으로 인코딩 실시
        // -----------------------------------------
        2. 호출 방법 :
         NSDictionary *dic = @{@"name" : @"투케이", @"age" : @29};
         
         NSString *dicData = [[C_Util shared] dicToEncodeStringWithDic:dic];
         
         printf("[dic data :: %s] \n", dicData.description.UTF8String);
        // -----------------------------------------
        3. 리턴 반환 :
         {
           "age" : 29,
           "name" : "투케이"
         }
        // -----------------------------------------
        */
        
        
        // [초기 리턴 데이터 변수 선언 실시]
        var returnData = ""
        
        
        // [인풋 데이터 널 체크 수행 실시]
        if dic != nil
            && dic.count>0
            && dic.isEmpty == false {
            
            do {
                let jsonCreate = try JSONSerialization.data(withJSONObject: dic, options: .prettyPrinted)
                
                // [json 데이터를 리턴 변수에 삽입 실시]
                returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
            } catch {
                print("")
                print("====================================")
                print("[C_Util >> dicToEncodeString() :: 딕셔너리 전체 데이터 String 으로 인코딩 실시]")
                print("-------------------------------")
                print("catch :: ", error.localizedDescription)
                print("====================================")
                print("")
            }
        }
        
        
        // [로그 출력 실시]
        print("")
        print("====================================")
        print("[C_Util >> dicToEncodeString() :: 딕셔너리 전체 데이터 String 으로 인코딩 실시]")
        print("-------------------------------")
        print("input :: \(dic.description)")
        print("-------------------------------")
        print("return :: \(returnData.description)")
        print("====================================")
        print("")
        
        
        // [리턴 데이터 반환 실시]
        return returnData
    }
    
    
} // [클래스 종료]

 

반응형
Comments