1️⃣ To do list
- 9시 - 코드카타 2개
- 11시 - 어제 강의 복습
- 오후 - 문법 고급 강의 (1-7 ~ 1-9)
- 과제(숫자 야구 게임)
2️⃣ 배운 것
사용자 정의 데이터 타입(Custom Data Types) 중, 특히 값 타입을 만들 때는
private 접근 제한자를 사용하는 게 권장된다는 것을 배웠다.
접근제한자에 따라 타입 내-외부에서 상호작용할 수 있는 정도가 달라지는데,
iternal과 private은 다음과 같이 다르다는 것을 확인했다.
🔘 iternal로 선언 -> 외부에서 프로퍼티 값에 접근 가능
접근제한자를 생략할 경우, 티폴트로 iternal로 선언된다.
Matrix 구조체에서 data 프로퍼티를 iternal로 선언했더니
구조체 바깥에서 프로퍼티에 접근은 물론, 수정까지 가능했다.
// 1️⃣ data를 iternal로 선언 -> 외부에서 data에 접근 가능
struct Matrix {
var data: [[Int]]
init(_ rows: Int, _ columns: Int) {
data = Array(repeating: Array(repeating: 0, count: columns), count: rows)
}
}
// 인스턴스 생성
var matrix = Matrix(3,3)
print(matrix) // Matrix(data: [[0, 0, 0], [0, 0, 0], [0, 0, 0]])
// data 프린트 ✅
print(matrix.data) // [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
// data 변경 ✅
matrix.data[0][0] = 1
print(matrix.data) // [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
그러나 밖에서 인스턴스를 변경하도록 허용하는 건 안전하지 않은 방법이다.
따라서,
=> 데이터를 private로 선언하여 밖에서 접근제어자로 바꿀 수 없도록 하고,
=> 데이터에 접근이 필요할 경우를 위해 구조체 내부에 데이터 접근 메소드를 만들자.
🔘 private로 선언 -> 외부에서 프로퍼티 값에 접근 불가
struct Matrix2 {
private var data: [[Int]]
init(_ rows: Int, _ columns: Int) {
data = Array(repeating: Array(repeating: 0, count: columns), count: rows)
}
}
// 인스턴스 생성
var matrix2 = Matrix2(3,3)
print(matrix2) // Matrix2(data: [[0, 0, 0], [0, 0, 0], [0, 0, 0]])
// data 프린트 ❌ -- data에 접근 자체가 안 되기 때문
// print(matrix2.data) // 'data' is inaccessible due to 'private' protection level
// data 변경 ❌
//matrix2.data[0][0] = 1 // 'data' is inaccessible due to 'private' protection level
//print(matrix2.data) // 'data' is inaccessible due to 'private' protection level
이처럼 외부에서 data에 접근이 막혀서 data를 출력하거나 변경하지 못한다.
🔘 메소드 추가
data를 프린트 및 변경할 수 있도록,
extension 키워드를 사용해 Matrix2에 메소드를 추가해보겠다.
* data를 변경하는 데에 사용된 subscript는 클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자이다. (참고: 개발자 소들이 블로그)
// 🔷 data 프린트 메소드 추가하기
extension Matrix2 {
func printData() { // data 출력 메소드
print(data)
}
}
// 프린트 메소드로 데이터 확인 ✅
matrix2.printData() // [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
// ---------------------
// 🔷 data 변경 메소드(subscript) 추가하기
extension Matrix2 {
subscript(_ row: Int, _ column: Int) -> Int {
get {
return data[row][column]
}
set {
data[row][column] = newValue
}
}
}
// subscript 메소드 ✅
// get 실행
print(matrix2[0,0]) // 0
// set 실행
matrix2[0, 0] = 9
matrix2.printData() // [[9, 0, 0], [0, 0, 0], [0, 0, 0]]
3️⃣ 느낀점
위 내용을 이해하는 데 2-3시간 정도 걸린 것 같다.
접근 제한자, extension, subscript 모두 이번에 처음 접했기 때문이다.
비록 오래 걸렸지만, 거의 완벽하게 이해한 것 같아 좋다.
시간이 이렇게 많이 걸리는 건... 학습 초반이라 그런 거겠지...? 얼른 속도가 붙었으면 좋겠다!
'Swift > TIL(TodayILearned)' 카테고리의 다른 글
[Swift|TIL] 240318~0319 - UIViewComponents (0) | 2024.03.19 |
---|---|
[Swift|TIL] 240315 - dropFirst(_:) / suffix(_:) /shuffle() / ArraySubsequence(=ArraySlice) 타입 (부분열)을 Array타입으로 초기화 / 개인과제(2) 리뷰 (0) | 2024.03.15 |
[Swift|코드카타] (프로그래머스) 입문 #35. 부족한 금액 계산하기 - 수학 공식을 활용하여 더 가볍게 코딩! (0) | 2024.03.08 |
[Swift|TIL] 240307 회고 (0) | 2024.03.08 |
[Swift|TIL] 240306 회고 - 클래스, 구조체, 열거형 비교 (2) | 2024.03.06 |