[내일배움캠프 32일차] Ch.3 앱 개발 숙련2 + 알고리즘

NH·2025년 4월 15일

내일배움캠프

목록 보기
32/62
post-thumbnail

📱 앱 개발 숙련 강의

👨‍💻 강의 정리: 메모리 관리 이해

  • Swift 의 메모리 관리 시스템의 핵심이 되는 개념인 Reference Counting(RC) 에 대해 공부

    인스턴스는 하나 이상의 참조자(소유자=owner) 가 있어야 메모리에 유지가 됨.
    소유자가 없다면 즉시 메모리에서 제거.

    이때 인스턴스를 참조하고 있는 소유자의 개수reference count 라고 함.

    • reference count > 0 이면 메모리에서 사용
    • reference count = 0 이면 메모리에서 삭제

    더 이상 사용하지 않을 인스턴스의 reference count0보다 크지 않도록 주의

🔹 실습 1

// 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 생성

🔹 실습 2

// 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

배운점

  • 개발자는 weak 키워드 등으로 RC를 관리하여 메모리 누수 상황이 발생하지 않게 해야된다!

🔹 실습 3

// 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가 올바른 괄호이면 truereturn 하고, 올바르지 않은 괄호이면 falsereturn 하는 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 했다.
  • 정상적인 괄호면 합이 0이 된다.
  • 중간에 음수가 나오면 바로 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
}

결과: 성공


profile
iOS 개발 블로그

0개의 댓글