Object > Class : Instance

주방·2022년 7월 14일
0

Swift

목록 보기
7/17
post-thumbnail

#1. Checklist

  • Storyboard Reference
  • Opensource Lisence
  • Swift Package Manager
  • Major / Minor / Patch
  • Class vs. Struct
    • Inheritance
    • Override
    • Structure
    • Instance
    • Property, Method, Member
    • Instance
    • Initializer
    • Default Initializer
    • Memberwise Initializer
  • Any vs. AnyObject

1) Instance, Property, Method

  1. Instance
    • Swift에서는 클래스 / 구조체 / 열거형에서 생성된 객체를 '인스턴스'라고 한다.
    • 프로퍼티 기본값
      • 스위프트의 모든 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어야 한다. 프로퍼티에 미리 기본값을 할당해두면 인스턴스가 생성됨과 동시에 초기값을 지니게 된다.

        class PersonA {
          // 모든 저장 프로퍼티에 기본값 할당
          var name: String = "주영"
          var age: Int = 0
          var nickName: String = "주방"
        }
        //인스턴스 생성
        let jason: PersonA = PersonA()
        // 기본값이 인스턴스가 가져야 할 값이 아니라면, 생성된 인스턴스의 프로퍼티에 각각 값을 할당한다.
        jason.name = "이내"
        jason.age = 35
        jason.nickName = "꽃이내"
    • initializer
      • 프로퍼티 기본값을 지정하기 어려운 경우가 있다. 이때, init을 통해 인스턴스가 가져야 할 초기값을 전달할 수 있다.

        class PersonB {
          var name: String
          var age: Int
          var nickName: String
          // 이니셜 라이즈
          init(name: String, age: Int, nickName: String) {
            self.name = name
            self.age = age
            self.nickName = nickName
          }
        }
        // 그래서 인스턴스 생성할 때, 사용자가 직접 정보를 입력할 수 있도록 한다.
        let joo: PersonB = PersonB(name: "주영", age: 35, nickName: "주방")
      • 만약, 프로퍼티의 초기값이 필요 없을 때! 우리는 옵셔널을 사용할 수 있다.

        class PersonC {
          var name: String
          var age: Int
          var nickName: String?
          // 이니셜 라이즈 1
          init(name: String, age: Int, nickName: String) {
            self.name = name
            self.age = age
            self.nickName = nickName
          }
          // 이니셜 라이즈 2
          init(name: String, age: Int) {
            self.name = name
            self.age = age
          }
        }
        
        let jenny: PersonC = PersonC(name: "Jenny", age: 10)
        let mike: PersonC = PersonC(name: "Mike", age: 15, nikeName: "m")
  2. Property
    • 정의
      • 클래스 / 구조체 / 열거형과 연관된 정보 / 값을 의미한다.
      • 열거형 내부에서는 연산 프로퍼티만 구현할 수 있으며, 연산 프로퍼티는 var로만 선언할 수 있다.(읽기 전용)
      • 만약 읽기 전용으로 구현하려면 get블럭만 작성해주면 됩니다. 읽기, 쓰기 모두 가능하려면 get, set 블럭
    • 종류
      • 인스턴스 저장 프로퍼티
      • 타입 저장 프로퍼티
      • 인스턴스 연산 프로퍼티
      • 타입 연산 프로퍼티
      • 지연 저장 프로퍼티
    • 사용
      struct Student {
        // 인스턴스 저장 프로퍼티, 인스턴스 생성시 이미 구조체 내부에 인스턴스의 프로퍼티를 저장해놓았다.
        var name: String = "" // 빈값이다.
        var `class`: String = "Swift"
        var koreaAge: Int = 0
      
        // 인스턴스 연산 프로퍼티
        var westernAge: Int{
          get {
            return koreaAge - 1
          }
          set(inputValue){
            koreaAge = inputValue + 1
          }
        }
        // 타입 저장 프로퍼티
        static var typeDescription: String = "학생"
      
        //읽기 전용 타입 연산 프로퍼티
        // 읽기 전용에서는 get을 생략할 수 있습니다.
        static var selfIntroduction: String{
          return "학생타입니다."
        }
      }
      
      // 타입 연산 프로퍼티 사용
      print(Student.selfIntroduction) // 학생타입입니다.
      
      //인스턴스 생성
      var joobang: Student = Student()
      
      //인스턴스 저장 프로퍼티를 사용
      joobang.koreaAge = 10
      joobang.name = "주영"
  3. Method
    • 클래스 / 구조체 / 열거형과 관련된 함수라는 의미한다.

#참조1, #참조2

2) Object, Class, Instance의 차이?

  1. 개념
    • Object
      • 대상, 객체로 여긴다.
      • 객체와 객체 간의 프로그래밍 간의 중심이 된다.
      • 속성과 기능을 가지고 있다.
    • Class
      • 분류되는 특징이 있다. 설계도
    • Instance
      • 실체, 실례이다.
      • 대화간 실제의 형상을 의미한다.
  2. 형태
    • Object(대상) -> 클래스(설계도) -> 인스턴스(실체화) / 구현화하고 싶은 대상을 분류하여 설계도를 작성 후, 이를 실체화 시키는 것이다.
    • 우리가 이야기하고 싶은 대상에 대한 특징을 먼저 작성한다.(대상화)
    • 여러 특징 중 중복된 것들끼리 묶어 작성한다.(설계화)
    • 이를 바탕으로 실제의 것으로 만든다.(실체화)
  3. 방법
    • Class는 어떻게 분류할 수 있을까?)
      • 대상이 될 대상(Object)를 분류한다.
      • 예) 사람의 특징들을 하나씩 나눈다. 키, 나이, 인사할 수 있는 기능을 갖는다.
    • 설계도로 어떻게 Instance를 만들 수 있을까?
      • 사람의 특징을 작성한 설계도(class)를 가지고 '주영'이라는 세부 특징을 더해주어 진짜 '주영'을 만들어낸다.


#2. Assignment

  • Assignment 1. 기념일 계산기 기능 구현하기
    • 구현내용
    • DataPicker를 활용하여 원하는 날짜를 설정하고, 기준되는 기간만큼 디데이를 계산하여 UILabel에 날짜를 표시한다.
    • 세부사항은 Notion에 별도 정리하였음.


#3. 회고

  • 기능 구현에 앞서 정보를 찾으면서 느꼈던 것은 용어의 개념 정리가 안되어 이해하는데 어려움이 있었다. 예를 들어 프로퍼티의 할당이라던지, 인스턴스 생성이라는 표현을 혼용하였다. 이를 공부하고 기능을 구현하려고 정보를 찾으니 이해가 더 잘되었다.
  • 더불어 처음 IBAction - 메소드 내에서 날짜 설정, 디데이 계산, 라벨내 표시 이렇게 세가지를 한곳에서 처리하니 객체간의 기능을 분할하는 것이 재사용성을 높일 수 있을 것이라 생각되어 리팩토링을 진행하였음. 처음 세가지의 기능을 어떻게 나눌지 고민하고, 후에 중복되는 프로퍼티를 정하고 할당 후 메소드를 분리할 수 있었음.
  • 상위 레벨의 메소드에서 하위 레벨(1. 날짜 설정 및 Date타입 변환, 2. 디데이 계산 및 라벨내표시)를 흐름을 관리할 수 있어 보다 보기 좋은 코드가 된 것 같음.
  • 기능레벨에서 분류가 명확해야 코드레벨의 구현이 가능하다는 것을 알 수 있었음.

0개의 댓글