나에게는 슬픈 전설이 있다...
코딩을 시작할 때부터 변수를 선언할 때는 private 아묻따 붙히라고.. 가스라이팅을 하도 당해서
그렇게 영영 이유도 알지 못한채 지내왔다는 슬픈 전설이..
그런 날을 반성하며 오늘은 private을 사용한 것과 사용안한 것에 대한 차이점을 알아보려고 한다..
일단 눈물 한 방울 닦고..
Swift에서 private 접근 제한자는 해당 프로퍼티, 메소드, 또는 타입이 선언된 범위 내에서만 접근 가능하도록 제한한다.
이것은 캡슐화와 은닉화의 핵심 원리를 구현하는 데 도움을 준다
private을 사용하면 클래스나 구조체의 내부 구현을 외부로부터 숨길 수 있다
이는 객체의 세부 구현을 변경하더라도 외부 인터페이스에 영향을 주지 않아 안정성을 향상시킨다
외부에서 접근할 수 없기 때문에, 의도치 않은 변경으로부터 프로퍼티나 메소드를 보호할 수 있다
내부 구현만을 수정하면 되므로, 유지보수가 더 쉬워진다
먼저 private을 사용한 예시를 보자.
여기서 counter는 ContentView 내에서만 접근이 가능하다
import SwiftUI
struct ContentView: View {
@State private var counter: Int = 0
var body: some View {
VStack {
Text("카운트: \(counter)")
Button("증가") {
self.counter += 1
}
OtherView(counter: counter)
}
}
}
struct OtherView: View {
var counter: Int
var body: some View {
Text("다른 뷰에서 카운트: \(counter)")
}
}
이 경우, OtherView는 ContentView로부터 counter 값을 받지만, OtherView에서 counter를 수정할 수는 없다
왜냐 counter는 private으로 선언되어 있기 때문에 OtherView 내부에서 직접 접근이 불가능하다
private를 사용하지 않으면 기본적으로 internal 접근 수준이 적용된다
internal은 같은 모듈 내에서는 어디서나 접근할 수 있음을 의미한다
따라서, 더 많은 곳에서 접근이 가능하지만, 이는 캡슐화 원칙에 어긋날 수 있고, 예상치 못한 오류를 발생시킬 수 있다
이제 private을 사용하지 않는 경우도 살펴보자.
import SwiftUI
struct ContentView: View {
@State var counter: Int = 0
var body: some View {
VStack {
Text("카운트: \(counter)")
Button("증가") {
self.counter += 1
}
OtherView(counter: $counter)
}
}
}
struct OtherView: View {
@Binding var counter: Int
var body: some View {
VStack {
Text("다른 뷰에서 카운트: \(counter)")
Button("다른 뷰에서 증가") {
self.counter += 1
}
}
}
}
코드를 보면 counter에 대한 접근 제한이 없으므로, 다른 뷰에서도 이 값을 읽고 수정할 수 있다.
그렇게 되면 ContentView에서 counter를 OtherView로 전달할 때 @Binding을 사용 할 수 있다.
@Binding을 사용하면 OtherView에서 counter를 수정하면 ContentView의 counter도 함께 변경된다.
private을 사용하면 클래스나 구조체의 내부 구현을 외부로부터 보호하고 캡슐화를 강화할 수 있고, 뷰의 상태를 은닉하고 안전하게 관리할 수 있다.
private을 사용하지 않으면 기본적으로 internal 접근 수준이 적용되어 모듈 내부 어디서나 접근할 수 있다. 또한 @Binding이나 @StateObject 같은 프로퍼티 래퍼를 사용해서 다른 뷰와 데이터를 공유 할 수도 있다
오늘은 언젠간 다뤄바야지 하던 private을 다뤄봤다.. 사실 왜 쓰는지 안쓰는지 코딩을 하면서 자연스럽게 알고는 있었지만 그래도 한번 더 짚고 넘어가는거 같아서 기분은 좋은거 같다ㅎ.ㅎ