Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

접근 제어자의 종류엔 어떤게 있는지 설명하시오. #24

Open
Do-hyun-Kim opened this issue Oct 23, 2023 · 4 comments
Open
Labels
Swift Swift CS 개념 공부

Comments

@Do-hyun-Kim
Copy link
Contributor

No description provided.

@Do-hyun-Kim Do-hyun-Kim added the Swift Swift CS 개념 공부 label Oct 23, 2023
@Do-hyun-Kim
Copy link
Contributor Author

접근 제어자의 종류엔 어떤게 있는지 설명하시오.

Acceess Control

  • 접근 제어Acceess Control은 다른 소스 파일 및 모듈의 코드에서 코드의 일부에 대한 Access(접근)을 제한 한다.
  • 코드의 세부 구현을 숨기고 해당 코드에 접근하고 사용될 수 있는 기본 인터페이스를 지정할 수 있다.
  • 개별 타입(individual types)class, struct, enum 뿐만 아니라, 해당 타입에 속하는 properties, method, initializers, subscripts에 대해 특정 Access 레벨을 지정 할 수 있다.

Access Control 종류

  • open : open 접근자는 선언한 모듈 (Framework) 이나 다른 모듈(Framework) 에서도 접근이 가능하다. open 접근자 같은 경우 선언한 모듈 Framework 외부에서 오버라이드와 서브클래싱이 가능하다.
JennyFoundation 내부에 open 접근자로 선언된 Jenny 클래스
스크린샷 2023-10-25 오후 4 16 30
JennyFoundation 외부에 open 접근자로 선언된 Jenny 클래스를 상속 받은 man 클래스
스크린샷 2023-10-25 오후 4 17 52
  • public : public 접근자는 선언한 모듈 (Framework) 이나 다른 모듈(Framework) 에서도 접근이 가능하지만 open 접근자와 다르게 선언한 모듈 외부에서는 오버라이드, 서브클래싱이 불가능하다.
JennyFoundation 내부에 public 접근자로 선언된 Human 클래스
스크린샷 2023-10-25 오후 4 19 12
JennyFoundation 외부에 public 접근자로 선언된 Human 클래스를 상속 받은 Girl 클래스
스크린샷 2023-10-25 오후 4 20 20
  • internal : internal 접근자는 기본 접근 레벨로 아무 접근자를 선언하지 않을 경우 internal 로 간주됩니다. internal 은 모든 소스 파일 내에서만 사용되지만, 해당 모듈 외부의 소스파일에서는 사용이 불가능 합니다.
JennyFoundation 내부에 internal 접근자로 선언된 Computer 클래스
스크린샷 2023-10-25 오후 4 21 40
JennyFoundation 외부에 internal 접근자로 선언된 Computer 클래스를 사용하게 되면
스크린샷 2023-10-25 오후 4 22 19
  • fileprivate : fileprivate 접근자는 특정 Entity를 선언한 파일 내에서만 사용이 가능하다.
    • 하단 이미지와 같이 internal 로 접근하게 되면 오류가 발생한다 fileprivate 로 선언된 접근자에 접근하기 위해서는 fileprivate 접근자 또는 private 접근자를 사용해서 접근해야 한다.
JennyFoundation 내부에 fileprivate 접근자로 선언된 Document 클래스에 접근하게 되면
스크린샷 2023-10-25 오후 4 23 08
JennyFoundation 내부에 fileprivate 접근자로 선언된 Document 클래스를 private, fileprivate 접근자로 접근하게 된 경우
스크린샷 2023-10-25 오후 4 24 02
  • private : private 접근자는 5개의 접근자중 가장 제한적인 접근자로 특정 Entity 사용을 enclosing 선언과 동일한 파일에 있는 해당 선언의 extension으로 제한 할 수 있다. private 접근제어자를 사용하면 단일 정의 내에서만 사용이 가능하기에 특정 기능 조각의 구현 상세 내역을 숨길 수 있다.
  • 지정 이니셜라어저(Designated Initializer)에 private 접근자를 부여하는 경우 인스턴스도 만들어지지 않는다 주로 SingleTone Pattern 을 사용할 경우 지정 이니셜 라이저에 private 접근자를 부여한다.
JennyFoundation 내부에 private 접근자로 선언된 Cipher 클래스를 다른 클래스에서 접근하게 되는 경우 발생하는 오류
스크린샷 2023-10-25 오후 4 25 05
  • private 키워드로 선언된 클래스는 extension 내부에서는 접근이 가능하다. 하지만 반드시 같은 소스 파일 내에서 extension을 사용해야 접근이 가능하니 주의해야한다.
스크린샷 2023-10-25 오후 4 25 28

📝 참고 자료

@Hminchae
Copy link
Member

Hminchae commented Oct 25, 2023

접근 제어자

접근 제어자는 코드를 작성하는 한 파일에서 다른 파일에 있는 코드에 대한 접근을 명시적으로 작성하여 이를 관리하는 것인데, module과 source file에 따라 접근할 수 있음

  • modul : 하나의 프레임워크를 의미, import 키워드로 추가되는 것들이 modul.ex) UIKit, Foundation, 프로젝트 하위에 있는 targets도 모두 하나의 module
  • source file : 각각의 module안에 있는 파일들, practice.swift같은 파일들이 하나의 sorce file

swift의 5가지 접근 제어자

entity : 접근 제어자를 작성할 수 있는 property, method, class, struct 등의 집합

  1. Open (가장 높은 접근 수준)
    • 프로젝트 내의 모든 module 해당 entity에 접근
    • 다른 모듈에서 subclass 가능
  2. Public
    • 프로젝트 내의 모든 module 해당 entity에 접근
    • 다른 모듈에서 subclass 불가능
  3. Internal (기본 접근 수준)
    • default 접근 제어자
    • entity가 작성된 modul에서 접근 가능
  4. File-private
    • entity가 작성된 source file에서만 접근 가능
    • 서로 다른 클래스가 같은 파일에 있고 file private로 선언되어 있다면, 서로 접근 가능
  5. Private (가장 낮은 접근 수준)
    • 특정 객체에서만 사용 가능
    • 같은 파일안에 있어도, 서로 다른 객체가 private로 선언되어 있다면, 서로 접근 불가능

그 외

  • 아무 접근 제어자도 적지 않으면 internal이 됨
  • 어떤 entity도 더 낮은 접근 수준을 가진 entity로 정의될 수 없음

참조

@vichye-1
Copy link

vichye-1 commented Oct 26, 2023

접근 제어(Access Control)란?

  • 다른 소스 파일과 모듈에서 코드 접근에 대해 제한한다.
  • 코드의 세부적인 구현을 숨기고 해당 코드에 접근하고 사용될 수 있는 기본 인터페이스를 지정할 수 있다.
  • 개별타입인 클래스, 구조체 및 열거형 뿐만 아니라
  • 해당 타입에 속하는 프로퍼티, 메서드, 이니셜라이저 및 서브 스크립트에 대해 특정 접근 레벨을 지정할 수 있다.

접근 제어의 종류 - 5가지

  1. open(가장 적은 제약)
  • 클래스에만 적용(struct와 enum은 public부터 가능)
  • 정의한 모듈의 모든 소스 파일과 정의한 모듈을 가져오고(import) 다른 모듈의 소스 파일에서 엔티티를 사용할 수 있다.
  • 프레임워크를 개발할 때 프레임워크를 가져오는 앱과 다른 모듈에서 보고 접근할 수 있게 하기 위해 해당 프레임워크에 대한 공용 인터페이스를 open또는 public으로 표시한다.
  • Framework 내부, Framework 외부 (즉, 어디서든)에서 서브 클래싱과 override 가능
  1. public
  • class, struct, enum에 모두 적용 가능
  • open과 비슷하지만 다른 점은,
  • open과 달리 public은 Framework 내부에서만 서브클래싱, override 가능
  1. internal - 기본 접근 권한
  • 정의한 모듈의 모든 소스 파일 내에서 사용할 수 있지만 해당 모듈 외부의 소스 파일에서는 사용할 수 없다.
  • 일반적으로 앱 또는 프레임워크의 내부 구조체를 정의할 때 internal 접근을 사용한다(모듈 내에서만 사용 가능)
  • 아래 class 도 internal 수준
class SomeClass {
    public init() {}
}
  1. fileprivate
  • 자체 정의한 소스 파일로 엔티티의 사용을 제한한다.
    • 위의 3개의 접근권한은 모듈 수준으로 사용이 가능하지만, 소스 파일까지로 범위가 제한된다.
    • 같은 모듈 내에서도 같은 소스파일 안에서만 사용이 가능하다.
  1. private(가장 높은 제약)
  • 1 ) enclosing 선언과, 2 ) 같은 파일에 있는 해당 선언의 extension*으로 엔티티의 사용을 제한
    • extension의 경우 Swift4부터 접근 가능하게 됨
  • 세부 내용은 단일 선언 내에서만 사용되고 기능의 특정 부분의 구현 세부정보를 가리기 위해 사용

접근 제어 구문

open class SomeOpenClass {}
public class SomePublicClass {}
public struct SomeStruct {}
public enum SomeEnum {}
internal class SomeInternalClass {}
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

참고

@ronick-grammer
Copy link
Contributor

ronick-grammer commented Oct 28, 2023

접근 제어자의 종류

접근 제어자는 모듈과 소스파일 내에서 클래스나 구조체 등의 프로퍼티와 메서드에 허용되는 접근 범위를 정의한다.

  • 모듈: 프레임워크나 라이브러리를 뜻하며, import 키워드로 추가되는 것들이다.
  • 소스 파일: 모듈 내에서 생성된 소스코드가 작성되는 파일이다.

open

  • 공개레벨: 최상
  • 공개범위: 모듈 외부
  • 프로젝트 내의 모든 모듈에 존재하는 모든 클래스나 구조체의 프로퍼티와 메서드에 접근이 가능하다.
  • 클래스에서만 사용가능하며, 한 모듈의 open class를 다른 모듈의 class가 상속하는 것이 가능하다.

public

  • 공개레벨: 상
  • 공개범위: 모듈 외부
  • 프로젝트 내의 모든 모듈에 존재하는 모든 클래스나 구조체의 프로퍼티와 메서드에 접근이 가능하다.
  • 한 모듈의 public class를 다른 모듈의 class가 상속하는 것은 불가능하다.

internal

  • 공개레벨: 중
  • 공개범위: 모듈 내부
  • 한 모듈 내에 존재하는 구조체나 클래스의 프로퍼티와 메서드는 해당 모듈내에서만 접근될 수 있다.
  • 어떤 접근 제어자도 선언되지 않으면 default로 설정된다.

fileprivate

  • 공개레벨: 하
  • 공개범위: 소스파일 내부
  • 한 모듈 내의 한 소스파일에 존재하는 구조체나 클래스의 프로퍼티와 메서드는 해당 소스파일 내에세만 접근될 수 있다.

private

  • 공개레벨: 최하
  • 공개범위: 클래스 or 구조체의 내부
  • 한 모듈 내에 존재하는 구조체나 클래스의 프로퍼티와 메서드는 해당 구조체나 클래스 내에서만 접근될 수 있다.

📝 참고 사이트

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Swift Swift CS 개념 공부
Projects
None yet
Development

No branches or pull requests

4 participants