인스턴스는 하나 이상의 참조자(소유자=owner) 가 있어야 메모리에 유지가 됨.
소유자가 없다면 즉시 메모리에서 제거.이때 인스턴스를 참조하고 있는 소유자의 개수를
reference count라고 함.
reference count > 0이면 메모리에서 사용reference count = 0이면 메모리에서 삭제더 이상 사용하지 않을 인스턴스의
reference count가 0보다 크지 않도록 주의
// MARK: - 실습 1: RC
class MyClass {
init() {
print("MyClass 생성")
}
deinit {
print("MyClass 소멸")
}
}
// Reference Count = 1
var myClass: MyClass? = MyClass()
// Reference Count = 2
var myClass2 = myClass
myClass = nil
//**********
// 실행 결과
// MyClass 생성
// MARK: - 실습 2: 클로저 캠처링
class Adam {
let mbti = "ENTJ"
init() {
print("클래스 생성")
}
deinit {
print("클래스 소멸")
}
}
// adam rc = 1
var adam: Adam? = Adam()
// 클로저 내부에서 adam 캡처. rc 1 증가.
// adam rc = 2
let printMbti: () -> () = { [adam] in
guard let adam else { return }
print("adam's mbti = \(adam.mbti)")
}
// weak 사용 시, 약한 참조를 사용하여 rc가 증가하지 않음
//let printMbti: () -> () = { [weak adam] in
// guard let adam else { return }
// print("adam's mbti = \(adam.mbti)")
//}
printMbti()
// adam rc = 2-1 = 1
adam = nil
//**********
// 실행 결과
// 클래스 생성
// adam's mbti = ENTJ
// MARK: - 실습3: 순환참조
class Person {
var pet: Dog?
init() {
print("Person 클래스 생성")
}
deinit {
print("Person 클래스 소멸")
}
}
class Dog {
var owner: Person?
init() {
print("Dog 클래스 생성")
}
deinit {
print("Dog 클래스 소멸")
}
}
// person rc = 1
var person: Person? = Person()
// dog rc = 1
var dog: Dog? = Dog()
// dog rc = 2
person?.pet = dog
// person rc = 2
dog?.owner = person
// person rc = 2-1 = 1
person = nil
// dog rc = 2-1 = 1
dog = nil
// **********
// Person 클래스 생성
// Dog 클래스 생성
프로그래머스 [링크 이동](https://school.programmers.co.kr/learn/courses/30/lessons/12909
괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어
- "()()" 또는 "(())()" 는 올바른 괄호입니다.
- ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열
s가 주어졌을 때, 문자열s가 올바른 괄호이면true를return하고, 올바르지 않은 괄호이면false를return하는solution함수를 완성해 주세요.
1 ≤
order≤ 1,000,000
import Foundation
func solution(_ s:String) -> Bool
{
var ans:Bool = false
if s.first == "(" && s.last == ")" {
if s.filter { $0 == "(" }.count == s.filter { $0 == ")" }.count {
ans = true
}
}
return ans
}


( 가 나오면 +1을 하고, ) 가 나오면 -1 했다.false를 리턴 시켰다.import Foundation
func solution(_ s:String) -> Bool
{
// 문자열 s의 길이 : 100,000 이하의 자연수
// 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.
guard s.count >= 1 && s.count <= 100000 && s.allSatisfy ({ $0 == "(" || $0 == ")"}) else { return false }
var ans:Bool = false
var count = 0
for i in s {
if i == "(" {
count += 1
} else {
count -= 1
}
if count < 0 {
return false
}
}
if count == 0 {
ans = true
}
return ans
}
