Singleton

박인준·2019년 12월 6일
0

Swift

목록 보기
10/21

Singleton

  • 특정 클래스의 인스턴스에 접근할 때 항상 동일한 인스턴스만을 반환하도록 하는 설계 패턴
  • 한 번 생성된 이후에는 프로그램이 종료될 때까지 항상 메모리에 상주
  • 어플리케이션에서 유일하게 하나만 필요한 객체에 사용
  • UIApplication, AppDelegate 등

Syntax

/*
 iOS 싱글톤 사용 예
 */
let screen = UIScreen.main
let userDefaults = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default

@Singleton Class 예제

/*
static 전역 변수로 선언한 것은 지연(lazy) 생성되므로
 처음 Singleton을 생성하기 전까지 메모리에 올라가지 않음
 */

class SingletonClass {
  static let shared = SingletonClass() // static -> type property ; 실제로 사용될때 생성됨(지연생성)
  var x = 0
}


let singleton1 = SingletonClass.shared // => 여기까진 SingletonClass() 와 동일
singleton1.x = 10

let singleton2 = SingletonClass.shared
singleton2.x = 20

singleton1.x   //
singleton2.x   //

SingletonClass.shared.x = 30

SingletonClass.shared.x  //
singleton1.x  //
singleton2.x  //

@다음과 같은 경우는 어떻게 될까?

SingletonClass().x = 99 // 변수에 따로 저장히자 않았기 때문에 생성과 동시에 삭제
SingletonClass().x   //
singleton1.x  //
singleton2.x  //

=> 결과는 이렇다


@Singleton을 사용하지 않고 코드 작성시

class User {
  var friends: [Friends] = []
  var blocks: [Friends] = []
}

struct Friends: Equatable {
  let name: String
}

/*
 ↑ User와 Friends 타입은 수정 금지
 ↓ FriendList 타입은 수정 허용
 */

class FriendList {
    var user: User
    init(user: User) {
        self.user = user
    }
  func addFriend(name: String) {
    let a = Friends(name: name)
    user.friends.append(a)
    // 호출 시 해당 이름의 친구를 friends 배열에 추가
  }
  
  func blockFriend(name: String) {
    let a = Friends(name: name)
    if let index = user.friends.firstIndex(of: a) {
        user.friends.remove(at: index)
    }
    if !user.blocks.contains(a) {
        user.friends.append(a)
    }
    
    // 호출 시 해당 이름의 친구를 blocks 배열에 추가
    // 만약 friends 배열에 포함된 친구라면 friends 배열에서 제거
  }
}


//

let user = User()

var friendList = FriendList(user: user)
friendList.addFriend(name: "원빈")
friendList.addFriend(name: "장동건")
friendList.addFriend(name: "정우성")
user.friends   // 원빈, 장동건, 정우성

friendList.blockFriend(name: "정우성")
user.friends   // 원빈, 장동건
user.blocks    // 정우성

@Singleton 사용시

class User {
  static let shared = User()
  var friends: [Friends] = []
  var blocks: [Friends] = []
}

struct Friends: Equatable {
  let name: String
}


class FriendList {
  func addFriend(name: String) {
    let user = User()
    let friend = Friends(name: name)
    user.friends.append(friend)
    // "원빈", "장동건", "정우성" 3명을 친구로 추가했을 때
    // 최종적으로 user.friends 에 들어있는 friend 의 숫자는?
    
    
//    let user = User.shared
//    let friend = Friends(name: name)
//    user.friends.append(friend)
  }
  
  
  func blockFriend(name: String) {
    let friend = Friends(name: name)
    
    if let index = User.shared.friends.firstIndex(of: friend) {
      User.shared.friends.remove(at: index)
    }
    if !User.shared.blocks.contains(friend) {
      User.shared.blocks.append(friend)
    }
  }
}


var friendList = FriendList()
friendList.addFriend(name: "원빈")
friendList.addFriend(name: "장동건")
friendList.addFriend(name: "정우성")
User.shared.friends


friendList.blockFriend(name: "원빈")
User.shared.friends
User.shared.blocks

=> 복습으로 제학습이 필요함!!

profile
iOS 개발자가 되기 위해

0개의 댓글