소스코드를 공개해 누구나 특별한 제한 없이 그 코드를 볼 수 있도록 한 소스코드
iOS 개발 생태계만 하더라도 정말 많은 오픈소스가 존재합니다. 네트워킹 라이브러리인 Alamofire 부터 이미지 다운로드를 관리해주는 Kingfisher 까지 어렵지 않게 많은 애플리케이션에서 사용되는 오픈소스를 접할 수 있습니다. 해당 기능을 구현하는 시간을 절약함은 물론 수 많은 개발자들에게 검증받은 질 좋은 기능을 자신의 애플리케이션에 담을 수 있는 것입니다. 오픈소스 라이선스 종류에 따라 다르지만 보통 누구나 자유롭게 사용할 수 있고 라이브러리 개선에도 참여할 수 있습니다
애플리케이션 기능을 개발하기 위해 외부 라이브러리를 사용할 때 프로젝트와 해당 라이브러리의 상관관계를 용이하게 관리해주는 도구가 의존성 관리도구 입니다. 내부 모듈을 분리하여 관리할 때도 사용할 수 있습니다.
Java에는 Maven, Javascript에는 Yarn 혹은 NPM, Python에는 pyenv 등 언어별로 의존성 관리도구는 매우 다양합니다. 환경마다 다양한 의존성 관리도구가 있듯이 코코아(Cocoa) 및 코코아터치(Cocoa Touch) 애플리케이션 개발 환경에서는 코코아팟(Cocoapods), 카르타고(Carthage), 스위프트 패키지 매니저(Swift Package Manager)가 있습니다.
의존성 관리도구를 사용하는 것이 필수는 아닙니다. 하지만 사용하지 않을 경우 그 만큼 불필요한 공수가 발생할 수 있습니다. 예를 들어, 외부 라이브러리를 직접 프로젝트에 적절히 포팅하여 삽입하는 작업 같은것 말이죠. 여기까지는 문제가 없을지 몰라도 해당 라이브러리에 대한 업데이트가 생겨 버전이 올라간다면 라이브러리를 교체해줘야 하는 경우가 발생할 것입니다. 일일히 기존 라이브러리를 삭제하고 새로 삽입시켜야 하는 일이 생기게 되겠죠. 이 때 발생하는 휴먼 에러(사실상 제일 큰 문제…인 인간…) 또한 무시할 수 없을 것입니다. 하지만 이런 작업들이 명령어 한 줄 혹은 클릭 몇 번으로 해결 된다면 시간이 매우 절약되고 안정성 또한 보장될 것입니다.
→ 동적 라이브러리 : 완성된 프로그램을 실행할 때 포함시키는 동적 라이브러리
→ 정적 라이브러리 : 프로그램을 컴파일하는 과정에서 포함시키는 오브젝트 파일들의 모임
pod outdated
명령어로 쉽게 새로운 버전이 있는지 체크할 수 있다.pod install
or update
)하는데 오랜 시간이 걸린다.carthage outdated
명령어로 쉽게 새로운 버전이 있는지 체크할 수 있다.carthage update
를 실행할때만 한 번 프레임워크를 빌드하므로 코코아팟에 비해 프로젝트 빌드 속도가 빠르다. 👍Swift 3
이상)Getting to Know Swift Package Manager - WWDC 2018 - Videos - Apple Developer
접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공 할 수 있습니다.
객체지향 프로그래밍 패러다임에서 중요한 캡슐화와 은닉화를 구현하는 이유는 외부에서 보거나 접근하면 안 되는 코드가 있기 때문입니다. 불필요한 접근으로 의도치 않은 결과를 초래 하거나 꼭 필요한 부분만 제공해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용합니다. 프로그래머에게 우리가 의도한 대로 코드를 작성하도록 유도할 수 있습니다.
스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계되었습니다.
모듈(Module)은 배포할 코드의 묶음 단위입니다. 통상 하나의 프레임워크(Framework)나 라이브러리(Library) 또는 애플리케이션(Application)이 모듈 단위가 될 수 있습니다. 스위프트에서는 import
키워드를 사용해 불러옵니다.
소스파일은 하나의 스위프트 소스 코드 파일을 의미합니다. 자바나 Objective-C와 같은 기존 의 프로그래밍 언어에서는 통상 파일 하나에 타입을 하나만 정의합니다. 스위프트에서도 보통 파일 하나에 타입 하나만 정의하지만, 때로는 소스파일 하나에 여러 타입(여러 개의 클래스나 구조체, 열거형 등)이나 함수 등 많은 것을 정의하거나 구현할 수도 있습니다.
public
키워드로 접근수준이 지정된 요소는 어디서든 쓰일 수 있습니다. 자신이 구현된 소스 파일은 물론, 그 소스파일이 속해 있는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳에서 사용할 수 있습니다. 공개(Public) 접근수준은 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰입니다. 우리가 사용하는 스위프트의 기본 요소는 모두 공개 접근수준으로 구현 되어 있다고 생각하면 됩니다.
open
키워드로 지정할 수 있는 개방(Open) 접근수준은 공개(Public) 접근수준 이상으로 높은 접근수준이며, 클래스와 클래스의 멤버에서만 사용할 수 있습니다.
기본적으로 공개 접근수준(public)과 비슷하지만 다음과 같은 차이점이 있습니다.
라이브러리 혹은 프레임워크를 설계할 때 라이브러리나 프레임워크를 사용하는 프로그래머가 이 타입을 사용할 수 있도록 하려면 open 혹은 public 공개수준으로 타입을 정의하면 됩니다. 그때 라이브러리 사용자(프로그래머)가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다는 생각을 한다면 open 개방 접근 수준으로, 그렇지 않고 클래스를 상속받거나 재정의할 수 없도록 막고싶다면 public 공개 접근 수준으로 정의하면 됩니다.
open 및 public 접근 수준이 아닌 다른 클래스 및 타입은 모듈 외부에서 접근할 수 없으므로 라이브러리 혹은 프레임워크를 사용하는 프로그래머가 사용할 수 없습니다.
internal
키워드로 지정하는 내부(Internal) 접근수준은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준입니다. 내부 접근수준으로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있습니다. 다만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없습니다. 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 내부 접근수준을 지정합니다.
파일외부비공개(File-private) 접근수준으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다. 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용하면 좋습니다.
비공개(Private) 접근수준은 가장 한정적인 범위입니다. 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있습니다. 비공개 접근수준으로 지정한 기능은 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없습니다.