iOS 공부하는 감자

Day9) 메서드, 접근제한자, Static 본문

22 베이직 챌린지

Day9) 메서드, 접근제한자, Static

DongTaTo 2022. 1. 11. 17:50
반응형

메서드

함수 vs 메서드

함수 : 모듈 전체에서 전역적으로 사용하는 함수

메서드 : 클래스, 구조체, 열거형 등 특정 타입과 연관되어 사용되는 함수

 

 

메서드의 종류

  • 인스턴스 메서드 : 인스턴스와 연관된 메서드 / 인스턴스가 생성되어야 호출이 가능하다.
  • 타입 메서드 : 타입과 연관된 메서드 / 인스턴스 생성 유무와 관계없이 타입 자체를 사용하여 호출 가능하다.

 

인스턴스 메서드

  • 타입 내부에서 다른 수식어 없이 func로 시작하는 메서드
  • 인스턴스를 생성 후 .(dot)문법을 통해 호출 가능하다.
  • 인스턴스 메서드에서 타입 이름에 .(dot)문법을 사용하면 타입 프로퍼티, 타입 메서드에 접근이 가능하다.
  • struct Person {
        // 인스턴스 메서드
        func sayHello() {
            print("Hello!!")
        }
    }
    
    let dong: Person = Person()
    
    dong.sayHello()  // Hello!!

 

타입 메서드

  • 메서드를 선언할 때 func키워드 앞에 static 또는 class를 붙여서 타입 메서드를 선언할 수 있다.
  • 타입 이름에 .(dot)문법을 사용하여 호출 가능하다.
  • 타입 메서드는 인스턴스 메서드와 인스턴스 프로퍼티에 접근이 불가능하다. (인스턴스 생성 유무에 관계없이 사용이 가능한 타입 프로퍼티와 메서드와는 다르게 인스턴스 프로퍼티와 메서드는 인스턴스가 초기화되어야 메모리에 올라가므로 접근이 불가능한 것)
  • class Person {
        // 타입 메서드
        static func sayHello() {
            print("Hello!!")
        }
        // class 키워드를 사용한 타입 메서드는 class타입에서만 사용 가능하다.
        class func sayBye() {
            print("Bye")
        }
    }
  • static vs class
    • 메서드 오버라이딩(재정의)이 가능한지 여부에 따라 구분된다. 
    • static : Subclass에서 해당 타입 메서드를 오버라이딩 할 수 없다
    • class Person {
          static func sayHello() {
              print("Hello!!")
          }
      }
      
      class Dong: Person {
          override static func sayHello() {  // Cannot override static method
              print("Hi!!")
          }
      }
    • class : Subclass에서 해당 타입 메서드를 오버라이딩 할 수 있다.
    • class Person {
          class func sayHello() {
              print("Hello!!")
          }
      }
      
      class Dong: Person {
          override static func sayHello() {
              print("Hi!!")
          }
      }

 

 

 


접근제한자

  • 코드끼리 상호작용을 할 때 소스파일 간 또는 모듈 간에 접근을 제한할 수 있다.
  • 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있다.
  • 코드의 상세 구현 사항을 숨기기 때문에 객체지향의 은닉화를 가능하게 한다.
    은닉화 주요 사항이 겉으로 드러나지 않도록 감추는 것
    캡슐화 중요사항을 감춘 상태에서 외부에 감춘 사항을 사용할 수 있도록 방법을 제공하고 외부와 소통하는 것
  • 불필요한 접근으로 의도치 않은 결과를 초래하는 등의 문제를 방지하기 위해 접근제어를 이용한다.

 

모듈과 소스파일

  • 모듈
    • 배포할 코드의 묶음 단위
    • ex) 프레임워크, 라이브러리, 애플리케이션  / 스위프트에서 import 키워트를 통해 가져오는 것
  • 소스파일
    • 하나의 스위프트 소스 코드 파일
    • .swift 파일 하나의 단위
    • 기존 프로그래밍 언어에서는 통상 파일 하나에 타입 하나를 정의한다. (클래스, 구조체 열거형 등)

 

 

접근 수준

  • 접근제어는 접근수준 키워드를 통해 구현 가능하다.▲▼
  • 접근수준은 각 타입(클래스, 구조체, 열거형) 뿐만 아니라, 해당 타입에 속하는 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각에도 지정할 수 있다.
    접근수준 키워드 접근도 범위 -
    개방 접근수준 open 높음

    |
    |
    |

    낮음
    모듈 외부 클래스에서만 사용
    공개 접근수준 public 모듈 외부  
    내부 접근수준 internal 모듈 내부  
    파일 외부 비공개 접근수준 fileprivate 파일 내부  
    비공개 접근수준 private 기능 정의 내부  

 

1. 개방 접근수준 - open

  • 클래스와 클래스의 멤버에서만 사용이 가능하다.
  • open 키워드로 지정된 요소는 어디서든 사용 가능하다.
  • public보다 높은 접근수준

 

2. 공개 접근수준 - public

  • 개방 접근수준과 마찬가지로 어디서든 쓰일 수 있다. (자신이 구현한 소스파일과 그 소스파일이 속한 모듈, 해당 모듈을 가져다 쓰는 다른 모듈 등 모든 곳)
  • 공개(public) 접근수준은 주로 프레임워크에서 외부와 연결된 인터페이스를 구현할 때 많이 사용한다.
  • 일반적으로 흔히 사용하는 스위프트의 기본 요소는 모두 공개 접근수준(public)으로 구현되어 있다.
    공개 접근수준(public)과 개방 접근수준(open)의 차이점
    개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 해당 클래스가 정의된 모듈 내부에서만 상속이 가능하다.
    개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의 가능하다.
    개방 접근수준의 클래스는 해당 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속이 가능하다.
    개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의 가능하다.

    클래스를 개방 접근수준으로 명시한다는 것은
    그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미

3. 내부 접근수준 - internal

  • 모든 요소에 암묵적으로 지정되는 기본 접근수준
  • 소스파일이 속한 모듈 어디서든 사용이 가능하다. (해당 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없음)
  • 보통 외부에서 사용할 클래스나 구조체가 아니면서 속해있는 모듈 내부에서 광역적으로 사용하고 싶을 때 사용한다.

 

4. 파일 외부 비공개 접근수준 - fileprivate

  • 해당 요소가 구현된 소스파일 내부에서만 사용 가능하다.
  • 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용한다.

 

5. 비공개 접근수준 - private

  • 가장 한정적인 범위로, 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 접근이 가능하다. (기능정의 단계에서만 접근)
  • 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 접근이 불가능하다.
  • 자신을 확장하는 익스텐션 코드가 같은 파일에 존재하는 경우 접근이 가능하다.

 

접근제어 규칙

  • 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다.
  • 비공개 접근수준(private)으로 정의된 구조체 내부에서 내부수준(internal), 공개수준(public)을 가진 프로퍼티를 가질 수 없다.
  • 매개변수와 반환값은 함수의 접근수준보다 같거나 높아야 한다.
  • 공개 접근수준에 비공개 접근수준을 넣는건 가능!
  • 반대로 비공개 접근수준 내부에 공개 접근수준을 넣으면 오류!

 

읽기 전용 구현

  • 구조체, 클래스를 사용하여 저장 프로퍼티를 구현할 때, 허용된 접근수준에서 프로퍼티 값을 읽을 수는 있지만 값을 변경하는 것은 제한하고 싶다면 사용한다. (+ 서브스크립트도 읽기만 가능하도록 제한 가능)
  • 설정자(setter)만 더 낮은 접근수준을 갖도록 제한한다.
  • 요소의 접근수준 키워드 뒤에 접근수준(set) 키워드를 추가하여 사용 가능하다.

 

 


알고리즘

https://co-dong.tistory.com/16

 

모의고사

모의고사 수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다. 1번 수포자

co-dong.tistory.com

 

반응형

'22 베이직 챌린지' 카테고리의 다른 글

Day11) 프로토콜, 익스텐션  (0) 2022.01.13
Day10) 클래스와 상속  (0) 2022.01.12
Day8) 프로퍼티, 연산 프로퍼티  (0) 2022.01.10
Day7) 클래스와 구조체  (0) 2022.01.09
Day6) 함수, 파라미터, 클로저  (0) 2022.01.08