옵셔널 체이닝(Optional Chaining)
자바스크립트에서 객체의 속성 접근을 더 안전하게 하는 방법
이 기능을 사용하면 객체의 속성이 존재하지 않을 때 발생하는 오류를 방지할 수 있음
// 옵셔널 문자열을 선언하고 "Hi"로 초기화합니다.
var x: String? = "Hi" // x는 옵셔널이므로 nil일 수 있습니다.
// x의 값을 출력합니다. x!는 강제로 언래핑하여 nil이 아닐 경우 값을 가져옵니다.
print(x, x!) // 출력: Optional("Hi") Hi (옵셔널 x의 값과 강제로 언래핑한 값)
// if-let 구문을 사용하여 x가 nil이 아닐 경우에만 a에 값을 할당합니다.
if let a = x {
print(a) // 출력: Hi (x가 nil이 아닐 경우, a의 값을 출력합니다.)
}
// 강제로 언래핑하여 x의 문자 개수를 가져옵니다. x가 nil이면 런타임 오류가 발생합니다.
let b = x!.count // x가 nil이 아니므로, x의 문자 개수를 가져옵니다.
print(type(of: b), b) // 출력: Int 2 (b의 타입과 값을 출력합니다. Hi의 길이는 2)
// 옵셔널 체이닝을 사용하여 x의 문자 개수를 가져옵니다. x가 nil이면 nil이 반환됩니다.
let b1 = x?.count // x가 nil인 경우, b1은 nil이 됩니다.
print(type(of: b1), b1, b1!) // 출력: Optional<Int> Optional(2) 2 (b1의 타입과 값을 출력합니다. b1은 nil이 아니므로 강제로 언래핑 가능)
// nil 병합 연산자를 사용하여 x가 nil일 경우 빈 문자열을 할당합니다.
let c = x ?? "" // x가 nil이면 c는 빈 문자열이 됩니다.
print(c) // 출력: Hi (x가 nil이 아니므로 c는 x의 값을 그대로 사용)
?.해서 일반적임
근데 print할때는 !로 풀어줘야됨
var x : int //선언문
x=10//실행문
var x : int? //선언문
var x : int! //선언문
//공통점: 둘다 옵셔널 형임, 선언문에서 자료형 다음에 ?! 찍을 수 있음
//!는 자동으로 언래핑함, 일반적으로는 ?를 사용함
var x : int! = 10
실행문에 !는 변수 뒤에 씀 ex) x!
//실행문에서의 x?란
//풀긴풀되, 조심해서 푼다
//최종적인 값을 한번 더 풀어서 써야한다는 단점
//옵셔널 체인일때
.count같은
//!는 옵셔널을 푸는것
//?는 옵셔널을 풀긴하지만 조심스럽게 푸는 것
//--------------------------
// 정수형 변수 x 선언
var x: Int // 선언문
// x에 10을 할당
x = 10 // 실행문
// 옵셔널 정수형 변수 x 선언 (값이 nil일 수 있음)
var x: Int? // 선언문
// 암시적 언래핑 옵셔널 변수 x 선언 (nil이 아닐 것이라 가정)
var x: Int! // 선언문
// 공통점: 두 변수 모두 옵셔널 형식임
// 선언문에서 자료형 다음에 ? 또는 !를 사용할 수 있음
// 암시적 언래핑 옵셔널 변수 x에 10을 할당
var x: Int! = 10
// 실행문에서 !는 변수 뒤에 사용하여 값을 언래핑함
// 예시: x!
// 실행문에서 x?는 옵셔널 값을 풀긴 하지만 조심스럽게 다루어야 함
// 이 경우, 최종적인 값을 한번 더 풀어서 사용해야 함
// 옵셔널 체인 사용 예시
// 예: x?.count (x가 nil이 아닐 때만 count를 호출)
// !는 옵셔널을 강제로 언래핑함
// ?는 옵셔널을 안전하게 풀지만 nil인 경우 처리해야 함
class Person {
var name: String
var age: Int
// 초기화 메서드
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
// Person 객체 kim 생성
let kim: Person = Person(name: "Kim", age: 20)
print(kim.age) // kim의 나이 출력
// 옵셔널 Person 객체 han 생성
let han: Person? = Person(name: "Han", age: 25) // 옵셔널 Person
// han의 나이를 출력할 때 옵셔널을 강제로 언래핑해야 함
print(han!.age) // han이 nil이 아닐 경우, 나이를 출력 (강제 언래핑)
//옵셔널이기 때문에 !로 풀어줘야됨 안하면 error/ ?는 옵쳐널 체이닝 이경우 또 한번 아래에 풀어줘야됨
//print((han?.age)!) 또는 아래 if처럼 풀어줌
// 옵셔널 체이닝을 사용할 경우
// print(han?.age) // Optional(25), han이 nil일 경우 nil 반환
// 옵셔널 체이닝 후 강제 언래핑
print((han?.age)!) // han이 nil이 아닐 경우, 나이를 출력
// 옵셔널 바인딩을 사용하여 안전하게 언래핑
if let hanAge = han?.age {
print(hanAge) // han이 nil이 아닐 경우, hanAge 출력
} else {
print("nil") // han이 nil일 경우 "nil" 출력
}
6주차 9p X
// 옵셔널 체이닝: 점 앞에 ? 사용
class Company {
var ceo: Person? // 회사의 CEO는 Person 타입이지만, nil일 수도 있음
}
class Person {
var name: String // 사람의 이름을 저장하는 변수
// 초기화 메서드
init(name: String) {
self.name = name // 주어진 이름으로 초기화
}
}
// Company 객체 apple 생성
let apple = Company()
// apple의 CEO를 Person 객체로 설정
apple.ceo = Person(name: "Kim") // Kim이라는 이름의 CEO를 설정
// 다음은 오류가 발생함
// print(apple.ceo.name) // apple.ceo가 nil일 수도 있기 때문에 오류 발생
// 옵셔널 체이닝 없이 CEO의 이름을 안전하게 가져오는 방법
if let ceo = apple.ceo { // apple.ceo가 nil이 아닐 경우
print(ceo.name) // CEO의 이름을 출력 (이 경우 "Kim")
}
// 강제 언래핑을 사용하여 CEO의 이름을 가져옴
print(apple.ceo!.name) // "Kim"을 출력 (apple.ceo가 nil이 아닐 것이라 가정)
// 옵셔널 체이닝을 사용하여 CEO의 이름을 가져옴
print(apple.ceo?.name) // "Optional("Kim")"을 출력 (옵셔널로 감싸져 있음)
// 옵셔널 체이닝을 사용하여 CEO의 이름을 안전하게 가져오는 방법
if let name = apple.ceo?.name { // apple.ceo가 nil이 아닐 경우
print(name) // "Kim"을 출력
}
// 옵셔널 체이닝과 nil 병합 연산자를 사용
print(apple.ceo?.name ?? "CEO가 없습니다") // "Kim"을 출력 (apple.ceo가 nil일 경우 "CEO가 없습니다" 출력)
옵셔널 체이닝 장점
안전성: 옵셔널 체이닝을 사용하면, 객체가 nil인지 확인하면서 안전하게 값을 가져올 수 있습니다. 따라서 런타임 오류를 예방할 수 있습니다.
코드 간결성: 옵셔널 체이닝을 사용하면 코드가 더 간결해집니다. if let 구문 없이도 간단하게 값을 가져올 수 있습니다.
조건부 실행: 옵셔널 체이닝을 사용하면, 체인이 끊어지는 순간 nil을 반환하므로, 조건에 따라 다음 메서드나 프로퍼티를 안전하게 호출할 수 있습니다.
단점
옵셔널 값으로 반환: 옵셔널 체이닝을 사용하면 결과가 항상 옵셔널로 반환되기 때문에, 이를 사용하려면 다시 언래핑해야 합니다. 즉, if let 또는 !를 사용하여 값을 풀어줘야 합니다.
가독성 저하: 여러 개의 옵셔널 체이닝이 중첩될 경우, 코드의 가독성이 떨어질 수 있습니다. 이런 경우, 어떤 부분이 nil인지 추적하기 어려워질 수 있습니다.
강제 언래핑의 위험: !를 사용하여 강제로 언래핑할 경우, nil인 경우 런타임 오류가 발생할 수 있어 주의가 필요합니다.
예외처리를 하고 싶을때 try?나 try!를 사용,
?를 쓰게 되면 리턴 값이 옵셔널로 나옴, 에러를 간단히 무시하거나 실패 여부만 확인하고 싶을때
!는 에러가 절대 발생하지 않을 것이라고 가정할떄, 만약 에러가 발생하면 프로그램이 크래시( 보통 사용안함)
throws 키워드
사용 방법: 함수의 매개변수나 반환값에 throws 키워드가 붙어 있으면, 해당 함수는 오류를 발생시킬 수 있다는 의미입니다.
특징: throws가 있는 함수는 반드시 try, try?, 또는 try!로 호출해야 하며, 예외 처리를 해주어야 합니다.
throws 키워드가 있으면 반드시 예외 처리해야됨
그냥 호출 안되고 앞에는 try를 써주고 앞 뒤에 do ~try ~catch를 써줌
예외가 발생할 수 있는 코드는 do 블록 안에 작성합니다.
try를 사용하여 함수를 호출하고, 오류가 발생하면 catch 블록에서 처리합니다.
이 구조를 통해 프로그램이 중단되지 않고 오류를 안전하게 처리할 수 있습니다.
*
오버로딩: 같은 이름의 함수가 여러 개 존재하며, 매개변수의 타입이나 개수로 구분됩니다.
중첩: 함수 안에 다른 함수를 정의하여 사용할 수 있으며, 중첩된 함수는 외부 함수의 범위 내에서만 호출 가능합니다.
Generic<>
소괄호 (): 함수 호출, 수학적 표현의 우선순위 지정.
대괄호 []: 배열, 리스트, 인덱스 접근.
중괄호 {}: 코드 블록 정의.
꺾쇠 괄호 <>: 제네릭 타입 정의, HTML 태그 등.
// 제네릭 함수를 정의합니다. T는 어떤 타입이든 될 수 있습니다.
func myPrint<T>(a: T, b: T) {
// b와 a를 출력합니다. 매개변수의 순서를 바꿉니다.
print(b, a)
}
// 정수 타입의 인수를 사용하여 함수 호출
myPrint(a: 1, b: 2) // 출력: 2 1
// 실수 타입의 인수를 사용하여 함수 호출
myPrint(a: 2.5, b: 3.5) // 출력: 3.5 2.5
// 문자열 타입의 인수를 사용하여 함수 호출
myPrint(a: "Hi", b: "Hello") // 출력: Hello Hi
빈배열 만들기 3가지 방법
// 방법 1: 타입과 함께 빈 배열을 선언합니다.
// 'x'는 Int 타입의 빈 배열입니다.
var x: [Int] = [] // 빈 배열 생성
// 방법 2: 타입을 명시하지 않고 배열을 생성합니다.
// 'y'는 Int 타입의 빈 배열입니다. Swift가 타입을 자동으로 추론합니다.
var y = [Int]() // 빈 배열 생성
// 방법 3: Array 제네릭 타입을 사용하여 빈 배열을 선언합니다.
// 'z'는 Int 타입의 빈 배열입니다. Array<Int>는 Int 타입의 요소를 가지는 배열을 의미합니다.
var z: Array<Int> = [] // 빈 배열 생성
컬렉션 타입(Collection Type)은 여러 값을 한 곳에 저장할 수 있는 데이터 구조를 의미
1. 배열 (Array)
정의: 순서가 있는 값들의 리스트입니다.
특징:
같은 타입의 요소를 저장합니다.
인덱스를 사용하여 요소에 접근합니다.
예시: [1, 2, 3, 4]
2. 집합 (Set)
정의: 중복되지 않는 값들의 모음입니다.
특징:
순서가 없으며, 각 요소는 유일합니다.
주로 중복 제거와 관련된 작업에 사용됩니다.
예시: Set([1, 2, 3])
3. 사전 (Dictionary)
정의: 키-값 쌍으로 이루어진 컬렉션입니다.
특징:
각 키는 유일하며, 이를 통해 값에 접근합니다.
키를 사용하여 데이터를 빠르게 검색할 수 있습니다.
예시: ["name": "Alice", "age": 30]
-Swift의 Array에서 자주 사용하는 프로퍼티와 메소드를간단정리
Array 프로퍼티 (속성)
count: 배열의 요소 개수.
예: let count = array.count
isEmpty: 배열이 비어 있는지 여부.
예: let isEmpty = array.isEmpty
first: 배열의 첫 번째 요소.
예: let firstElement = array.first
Array 메소드 (함수)
append(_:): 배열의 끝에 요소 추가.
예: array.append(newElement)
remove(at:): 특정 인덱스의 요소 제거.
예: array.remove(at: index)
contains(_:): 배열에 특정 요소가 있는지 확인.
예: let hasElement = array.contains(element)
sort(): 배열의 요소를 정렬.
예: array.sort()
// 타입 추론을 이용하여 빈 배열을 생성합니다.
// Swift가 자동으로 타입을 추론하여 Array<Int> 타입으로 설정됩니다.
let number = [1, 2, 3, 4]
// 타입을 명시적으로 지정하여 Int 타입의 배열을 생성합니다.
let odd: [Int] = [1, 3, 5]
// Array 제네릭 타입을 사용하여 Int 타입의 배열을 생성합니다.
let even: Array<Int> = [2, 4, 6]
// number의 타입을 출력합니다. 결과는 Array<Int>입니다.
print(type(of: number)) // 출력: Array<Int>
// number 배열의 내용을 출력합니다.
print(number) // 출력: [1, 2, 3, 4]
// odd의 타입을 출력합니다. 결과는 Array<Int>입니다.
print(type(of: odd)) // 출력: Array<Int>
// odd 배열의 내용을 출력합니다.
print(odd) // 출력: [1, 3, 5]
// even의 타입을 출력합니다. 결과는 Array<Int>입니다.
print(type(of: even)) // 출력: Array<Int>
// even 배열의 내용을 출력합니다.
print(even) // 출력: [2, 4, 6]
// 문자열 배열을 생성합니다. 타입은 자동으로 추론됩니다.
let animal = ["dog", "cat", "cow"]
// animal의 타입을 출력합니다. 결과는 Array<String>입니다.
print(type(of: animal)) // 출력: Array<String>
// animal 배열의 내용을 출력합니다.
print(animal) // 출력: ["dog", "cat", "cow"]
빈 배열(empty array) 주의 사항
var number : [Int] = []
//빈 배열을 let으로 만들 수는 있지만 초기값에서 변경 불가이니 배열의 의미 없음
var odd = [Int]() //빈배열은 let이 아닌 var로 써야됨, 가장 많이 사용
var even : Array<Int> = Array()
print(number) //[]
//print(number[0]) //오류, 빈 배열을 값을 넣은 다음에 접근
number.append(100) //let으로 선언한 불변형 배열이라 추가 불가능, 반드시 append를 통해 방을 만들어야함, append는 하면할수록 방이 늘어남
//error: cannot use mutating member on immutable value: 'number' is a 'let' constant
print(number[0])
number.append(200)
print(number[0], number[1],number)
가변형(mutable)
배열의 내용을 변경할 수 있는 형태
var animal = ["dog", "cat", "cow"]
animal.append("bird") // 배열에 "bird" 추가 가능
print(animal) // 출력: ["dog", "cat", "cow", "bird"]
불변형 (immutable)
초기화 후 변경 불가
let animal1 = ["dog", "cat", "cow"]
// animal1.append("bird") // 오류 발생: 변경할 수 없음
print(animal1) // 출력: ["dog", "cat", "cow"]
빈 배열 주의사항
var number: [Int] = [] // Int 타입의 빈 배열을 var로 선언
// number[0] = 1 // 오류 발생: 빈 배열이므로 직접 접근할 수 없음
// append() 메소드를 사용하여 배열에 값을 추가
number.append(1) // 1을 배열에 추가
print(number) // 출력: [1]
// 이제 배열에 값이 있으므로, 인덱스를 사용하여 값을 변경할 수 있음
number[0] = 10 // 첫 번째 요소를 10으로 변경
print(number) // 출력: [10]
빈 배열: 초기 상태에서 요소가 없으므로 직접 인덱스를 사용하여 값을 설정할 수 없습니다.
append(): 배열에 요소를 추가하는 메소드로, 이 메소드를 사용해야만 배열에 값을 넣을 수 있습니다.
인덱스 접근: 배열에 요소가 추가된 후에는 인덱스를 사용하여 값을 수정할 수 있습니다.
Array(repeating:count:) 특정값(repeating)으로 원하는 개수(count)만큼 초기화
// Int 타입의 배열을 5개의 0으로 초기화
var x = [0, 0, 0, 0, 0]
print(x) // 출력: [0, 0, 0, 0, 0]
// Array 생성자를 사용하여 0으로 초기화된 배열을 생성
var x1 = Array(repeating: 0, count: 5)
print(x1) // 출력: [0, 0, 0, 0, 0]
// [Int] 타입의 배열을 3개의 1로 초기화
var x2 = [Int](repeating: 1, count: 3)
print(x2) // 출력: [1, 1, 1]
// [String] 타입의 배열을 4개의 "A"로 초기화
var x3 = [String](repeating: "A", count: 4)
print(x3) // 출력: ["A", "A", "A", "A"]
배열 항목 가져오기: for~in문
// 문자열 배열을 생성하여 색상 목록을 초기화
let colors = ["red", "green", "blue"]
print(colors) // 출력: ["red", "green", "blue"]
// 배열의 각 요소를 반복(iterate)하여 출력하는 for 루프
for color in colors {
print(color) // 각 색상을 출력
}
// 출력:
// red
// green
// blue
항목이 몇 개인지(count), 비어있는지(isEmpty) 알아내기
// Int 타입의 배열을 초기화
let num = [1, 2, 3, 4]
// 빈 Int 배열을 생성
var x = [Int]()
// num 배열이 비어있는지 확인하고 출력
print(num.isEmpty) // 배열이 비어있나? false (num 배열에는 요소가 있음)
// x 배열이 비어있는지 확인하고 출력
print(x.isEmpty) // 배열이 비어있나? true (x는 빈 배열)
// num 배열이 비어있으면 메시지를 출력
if num.isEmpty {
print("비어 있습니다") // num 배열이 비어있다면 이 메시지가 출력됨
} else {
// num 배열의 요소 개수를 출력
print(num.count) // 배열 항목의 개수 (출력: 4)
}
first와 last 프로퍼티
// Int 타입의 배열을 초기화
let num = [1, 2, 3, 4]
// 빈 Int 배열을 생성
let num1 = [Int]()
// num 배열의 첫 번째 요소와 마지막 요소를 출력
// Optional로 감싸져서 출력됨
print(num.first, num.last) // 출력: Optional(1) Optional(4)
// num1 배열은 빈 배열이므로 첫 번째와 마지막 요소는 nil
print(num1.first, num1.last) // 출력: nil nil
// num 배열의 첫 번째와 마지막 요소를 안전하게 추출
if let f = num.first, let l = num.last {
// f와 l이 각각 첫 번째와 마지막 요소를 가리킴
print(f, l) // 출력: 1 4
}
// 배열의 first와 last는 둘 다 일반적으로 옵셔널 값으로 나옴
// 빈 배열이기 때문
첨자(subscript)로 항목 접근(셤)
// Int 타입의 배열을 초기화
var num = [1, 2, 3, 4]
// 배열의 첫 번째와 네 번째 요소를 출력
print(num[0], num[3]) // 출력: 1 4
// 배열의 첫 번째 요소를 안전하게 출력 (옵셔널 언래핑)
print(num.first!) // 출력: 1
// for 루프를 사용하여 배열의 모든 요소를 출력
for i in 0...num.count-1 {
print(num[i]) // 출력: 1, 2, 3, 4 (각 요소를 한 줄씩 출력)
}
// 배열의 일부 범위를 출력 (1번과 2번 인덱스의 요소)
print(num[1...2]) // 출력: [2, 3]
// 배열의 0, 1, 2 인덱스 요소를 [10, 20, 30]으로 교체
num[0...2] = [10, 20, 30]
// 변경된 배열을 출력
print(num) // 출력: [10, 20, 30, 4]
Array: 추가 /제거
// let x = [1, 2, 3, 4] // 불변 배열은 초기값에서 변경 불가
// x.append(5) // 오류 발생: let으로 선언된 배열에 추가할 수 없음
// 가변 배열을 초기화
var num = [1, 2, 3]
print(num) // 출력: [1, 2, 3]
// 배열에 4를 추가
num.append(4)
print(num) // 출력: [1, 2, 3, 4]
// 여러 요소를 배열의 끝에 추가
num.append(contentsOf: [6, 7, 8])
print(num) // 출력: [1, 2, 3, 4, 6, 7, 8]
// 5를 4번 인덱스에 삽입
num.insert(5, at: 4)
print(num) // 출력: [1, 2, 3, 4, 5, 6, 7, 8]
// 3번 인덱스의 요소를 제거
num.remove(at: 3)
print(num) // 출력: [1, 2, 3, 5, 6, 7, 8]
// 마지막 요소를 제거
num.removeLast()
print(num) // 출력: [1, 2, 3, 5, 6, 7]
// 배열에서 2의 첫 번째 인덱스를 찾기
print(num.firstIndex(of: 2)) // 출력: Optional(1), 2는 1번 인덱스에 위치
// 2의 인덱스를 안전하게 가져와서 값을 20으로 변경
if let i = num.firstIndex(of: 2) {
num[i] = 20 // num[1] = 20
}
print(num) // 출력: [1, 20, 3, 5, 6, 7]
// 배열을 자신과 더하여 중복된 요소를 만듦
num = num + num
print(num) // 출력: [1, 20, 3, 5, 6, 7, 1, 20, 3, 5, 6, 7]
// [8, 9]를 배열에 추가
num += [8, 9]
print(num) // 출력: [1, 20, 3, 5, 6, 7, 1, 20, 3, 5, 6, 7, 8, 9]
// 배열의 모든 요소를 제거
num.removeAll()
print(num) // 출력: []
let x: 주석 처리된 불변 배열. 변경할 수 없음을 설명합니다.
var num: 가변 배열을 초기화하여 요소를 추가하고 수정할 수 있습니다.
append(): 배열의 끝에 요소를 추가합니다.
append(contentsOf:): 여러 요소를 한 번에 추가합니다.
insert(): 특정 인덱스에 요소를 삽입합니다.
remove(at:): 특정 인덱스의 요소를 제거합니다.
removeLast(): 배열의 마지막 요소를 제거합니다.
firstIndex(of:): 특정 값의 첫 번째 인덱스를 찾습니다.
if let: 안전하게 옵셔널 값을 언래핑하여 요소를 수정합니다.
num + num: 배열을 자신과 더하여 중복된 요소를 만듭니다.
+=: 배열에 여러 요소를 추가합니다.
removeAll(): 배열의 모든 요소를 제거합니다.
Array는 구조체이므로 값 타입
// Int 타입의 배열을 초기화
var num = [1, 2, 3]
// num 배열의 복사본을 x에 할당. x는 num과 별개의 배열
var x = num
// num 배열의 첫 번째 요소를 100으로 변경
num[0] = 100
// num 배열을 출력
print(num) // 출력: [100, 2, 3]
// x 배열을 출력
print(x) // 출력: [1, 2, 3] (x는 num의 복사본이므로 원래 값 유지)
배열(Array)에서 최댓값 최솟값 구하기
var num = [1,2,3,10,20]
print(num)
print(num.min())
print(num.max())
print(num.min()!)
print(num.max()!)
Array 요소의 정렬
var num = [1,5,3,2,4]
num.sort() //오름차순 정렬하여 원본 변경
print(num) //[1, 2, 3, 4, 5]
num[0...4] = [2,3,4,5,1]
num.sort(by:>) //내림차순 정렬하여 원본 변경
print(num) //[5, 4, 3, 2, 1]
num[0...4] = [2,3,4,5,1]
num.reverse() //반대로 정렬하여 원본 변경
print(num) //[1, 5, 4, 3, 2]
print(num.sorted()) //오름차순 정렬 결과를 리턴하고, 원본은 그대로, var x = num.sorted()
//[1, 2, 3, 4, 5]
print(num) //[1, 5, 4, 3, 2]
print(num.sorted(by:>)) //내림차순 정렬 결과를 리턴하고, 원본은 그대로
//[5, 4, 3, 2, 1]
print(num)//[1, 5, 4, 3, 2]
sort(): 배열을 직접 수정하여 정렬 (원본 변경).
sorted(): 새로운 배열을 반환하여 정렬 (원본 유지).
내림차순 정렬: sort(by: >) 또는 sorted(by: >)를 사용.
1. open
- 최고 수준의 접근 제어입니다.
- 모듈 외부에서도 해당 클래스나 메서드를 사용할 수 있고, 상속 및 오버라이드가 가능합니다.
- 예시: open class SomeClass {}
2. public
- 모듈 외부에서 사용할 수 있지만, 상속이나 오버라이드는 할 수 없습니다.
- 외부에서 접근할 수 있지만, 그 내부 동작을 변경할 수는 없어요.
- 예시: public class SomeClass {}
3. internal (기본값)
- 해당 모듈 내에서만 접근 가능합니다.
- 다른 모듈에서는 접근할 수 없으며, 기본적으로 internal로 설정됩니다.
- 예시: internal class SomeClass {} 또는 접근 제어를 생략한 경우
4. fileprivate
- 해당 파일 내에서만 접근 가능합니다.
- 다른 파일에서는 사용할 수 없고, 동일 파일 내에서만 제한적으로 사용됩니다.
- 예시: fileprivate class SomeClass {}
5. private
- 가장 제한적인 접근 제어입니다.
- 같은 블록(즉, 같은 클래스나 구조체 내) 또는 extension에서만 접근할 수 있습니다.
- 예시: private class SomeClass {}
6. package (Swift 6.0부터)
- 같은 패키지 내에서만 접근할 수 있습니다.
- 패키지 외부에서는 사용할 수 없습니다.
public class SomePublicClass {} // 외부에서 사용 가능
internal class SomeInternalClass {} // 같은 모듈 내에서만 사용 가능
fileprivate class SomeFilePrivateClass {} // 같은 파일 내에서만 사용 가능
private class SomePrivateClass {} // 같은 클래스나 extension에서만 사용 가능
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
Swift에서 기본 접근 제어는 **internal**입니다. 즉, 접근 제어를 명시적으로 지정하지 않으면 기본적으로 internal이 적용됩니다. 이 접근 수준은 해당 모듈 내에서만 사용할 수 있도록 제한됩니다.
internal 접근 제어의 특징:
- 같은 모듈 내에서 모든 소스 파일에서 접근할 수 있습니다.
- 다른 모듈(즉, 다른 앱이나 다른 프레임워크, 라이브러리)에서는 접근할 수 없습니다.
즉, internal 접근 수준은 프로젝트 내에서만 접근이 가능하고, 외부에서는 사용할 수 없다는 것입니다.
어디서 접근할 수 있나?
- 같은 프로젝트나 같은 프레임워크 내의 다른 파일에서 접근이 가능합니다.
- 다른 프레임워크나 앱에서는 접근할 수 없습니다.
'Swift' 카테고리의 다른 글
iOS프로그래밍 실무 5주차 (0) | 2025.04.02 |
---|---|
iOS실무 프로그래밍 4주차 (0) | 2025.03.26 |
iOS프로그래밍 실무 3주차 (0) | 2025.03.19 |
iOS 프로그래밍 실무 2주차 (0) | 2025.03.17 |
iOS 프로그래밍 실무 1주차 (0) | 2025.03.05 |