menu → window → preferences → Content Types → Text > XML
Default encoding 값을 UTL-8 로 설정후 Update & Apply and Close

 


menu → window → preferences → Content Types → Text > Java Properties File

Default encoding 값을 UTL-8 로 설정후 Update & Apply and Close

 

 

'잡동사니' 카테고리의 다른 글

객체지향프로그래밍  (0) 2021.07.08
프로세스, 스레드 비교  (0) 2021.07.08
appstore 심사 리젝  (0) 2021.03.17
앱스토어 등록시 유용한 사이트  (0) 2021.03.16
개인정보처리방침  (0) 2021.03.16

객체지향프로그래밍 (OOP)

  • 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 갖는 객체를 만들고 그 객체들간의 유기적인 상호 작용을 통해 로직을 구성하는 프로그래밍 방법

객체지향 장점

  • 코드 재사용 용이
    • 남이 만든 클래스를 가져와서 이용할수 있고 상속을 통해 확장해서 사용할 수 있음
  • 유지보수가 쉬움
    • 절차지향 프로그래밍에서는 코드를 수정할떄 일일이 찾아 수정 해야하는 반면 객체지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버변수 혹은 메서드로 있기 떄문에 해당 부분만 수정하면됨
  • 대형 프로젝트에 적합
    • 클래스 단위로 모듈화시켜서 개발할 수 있음으로 대형 프로젝트 처럼 여러명, 여러 회사에서 개발시 업무 분담이 쉽다.

객체지향 단점

  • 처리속도가 상대적으로 느림

    • 객체가 많으면 용량이 커질수 있음
    • 설계시 많은 시간과 노력이 필요
  • 클래스

    • 어떤 문제를 해역ㄹ 하기 위한 데이터를 만들기위해 추상화를 거쳐 집단에 속하는 속성과 행위를 변수와 메서드로 정의한것
  • 인스턴스(객체)

    • 클래스에서 정의한것을 토대로 실제 메모리상에 할당된 것

프로세스 개념

  • 메모리에 올라와 실행되고 있는 프로그램의 인스턴스

  • 운영체제로 부터 시스템 자원을 할당받는 작업단위

  • 기본적으로 프로세스당 최소 1개의 스레드(메인 스레드)를 갖고 있음

  • 한 프로세스에서 다른 프로세스의 변수 OR 자료구조 접근 불가
    (다른 프로세스의 자원에 접근 하려면 프로세스간의 통신 IPC사용)

  • 참고 IPC (Inter Process Communication) ?

    • 파이프, 소켓 통신

프로세스 구성

Cdoe : 실행 명령을 포함하는 코드들

Data : Static 변수 혹은 Global 변수

Heap : 동적 메모리 영역

Stack : 지역변수, 매개변수, 반환 값 등 .. 일시적인 데이터

스레드 개념

  • 프로세스 내에서 실행되는 여러흐름 단위

  • 프로세스가 할당받은 자원을 이용하는 실행단위

  • 스레드는 프로세스 내에서 Stack만 따로 할당 받고 Code, Data, Heap 영역은 공유

멀티프로세스

  • 하나의 응용프로그램을 여러개의 프로세스로 구성, 각 프로세스가 하나의 작업을 처리 하도록 함

  • 장점

    • 여러개의 자식 프로세스 중 하나에 문제가발생하면 그 자식프로세스가 죽는것 이상으로 다른 영향 확산 없음
  • 단점

    • Context Switching 에서의 오버해드
      Context Switching 과정에서 캐쉬메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 오버헤드 발생
  • 참고 Context Switching란?

    • CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 Context Switching라 한다.
      구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이 전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.

멀티스레드

  • 하나의 응용프로그램을 여러 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리 하도록 하는 것

  • 장점

    • 시스템 자원 소모 감소
      • 프로세스 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리 할 수 있음
  • 스레드사이의 작업량이 작아 Contet Switching이 빠르다
  • 간단한 통신 방법으로 프로그램 응답시간 단축
    • 스레드는 프로세스 내의 Stack 영역을 제외하는 모든 메모리를 공유 함으로
  • 단점
    • 디버깅 까다로움
  • 하나의 스레드 문제 발생시 전체 프로세스 영향받음
  • 멀티 스레드의 경우 자원공유 문제 발생 (동기화 문제)

멀티 프로세스대신 멀티 스레드 사용 이유?

  • 여러개의 프로그램을 실행하는 것보다 하나의 프로그램 안에서 여러가지 작업을 해결 함으로

Muti-Core

  • Concurrency (동시성)

    • 하나의 코어에서 하나이상의 프로세스가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는것
  • Parallelism (병렬처리)

    • 둘이상의 코어에서 동시에 하나이상의 프로세스가 한꺼번에 진행되는것

xcode 주석처리에 관하여 간략히 정리

 

// TODO: - 해야할일

 

// MARK: - 여러 줄 주석

 

    /**

        함수요약!

     */

'swift > 잡다함' 카테고리의 다른 글

[loveAlarm] 로컬라이징 default 언어 설정  (0) 2021.06.24
filePrivate, private 차이  (0) 2021.06.24
Struct VS Class  (0) 2021.06.16
extension, protocol, Higher_Order_Func  (0) 2021.06.16
기본 클로저 사용  (0) 2021.06.07

로컬라이징으로 정의된 언어는 영어, 한국어, 일본어, 스페인어 총 4가지다.

코드로 처리하는게 아닌 프로젝트 내에서 default 언어를 설정하는 방법을 계속 찾아봤다

 

 

위 value를  직접 변경해 보기도 하고

 

 

프로젝트 파일을 에디터로 열어서 변경도 했었다

 

제 3언어로 설정하면 직전에 설정한 언어로 표기가 되는 문제가 발생한다.

위 증상을 확인해보니 IOS는 현재 폰에 설정된 언어가 앱이 지원하는 언어가 아닐경우에 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다.

 

결국엔 프로젝트내에서 설정 할 수 없어, 코드로 처리하기로 함

 

 

import Foundation

extension String {
    
    var localized: String {
        return NSLocalizedString(self, tableName: "Localizable", value: self, comment: "")
    }
}

protocol Localizable {
    var localized: String { get }
}

protocol XIBLocalizable {
    var xibLocKey: String? { get set }
}

extension UILabel: XIBLocalizable {
    @IBInspectable var xibLocKey: String? {
        get { return nil }
        set(key) {
            text = key?.localized
        }
    }
}

extension UIButton: XIBLocalizable {
    @IBInspectable var xibLocKey: String? {
        get { return nil }
        set(key) {
            setTitle(key?.localized, for: .normal)
        }
   }
}

extension UINavigationItem: XIBLocalizable {
    @IBInspectable var xibLocKey: String? {
        get { return nil }
        set(key) {
            title = key?.localized
        }
   }
}

 

 

기본 구성 방식은

스토리보드에 위와같이 설정해서 로컬라이징 하는 방식으로 구현 되어있다.

 

    func localizableBundleSet() -> Bundle {
        
        var language = UserDefaults.standard.array(forKey: "AppleLanguages")?.first as! String // 초기에 "ko-KR" , "en-KR" 등으로 저장되어있음
                
        if language.hasPrefix("en") { language = SupportedLanguage.en.rawValue }
        else if language.hasPrefix("ko") { language = SupportedLanguage.ko.rawValue }
        else if language.hasPrefix("ja") { language = SupportedLanguage.ja.rawValue }
        else if language.hasPrefix("zh") { language = SupportedLanguage.zh_CN.rawValue }
        else if language.hasPrefix("es") { language = SupportedLanguage.es.rawValue }
        else { language = SupportedLanguage.ko.rawValue
            /**
                정의되지 않은 언어들은 한국어로 로컬라이징 한다.
                navigation barItem이 선호하는언어의 상단 언어를 따라가는것을 확인
                setAppleLanguageTo()를 통하여 AppleLanguages 순서를 변경 해주었으나 앱이 재구동 시켜야지 적용 되는것을 확인, 주석처리
             */
//            setAppleLanguageTo(lang: "ko-US")
        }
        
        
        let path = Bundle.main.path(forResource: language, ofType: "lproj")
        let bundle = Bundle(path: path!)!
        
        return bundle
    }

 

앱구동시 Appdelegate에 선택된 언어로 기준으로 분기시켜

위와 같이 정의된 언어 외의 언어일 경우 참조하는 번들을 직접 정해주도록 구현 하였다.

 

extension String {
    
    var localized: String {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let bundle = appDelegate.bundle else {
            print("localizable target bundle nil!!")
            return ""
        }
        return bundle.localizedString(forKey: self, value: self, table: "Localizable")
        //return NSLocalizedString(self, tableName: "Localizable", value: self, comment: "")
    }
}

 

Appdelegate의 설정된 bundle에서 직접 로컬라징 되도록 구현 하였다.

 

위와같이 구현하였을때 잘 구현 되었으나, 문제가 발생하였는데

Navigation barItem 은 선호하는 언어의 상단에 있는 지원되는 언어로 표기 되는 것이었다.  (ex : Back )

 

    func setAppleLanguageTo(lang: String) {
        // Get the current list
        var languages = UserDefaults.standard.stringArray(forKey: "AppleLanguages") ?? []
        // Get all locales using the specified language
        let matching = languages.filter { $0.hasPrefix(lang) }
        if matching.count > 0 {
            // Remove those entries from the list
            languages.removeAll { $0 == lang }
            // Add them back at the start of the list
            languages.insert(contentsOf: matching, at: 0)
        } else {
            // It wasn't found in the list so add it at the top
            languages.insert(lang, at: 0)
        }
        UserDefaults.standard.set(languages, forKey: "AppleLanguages")
    }

 

위와같이 AppleLanguages의 순서를 변경 해주었는데 앱을 재구동해야 적용 되는 문제가 있었다...

 

일단 순서를 변경해 주는 부분은 주석처리하였고 Navigation barItem의 문제는 수정하지 않아도 된다고 하여 변경하지 않았다.

 

 

 

참고 링크

https://gonslab.tistory.com/61

 

iOS Swift 앱 안끄고 언어 변경 ( 앱 내 언어 설정 )

안녕하세요 Gons 입니다. 오늘은 앱을 종료하지 않고 언어변경을 해보겠습니다. 먼저 다국어 설정이 완료된 상태여야합니다. 다국어 설정이 안되신 분들은 이전 포스팅을 확인해주세요. 다국어

gonslab.tistory.com

 

https://stackoverflow.com/questions/58153765/swift-how-to-get-ios-device-current-language

 

Swift - how to get ios device current language

My device running iOS 12 and has English language as its primary language and Hebrew as it's secondary language. Now I'm opening my application with English as it's Base localization. In the

stackoverflow.com

 

'swift > 잡다함' 카테고리의 다른 글

Xcode Todo, Mark, Summary  (0) 2021.06.30
filePrivate, private 차이  (0) 2021.06.24
Struct VS Class  (0) 2021.06.16
extension, protocol, Higher_Order_Func  (0) 2021.06.16
기본 클로저 사용  (0) 2021.06.07

fileprivate

fileprivate의 이름을 보면 어떻게 접근을 제한할지 알 수 있는데요, 말 그대로 동일한 소스 파일에서만 접근이 가능하다는 말입니다. 즉 쉽게 말하면 해당 클래스가 정의된 소스 코드에서는 fileprivate로 선언된 프로퍼티에 접근할 수 있다는 말이 됩니다.

위와 같이 같은 소스 파일에서는 접근이 되지만 다른 소스파일에서 인스턴스를 생성하면 fileprivate 프로퍼티에는 접근할 수 없습니다.

private

private은 가장 접근이 제한된 수준을 말합니다. private로 선언한 변수를 포함하는 클래스나 해당 클래스의 익스텐션에서만 접근이 가능합니다.

'swift > 잡다함' 카테고리의 다른 글

Xcode Todo, Mark, Summary  (0) 2021.06.30
[loveAlarm] 로컬라이징 default 언어 설정  (0) 2021.06.24
Struct VS Class  (0) 2021.06.16
extension, protocol, Higher_Order_Func  (0) 2021.06.16
기본 클로저 사용  (0) 2021.06.07

+ Recent posts