iOS 공부하는 감자

Day14) 객체지향 프로그래밍 본문

22 베이직 챌린지

Day14) 객체지향 프로그래밍

DongTaTo 2022. 1. 16. 16:01
반응형

객체지향 프로그래밍

  • 프로그래밍에는 코드를 더 효율적으로 만들고 작성하기 위한 다양한 패러다임이 존재한다.
  • 절차지향, 객체지향, 함수형 등이 있는데, Swift에서는 객체지향 프로그래밍과 함수형 프로그래밍 패러다임을 채택하여 사용한다.
  • Swift에서는 객체라는 표현을 실제로 잘 사용하진 않는다. (인스턴스라고 부름: 이유는 후술)
  • 객체지향 프로그래밍에서는 각 객체가 서로 메시지를 주고 받으며 데이터를 처리한다. 즉, 프로그램 실행의 주된 요소가 객체이다.

 

객체

  • 객체지향 프로그래밍에서 객체는 상태와 상태(프로퍼티)와 행위(메서드)로 이루어진 것을 말한다.
  • 즉, 관련있는 변수나 상수와 메서드를 모아서 한번에 관리하기 위해 만들어진다.
  • Swift에서 객체는 클래스의 인스턴스를 의미한다.

 

객체 vs 인스턴스

  • 객체는 전통적으로 클래스의 인스턴스를 말하는데, Swift에서 클래스와 구조체는 거의 동일한 기능을 수행한다.
  • 스위프트 공식 문서에서도 다른 언어보다 Swift에서 클래스와 구조체는 기능적으로 흡사하기 때문에 더 일반적인 용어인 인스턴스를 사용하여 설명하고 있다.
    https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html

 

 

인스턴스(객체)의 설계

  • 인스턴스는 결국 클래스나 구조체를 기반으로 생성되기 때문에 객체의 설계는 곧 타입의 설계와 연관되어 있다.
  • 타입의 설계는 다음의 네 가지 과정을 거친다.
    1. 일반화 : 만들어질 인스턴스들의 공통된 특징을 뽑아낸다.
    2. 추상화 : 공통된 특성 중 필요한 부분만 추출한다.
    3. 은닉화 : 주요 사항이 겉으로 드러나지 않도록 감추는 것 (접근제어)
    4. 캡슐화 : 은닉화를 통해 감추어진 내용들을 외부에서 사용할 수 있도록 방법을 제공하고 외부와 소통하는 것
  • 타입 설계 예시
    struct Home {
        var numberOfRoom: Int
        var numberOfBathroom: Int
        // 은닉화
        private var isDoorOpen: Bool = false
        
        init(numberOfRoom: Int, numberOfBathRoom: Int) {
            self.numberOfRoom = numberOfRoom
            self.numberOfBathroom = numberOfBathRoom
        }
        
        // 캡슐화
        mutating func doorOpenAndClose() {
            switch isDoorOpen {
            case true:
                isDoorOpen = false
            case false:
                isDoorOpen = true
            }
        }
    }
    
    struct Person {
        var name: String
        var age: Int
        var house: Home
    }
    
    
    var dongHouse: Home = Home(numberOfRoom: 3, numberOfBathRoom: 2)
    var dong: Person = Person(name: "dong", age: 25, house: dongHouse)
    
    
    print(dong.house)  // Home(numberOfRoom: 3, numberOfBathroom: 2, isDoorOpen: false)
    dong.house.doorOpenAndClose()
    print(dong.house)  // Home(numberOfRoom: 3, numberOfBathroom: 2, isDoorOpen: true)

 

 

부모 클래스, 자식 클래스, 익스텐션 실습

class House {
    internal private(set) var numberOfRoom: Int
    internal private(set) var houseSize: Int
    
    init (numberOfRoom: Int, houseSize: Int) {
        self.numberOfRoom = numberOfRoom
        self.houseSize = houseSize
    }
}


class Apartment: House {
    let floor: Int
    
    init (floor: Int, numberOfRoom: Int, houseSize: Int) {
        self.floor = floor
        super.init(numberOfRoom: numberOfRoom, houseSize: houseSize)
    }
}

var dongHouse: Apartment = Apartment(floor: 12, numberOfRoom: 3, houseSize: 2)

print(dongHouse.numberOfRoom)  // 3


// extension은 소급 적용되어 이미 생성되었던 인스턴스에서도 확장된 내용을 사용할 수 있다.
extension House {
    func makeRoom() {
        self.numberOfRoom += 1
    }
}


dongHouse.makeRoom()


print(dongHouse.numberOfRoom)  // 4

 

 


알고리즘

https://co-dong.tistory.com/26

 

나머지가 1이 되는 수 찾기

나머지가 1이 되는 수 찾기 자연수 n이 매개변수로 주어집니다. n을 x로 나눈 나머지가 1이 되도록 하는 가장 작은 자연수 x를 return 하도록 solution 함수를 완성해주세요. 답이 항상 존재함은 증

co-dong.tistory.com

https://co-dong.tistory.com/27

 

최소 직사각형

최소직사각형 명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러

co-dong.tistory.com

https://co-dong.tistory.com/28

 

두 정수 사이의 합

문제 설명 두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다. 제한 조건 a와 b가

co-dong.tistory.com

 

반응형

'22 베이직 챌린지' 카테고리의 다른 글

Day19) HIG (Human Interface Guidelines)  (0) 2022.01.21
Day15) Xcode 디버깅  (0) 2022.01.17
Day13) 타입캐스팅  (0) 2022.01.15
Day12) 옵셔널  (0) 2022.01.14
Day11) 프로토콜, 익스텐션  (0) 2022.01.13