ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Swift] 객체 지향 프로그래밍
    iOS/Swift 2022. 9. 1. 23:55

     

    객체 지향 프로그래밍

    [예시]

    - 학사 관리 시스템

    • 학생의 이름, 전공
    • 수강신청 과목
    • 수강신청 하기

     

    - 게임

    • 캐릭터
    • 캐릭터의 능력
    • 캐릭터 이동, 공격, 방어 등

     

    객체 지향 프로그래밍 작성 방법

    [객체의 속성]

    가로, 세로 길이가 10, 20인 사각형

     

    사각형은 객체이고, 가로 세로 길이는 사각형 객체가 가진 속성이다

     

     

    [객체의 행위]

    • 사각형의 넓이 계산
    • 사각형은 정사각형인지 판단

    사각형을 다루는 애플리케이션

    클래스 객체의 타입 정의
    프로퍼티 객체의 속성 정의
    메소드 객체의 행위 정의
    • 클래스에서 객체 생성
    • 객체 생성
    • 객체에 속성 설정
    • 객체 메소드 실행

    클래스 정의와 객체 생성

     

    클래스 정의

    class Rectangle {
    }

     

    객체 생성

    var rect = Rectangle()
    
    // var: 새로운 객체 대입 가능
    rect = Rectangler()
    
    // let: 새로운 객체 대입 불가
    let rect2 = Rectangle()
    // rect2 = Rectangler() 불가능

     


    프로퍼티

    클래스 내에 작성하는 변수

     

    객체의 데이터 저장/계산 프로퍼티 값을 저장하고 읽는 행위

     

    프로퍼티의 종류

    저장 프로퍼티 계산 프로퍼티
    데이터를 저장하는 용도 데이터 저장하지 않음
    데이터의 읽기/쓰기 행위 프로퍼티 읽기/쓰기 코드 작성
    객체 생성시 초기화되며, 초기화 방법(이니셜라이저)필요 초기화X

     

    사각형 클래스 프로퍼티 예시

    저장 프로퍼티

    • 가로, 세로 길이

    계산 프로퍼티

    • 크기 계산
    • 정사각형 여부

    저장 프로퍼티

    // =========== < 저장 프로퍼티 > ===========
    class MyClass {
    
    // 1.초기값을 설정한 프로퍼티
    var intProperty = 0
    
    // 2. 옵셔널 프로퍼티(초기값 없어도 OK)
    var floatProperty = Float?
    
    // 3. 초기값이 없는 프로퍼티(이니셜라이저 구현 필요)
    var strProperty = String
    }
    
    
    // =========== < 저장 프로퍼티 사용 > ===========
    
    // 인스턴스 생성
    var obj = MyClass()
    
    // 인스턴스 사용
    obj.intProperty = 10
    obj.floatProperty = 3.1
    
    let val = obj.floatProperty // Optional(3.1)

     


    계산 프로퍼티

    읽고 쓰기 읽기(get) 전용 쓰기(set) 전용
    get / set 모두 작성 get만 작성(생략 가능) 구현 불가능

     

    var isSquare: Bool {
       get { // 선언 생략 가능
          return width == height
       }
    }

     


    저장 프로퍼티와 계산 프로퍼티

    // 1. 클래스 생성
    class MyClass {
    
       // 저장 프로퍼티
       var value1: Int = 0
       var value2: String?
       
       // 계산 프로퍼티
       var value3: Int {
          get {
             return 100
          }
          set(nv) {
             value1 = nv
          }
       }
       
       // 인스턴스 메서드
       func sayHello() {
          print ("Hello: \(value1)")
       
       // 타입 메서드
       static func sayGoodBye() {
          print("Good Bye")
       }
    }
    
    // 2. 인스턴스 생성
    let obj = MyClass()
    
    // 3. 인스턴스 사용
    obj.value1 = 10
    let str = obj.value2 //nil
    
    obj.sayHello()  // 인스턴스 메서드 -> 객체
    MyClass.sayGoodBye()  // 타입 메서드 -> 클래스

     


    타입 프로퍼티

    계산 프로퍼티, 저장 프로퍼티 둘 다 가능하다

    객체를 생성하지 않고 사용
    static 키워드로 구현

     

    class Rectangle {
       var width: Int = 0
       
       // 계산 타입 프로퍼티
       static var name: String {
          return "사각형"
       }
       
       // 저장 타입 프로퍼티
       static var edge = 4
    }
    
    
    // 프로퍼티 사용 방법
    
    // 객체
    var obj = Rectangle()
    obj.width = 10
    
    // 클래스(타입 프로퍼티 접근)
    Rectangle.edge
    Rectangle.name

     


    메서드

    클래스 내에 작성하는 함수

     

    class Count {
       var count = 0
       
       func increment() {
          count++
       }
       
       func increment(amount: Int) {
          count += amount
       }
    }

     


    self 포인터

    객체 자신을 참조하는 포인터

    프로퍼티 이름과 매개변수 이름이 겹칠 때 사용

    class Counter {
       var count = 0
       func setCount(count: Int) {
          self.count = count
       }
    }

     


    인스턴스 메서드 vs 타입 메서드

    인스턴스 메서드 타입 메서드
    객체 생성, 객체에 사용함(ex.obj.method) 객체 생성하지 않고 사용함
    객체의 프로퍼티 접근 및 사용 가능 프로퍼티 접근 불가
      static 키워드로 구현
    obj.method (객체) MyClass.method (클래스)

     


    프로퍼티 변경 감시

    이니셜라이저 초기화 때는 동작하지 않고, 프로퍼티 접근 및 사용 시에 동작

    willSet didSet
    프로퍼티 변경 전 프로퍼티 변경 후
    // 프로퍼티 변경 감시
    
    // 음수가 값으로 들어오는지 감지하기
    
    class Rectangle {
       var height: Int = 0 {
          willSet {
             print("사각형 높이 변경 예정: \(newValue)")
          }
          
          didSet {
             print("사각형 높이 변경 완료: \(oldValue)")
          }
       }
    }

     


    프로퍼티 늦은 초기화: lazy 키워드로 구현

    다른 클래스 타입의 프로퍼티 초기화

     

    프로퍼티 초기값으로 객체 생성

    class Person {
       var phone = Phone()
    }
    
    class Phone {
       var number: String
       init() {
          print("Phone 객체 생성")
          number = "010-1234-5678"
       }
    }
    
    // 인스턴스 생성
    let obj = Person() // Phone 이니셜라이저 구동

     


     

    프로퍼티를 사용할 때 초기화

    class Person {
       lazy var phone = Phone()
    }
    
    let John = Person()
    john.phone

     

     

     

    'iOS > Swift' 카테고리의 다른 글

    [Swift] 익스텐션(extension)  (0) 2022.09.03
    [Swift] 프로토콜(protocol)  (0) 2022.08.31
    [Swift] 타입캐스팅(type casting)  (0) 2022.08.24
    [Swift] 상속 (Inheritance)  (0) 2022.08.22
    [Swift] 서브스크립트(subscript)  (0) 2022.08.20
Designed by Tistory.