iOS 관련 공부
접근제어(Access Control), 싱클톤(Signleton) 패턴
가애야
2025. 2. 25. 00:06
접근제어(Access Control)
객체의 은닉화
class SomeClass {
private var name = "이름"
func nameChange(name: String) {
self.name = name
}
}
var s = SomeClass()
s.nameChange(name: "홍길동")
외부에서 private으로 선언된 속성/메서드에 접근불가하므로
코드 내부의 세부 구현 내용을 숨기는 것이 가능(은닉화)
name 속성은 외부에서 볼 수 없음(접근 불가)
접근 제어가 필요한 이유
- 애플이 자신들이 원하는 코드를 감출 수 있음
- 코드의 영역을 분리시켜서 효율적 관리 가능
- 컴파일 시간이 줄어든다 (컴파일러가 해당 변수가 어느범위에서만 쓰이는지를 인지 가능)
싱글톤(Singleton) 패턴
메모리상에 유일하게 1개만 존재하는 객체 설계
싱글톤 패턴이 필요한 이유
앱 구현시에 유일하게 한개만 존재하는 객체가 필요한 경우에 사용(특정한 유일한 데이터/관리 객체가 필요한 경우)
한번 생성된 이후에는 앱이 종료될 때까지 유일한 객체로 메모리에 상주
싱글톤 패턴의 문법적 이해
class Singlton {
// 타입 프로퍼티(전역변수)로 선언
static let shared = Singleton() // 자신의 객체를 생성해서 전역변수에 할당
var userInfoId = 12345
}
static let 이름 = 객체생성() -> (데이터 영역에 유일한 객체의 주소가 담겨있음)
자기자신을 초기화해서 static let 변수에 할당
일반적으로 공유되는 자원이라는 뜻에서 shared 용어를 많이 사용
변수로 접근하는 순간 lazy하게(지연저장속성처럼) 동작하여, 메모리(데이터 영역)에 올라감
Singleton.shared // 이 순간에 올라감
let object = Singleton.shared
object.userInfoId = 777
Singleton.shared.userInfoId // 출력: 777
let object2 = Singleton.shared // 유일한 객체를 가르키는 것일뿐
object2.userInfoId // 출력: 777
Singleton.shared.userInfoId // 출력: 777
동일한 객체를 가르키고 있기 때문에 전부 같음
새로운 객체를 생성하는 것도 가능
let object3 = Singleton()
object3.userInfoId // 출력: 12345
새로운 객체를 찍어낼 수 없도록 하는 방법도 있음 (올바른 싱글톤 패턴의 구현)
class Singlton {
// 타입 프로퍼티(전역변수)로 선언
static let shared = Singleton() // 자신의 객체를 생성해서 전역변수에 할당
var userInfoId = 12345
private init() {}
}
let object3 = Singleton() // 오류 생성자에 접근 불가
private init() 설정으로 새로운 객체 추가적 생성이 불가하게 막는 것 가능
실제 사용 예
앱을 실행하는 동안 하나의 유일한 객체만 생성되어서 해당 부분을 관리
let screen = UIScreen.main // 화면
let userDefaults = UserDefaults.standard // 한번생성된 후, 계속 메모리에 남음!!!
let application = UIApplication.shared // 앱
let fileManager = FileManager.default // 파일
let notification = NotificationCenter.default // 노티피케이션(특정 상황, 시점을 알려줌)
타입속성처럼 접근해서 사용하는 싱글톤 패턴
실제 애플이 만들어놓은 프레임워크에서 사용하는 싱글톤 패턴