TIL

[Sesac IOS] 31일차 TIL

31일차 수업 내용을 정리한 글입니다.


Learned

접근 제어 (Access Control)

1) 개요

  • 특정 코드에 대한 접근을 소스파일 또는 모듈 단위로 제한하는 것
  • 접근 제어를 통해 코드의 세부적인 구현을 감추고 필요한 만큼만 공개할 수 있음.
  • 코드가 사용될 수 있는 범위를 직관적으로 나타낼 수 있고,
    공개될 필요가 없는 불필요한 코드를 감춰서 오류를 방지하는 효과가 있음.
  • 객체 지향 프로그래밍의 특성 중 하나인 은닉화 특성을 구현할 수 있음.

2) 모듈과 소스파일

  • 접근 제어는 모듈과 소스파일을 기준으로 판단함.
  • 모듈이란 import 키워드를 통해서 사용할 수 있는 코드 묶음의 단위를 의미하며
    앱과 프레임워크를 하나의 모듈로 볼 수 있다.
  • 소스파일은 모듈 안에 있는 .swift 같은 파일들을 의미하며 각 소스파일에
    특정 타입을 선언하여 사용할 수 있음.

3) 접근 레벨 (Access Level)

  • 바깥의 접근 레벨이 내부 접근 레벨보다 높아야 한다. (덜 제한적이어야 함)
    • public 변수는 internal, fileprivate, private 타입 내부에서 선언될 수 없다.
    • 함수의 접근 레벨이 파라미터와 리턴 타입의 접근 레벨보다 높을 수 없다.
  • 접근자 (Accessor)
    • open, public
      선언된 모듈이 아닌 다른 모듈에서 접근할 수 있음.
      open은 클래스에만 사용할 수 있고 다른 모듈에서 오버라이딩과 상속을 가능하게 함.
      public은 다른 모듈에서 오버라이딩, 상속 불가능
    • internal
      기본적으로 설정되는 접근 레벨이며 선언된 모듈 전체에서 접근할 수 있음.
    • fileprivate
      선언된 소스파일 안에서만 접근할 수 있음.
    • private
      선언된 괄호(블록) 안에서만 접근할 수 있음.
  • 클래스
    • 클래스에 지정한 접근 레벨이 클래스의 내부 프로퍼티와 메서드의 리턴 타입의
      기본 접근 레벨로 설정됨.
    • 단, public으로 선언될 경우 내부 멤버는 기본적으로 internal 접근 레벨을 가짐.
      (노출되면 안되는 코드가 실수로 노출되는 것을 막기 위함)
// 명시적 public
public class SomePublicClass {
    public var somePublicProperty = 0            // 명시적 public
    var someInternalProperty = 0                 // 기본적 internal
    fileprivate func someFilePrivateMethod() {}  // 명시적 file-private
    private func somePrivateMethod() {}          // 명시적 private
}

// 명시적 fileprivate
fileprivate class SomeFilePrivateClass {
    func someFilePrivateMethod() {}              // 기본적 fileprivate 
    private func somePrivateMethod() {}          // 명시적 private
}
  • 함수
    • 함수 타입에 대한 접근 레벨은 내부 파라미터와 리턴 타입 중
      가장 최소인(제한적인) 접근 레벨로 설정됨.
    • 만약 파라미터 타입과 리턴 타입이 각각 internal, private이라면
      함수에 private 접근 레벨을 명시해야함.
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
   // 리턴 타입인 튜플의 접근 레벨은 내부 요소 중 가장 제한적인 접근 레벨로 설정됨.
   // 따라서 리턴되는 튜블의 접근 레벨은 private이므로 함수 선언 시 private을 명시함.
}
  • 열거형
    • 열거형 타입에 설정된 접근 레벨이 모든 case에 동일하게 적용됨.
    • case 별로 다른 접근 레벨을 설정할 수 없음.
  • 프로토콜
    • 프로토콜에 설정한 접근 레벨이 요구사항에 동일하게 적용됨.
    • 프로토콜을 상속하여 새로운 프로토콜을 선언하는 경우
      새로운 프로토콜은 상속한 프로토콜과 같은 접근 레벨을 가짐.
    • 높은 접근 레벨의 타입이 낮은 접근 레벨의 프로토콜을 준수할 수 있음.
      그럴 경우 해당 타입은 준수하는 프로토콜의 접근 레벨과 동일하게 적용됨.
  • 익스텐션
    • 익스텐션을 통해 클래스, 구조체, 열거형에 추가한 새로운 멤버는
      해당 타입과 동일한 접근 레벨이 적용됨.
    • 프로토콜에 새로운 요구사항을 추가할 경우 역시 마찬가지로
      프로토콜의 접근 레벨이 동일하게 적용됨.
    • 익스텐션에서 private으로 설정된 멤버에 접근할 수 있음.
      (같은 블록에 있는 것 처럼 취급되기 때문)

 

커스텀 프레임워크(모듈) 구현

  • 접근 제어를 적절히 사용해서 커스텀 프레임워크를 만들 수 있음.
  • 여러 기능을 모듈로 나누면 프로젝트가 가벼워진다는 장점이 있음.
  • 프레임워크를 통해 앱의 결합도를 낮추고 응집도를 높이는 것이 바람직함.
    • 결합도 : 모듈과 모듈이 의존적으로 결합돼있는 정도
    • 응집도 : 모듈들이 공통의 목적을 가지고 연관돼있는 정도

 

Learning

  • 스위프트 공식 문서의 "접근 제어" 공부하고 정리하기
  • 인터페이스 빌더의 ContainerView 코드로 구현할 수 있는지 알아보기

 


이상입니다.

 

'TIL' 카테고리의 다른 글

[Sesac IOS] 33일차 TIL  (0) 2022.08.18
[Sesac IOS] 32일차 TIL  (0) 2022.08.18
[Sesac IOS] 30일차 TIL  (0) 2022.08.16
[Sesac IOS] 29일차 TIL  (0) 2022.08.12
[Sesac IOS] 28일차 TIL  (0) 2022.08.11