SWIFT

    [Swift] 접근 제어자(Access Control)의 내용과 원칙에 대한 예제

    접근 제어자 생각보다 접근 제어자를 설명하기에 많은 내용이 필요한것 같아 정리해봅니다. 다양한 예제를 포함해서 정리해보겠습니다. Swift의 접근제어자는 단계별로 5개의 단계가 있습니다. 하나씩 정리해보자면 open 모듈 외부에서 접근 가능합니다. open만이 다른 모듈에서 상속/재정의가 가능합니다. 상속 재정의가 가능하므로 클래스에서만 사용가능합니다. 만약 구조체에서 open을 사용시 에러가 발생합니다. public 모듈 외부에서 접근 가능 클래스를 public으로 선언한다면 상속, 재정의가 불가능합니다. internal 접근제어자를 설정해주지 않으면 default로 설정되는 접근제어자입니다. 같은 모듈 내에서 어디서든 접근 가능합니다. 같은 모듈 내에서 상속/재정의가 가능합니다. fileprivate..

    [Swift] COW(Copy on Write)의 Deep한 내용까지 알아봅시다!

    COW(Copy On Write) Class와 Struct를 방금 공부하신 분이라면 혼동이 올 수 있으니 Class의 Memory관리(Reference Count라던지..)의 공부가 끝나신 후 보시는게 좋을 것 같습니다. 제가 공부한 내용에 틀린 부분이 있다면 지적해주세요! Cow는 Write가 발생했을 때 Copy를 수행하는 기능으로 메모리 공간 낭비를 막기 위해 사용됩니다. 값타입(struct)의 경우 값을 복사하여 값의 참조를 전달하는게 아닌 실제 메모리에 저장된 "값"을 복사하게 됩니다. 뭐 여기까진 모두가 아는 사실. 여기서부터 COW의 내용이 나오게 됩니다. 매번 모든 값을 복사할 경우 원본의 변경된 값이 없음에도 매번 새로운 공간을 할당하여 불필요한 메모리의 낭비가 발생할 수 있습니다. va..

    [Swift] async / await 과 async에서의 Suspend

    우선 동기 비동기를 복습해보자. 동기 어떤 작업을 실행하고 해당작업이 끝날 때 까지 기다린 후 다음 작업을 실행함. 비동기 어떤 작업을 실행하고 해당 작업이 끝남을 기다리지 않고 바로 다음 작업을 실행함. async / await 비동기 작업을 동기작업 처럼 처리하는 기능을 제공함. Swift 5.5에서 탄생 비동기 코드를 동기인것마냥 작성할 수 있다 Completion Handler의 문제점 기존의 CompletionHandler는 에러일 때 Completion Handler 호출을 잊어버리는 문제 gaurd let else 문에서 호출을 깜빡함. 동기적으로 수행해야할 비동기 함수가 많을 경우 depth가 깊어지는 문제 가독성이 떨어지는 문제 실패, 성공에 따라 분기가 복잡해지는 문제 이처럼 다양한 문..

    [Swift] 타입과 다형성

    다형성 하나의 객체(인스턴스)가 여러가지 타입의 형태로 표현될 수 있음을 의미. 클래스의 상속으로 수직적으로 구현될 수 있음 값 타입의 경우 프로토콜의 채택으로 구현될 수 있음. class Person { var id = 0 var name = "이름" var email = "abc@gmail.com" func walk() { print("사람이 걷는다") } } class Student: Person { // id // name // email var studentId = 1 override func walk() { //재정의 메서드, walk() -1 print("학생이 걷는다")//원래는 사람이 걷는다인데 "학생이 걷는다"로 수정함 } func study() {//재정의 메서드, study() -1..

    [Swift] defer문

    defer 사전적 의미: 미루다, 연기하다 자신의 실행을 함수 맨 마지막으로 미루는 클로저 보통 함수 내부안에서 작성되며 작성된 위치와 상관없이 함수 종료 직전에 실행된다. 예시 func test1() { print("TEST #1") defer { print("TEST #2") } print("TEST #3") } test1() 이렇게 defer문을 사용하면? 쉽게 예측할 수 있다. 결과와 같듯이 2가 마지막에 출력된다. defer문 내부에 작성된 클로저는 함수 실행 종료 직전에 실행되기 때문이다. defer문이 실행되지 않는 경우 1. defer를 읽기 전에 함수가 종료(return)되는 경우 func test2() { print("TEST #1") return defer { print("TEST #..

    POP와 OOP의 차이

    프로토콜지향 프로그래밍 POP(Protocol Oriented Programming) 프로토콜 중심의 프로그래밍으로 확장을 통한 수평 구조로 타입을 확장하는 방식으로 다형성을 구현한다 프로토콜에 정의된 인터페이스를 직접 구현하기 때문에 필요치 않은 프로퍼티나 메서드를 구현하지 않을 수 있다. 참조, 값타입을 모두 지원하며 상속의 경우 하나의 슈퍼클래스를 상속할 수 있지만 프로토콜의 경우 다양한 프로토콜을 채택할 수 있다. 객체지향 프로그래밍 OOP(Obeject Oriented Programming) 객체 중심 프로그래밍으로서 슈퍼클래스의 상속을 통하여 수직구조로 타입을 확장하는 방식의 다형성 구현한다. 객체 지향적으로 아래에서 부터 위로 접근하는 상향식 접근 구조이다. 함수나 생성자, 연산자를 오버로드..

    Singleton 패턴을 활용하는 경우

    Singleton 싱글톤 패턴은 특정 용도의 객체를 하나 생성해서 여러 상황에 공용으로 사용하고 싶을 때 사용하는 방법이다. 인스턴스가 하나만 존재하는 것을 보장하게되며, 주로 환경설정, 네트워크객체, 로그인 정보 등을 특정 용도로 생성해둔 객체에 넣어두고 필요할 때 접근한다. 인스턴스가 하나만 존재하는것을 보장하므로 메모리 낭비를 방지할 수 있고 데이터를 공유할 수 있다는 장점이 있다. class Singleton { static let shared = Singleton() let value = 3 private init(){} } Singleton.shared.value static을 활용해 인스턴스를 저장할 타입 프로퍼티를 생성. init을 호출해 또 다른 인스턴스를 생성하는것을 막는다. 메모리가 ..

    [Swift] (ViewController) -> () -> ViewController 에러?? 초기화 전 self접근

    RxDataSource를 사용하던 중 처음보는 오류를 만났다. private let dataSource = RxCollectionViewSectionedReloadDataSource(configureCell: { [weak self] (datasource, collectionView, indexPath, item) in guard let self = self else { return UICollectionViewCell() } [weak self]로 캡처한 self가 ViewController가 아닌 (ViewController) -> () -> ViewController 타입의 클로저가 되는것.. 원인은 ViewController(클래스) 가 초기화되기 이전에 self로 접근해서 그런것이다 바보같이 그..

    [Swift] 메타타입(Metatype)

    메타타입 메타타입이란 타입의 타입이다. 클래스의 타입, 구조체의 타입, 열거형 타입, 프로토콜의 타입도 메타타입이다. 어떤 클래스 SomeClass의 메타타입은 SomeClass.Type이다. 어떤 프로토콜 SomeProtocol의 메타타입은 SomeProtocol.Protocol이다. 어떤 타입에 .self를 붙이면 해당 타입을 어떤 값으로 접근할 수 있다. 예를 들어 SomeClass.self는 SomeClass의 인스턴스를 리턴하는게 아니라 SomeClass 라는 것 자체를 리턴한다.(프로토콜도 마찬가지)

    [Swift] 연산자 메서드와 사용자 정의 연산자

    연산자 메서드 struct Vector2D{ var x = 0.0 var y = 0.0 } let vector1 = Vector2D(x: 3.0, y: 1.0) let vector2 = Vector2D(x: 1.0, y: 0.5) extension Vector2D{ // static(타입)메서드인 이유는 서로 다른 인스턴스를 더하기 때문에 타입 메서드이다. // 중위연산자⭐️(infix)는 생략이 가능하다 static func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D{ return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } // let plusVector = vector1 + vector2 static func - (lhs..