SSAC_iOS_Day 8 | TIL

린다·2021년 10월 7일
0

SSAC_iOS_Dev

목록 보기
4/33
post-thumbnail

👩‍💻 수업 & 추가 스터디

📂 Class

  • 필요한 기능을 조합하여 하나로 묶고 이름을 붙여서 필요할 때 불러와서 사용할 수 있도록 하는 개념
  • 클래스를 사용하여 코딩하는 것을 객체 지향 프로그래밍이라고 한다.
  • 클래스 내부에 선언된 변수프로퍼티, 함수메서드라고 한다.

프로퍼티 + 메서드 = 멤버(Member)

iOS UIKit Framework는 대부분 클래스로 구현돼있음.

class Monster {
    var clothes: String
    var speed: Int
    var power: Int
    var exp: Double
    
    init(clothes: String, speed: Int, power: Int, exp: Double) {
        self.clothes = clothes
        self.speed = speed
        self.power = power
        self.exp = exp
    }
    
    func attack() {
        print("몬스터가 공격했다!")
    }
}

인스턴스

  • 클래스를 사용하여 만든 객체인스턴스라고 한다.
  • 인스턴스를 생성하고 나면 이를 통해 프로퍼티메서드에 접근할 수 있다.
var easyMonster = Monster(clothes: "Orange", speed: 1, power: 10, exp: 50)
easyMonster.clothes
easyMonster.speed
easyMonster.exp
easyMonster.power

상속

  • Class의 특징으로 다른 클래스를 상속하면 상속한 클래스의 프로퍼티, 메서드를 사용할 수 있다. (Struct(구조체)는 상속이 불가능하다.)
  • 상속을 받은 클래스는 자식클래스(Sub Class)라고 부르고, 상속을 해준 클래스는 부모 클래스(SuperClass)라고 부른다.
  • 다른 클래스를 상속받지 않는 클래스를 기반 클래스(Base Class)라고 한다.
class BossMonster: Monster {
    var bossName = "끝판왕보스"
    
    func bossUniqueAttack() {
        print("보스만의 강력한 공격!!")
    }
}

var boss = BossMonster(clothes: "Black", speed: 100, power: 50000, exp: 2000000)
boss.bossName
boss.clothes
  • 클래스 이름 옆에 : 상속받을 클래스 이름을 작성하면 상속할 수 있다.
  • 상속받으면 상속받은 클래스의 프로퍼티와 메서드도 사용할 수 있을 뿐만 아니라 자신만의 프로퍼티와 메서드를 선언하여 사용할 수 있다.

재정의(Override)

  • 부모 클래스에 이미 정의돼있는 멤버를 사용할 때 자식 클래스만의 기능으로 변경하여 사용할 수 있다. ➡️ 재정의(Override)
  • 상속받은 클래스의 멤버를 재정의하면 그 앞에 override키워드가 붙는다.
class BossMonster: Monster {
    override func attack() {
        // 부모 클래스 내용도 같이 실행하고 싶을 때
        super.attack()
        print("보스 일반 공격!!")
    }
}
  • func attack()은 상속한 부모 클래스인 Moster클래스 안에 이미 정의돼있는 메서드이다. 이때 앞에 override를 붙이면서 자식 클래스에서 재정의하고 있다.
  • print("보스 일반 공격!!")은 재정의한 자식 클래스 만의 기능이지만 이때 부모 클래스의 기능도 함께 사용하고 싶은 경우, 기존 메서드의 이름 앞에 super이라는 키워드를 붙여주면 된다.
  • 위와 같은 경우 super 키워드를 사용했기 때문에 BossMonster 클래스의 인스턴스 boss를 생성하고 boss.attack()을 실행하면 '몬스터가 공격했다!', '보스 일반 공격!!' 총 두 줄이 프린트된다.

📂 Struct

  • 클래스와 동일하게 데이터를 구조화하여 관리하는데 사용한다.
  • Swift의 데이터 타입과 열거형은 모두 Struct 구조로 구현돼있다.

📂 Class vs Struct

Initializer

  • 클래스와 구조체 모두 프로퍼티의 초기화가 잘 돼있어야한다.
  • 초기화 되지 않은 프로퍼티가 있는 경우 빌드 오류가 발생할 수 있다.

프로퍼티 선언과 동시에 초기화하는 경우

  • 프로퍼티 선언과 동시에 초기화를 하는 경우, 모든 프로퍼티의 초기값을 설정해주면 문제없이 잘 작동한다.
  • 하지만 만약 하나의 프로퍼티라도 선언만 돼있고 초기화가 돼있지 않으면 오류가 나타난다.
  • 이때 프로퍼티를 optional타입으로 선언한다면 오류가 뜨지 않는다. 하지만 이때 프로퍼티의 값이 nil이라면 런타임 에러가 발생할 수 있으니 주의해야한다! (➡️ 옵셔널이 필요없는 경우인데 오류를 피하기 위해 옵셔널로 선언하는 경우는 피해야한다)

초기화 메서드

  • 초기화 값을 선언과 동시에 설정해주는 것이 아니라 추후에 객체를 생성하면서 설정해주고 싶을 때 초기화 메서드를 사용하면 된다.
  • 이때 클래스와 구조체의 차이점은 클래스는 직접 init키워드의 초기화 함수를 선언해줘야한다. 하지만 구조체는 초기화 함수가 자동으로 제공하기 때문에(멤버와이즈 초기화 구문(MemberWise Initializer)) 초기화 메서드를 추가적으로 구현할 필요가 없다.
struct Monster {
	var clothes: String
    var speed: Int
    var power: Int
    var exp: Double
}
// 구조체는 초기화 구문 혹은 초기값 설정이 없어도 멤버와이즈 초기화 구문이 자동으로 제공되기 때문에 오류가 나지 않는다.

Reference Type vs Value Type

  • Struct는 Value Type으로 인스턴스를 다른 변수에 할당 후 값을 변경해줘도 주소를 전달한 것이 아니라 값만 전달했기 때문에 기존 인스턴스의 값은 변경되지 않는다. 서로 영향을 미치지 않는 독립적인 관계라고 볼 수 있다.
  • 하지만 Class는 Reference Type으로 서로 메모리 주소를 전달한다. 따라서 인스턴스를 다른 변수에 할당 후 값을 변경해주면 같은 위치에 있는 데이터에 대한 주소를 두 변수가 공유하고 있는 것이기 때문에 두 변수의 값이 모두 변경된다.

Summary

분류ClassStruct
Initializer(초기화)초기화 함수(init)을 통해 프로퍼티 초기화를 시켜주거나 프로퍼티 선언과 동시에 모든 프로퍼티를 초기화 시켜줘야한다.멤버와이즈 초기화 구문(Memberwise Initializer)이 자동으로 제공되기 때문에 초기값 설정 혹은 초기화 함수를 구현하지 않아도 된다.
Type(타입)Reference Type(참조 타입)Value Type(값 타입)

📂 DatePicker

  • DateFormatter을 사용하여 date를 String으로 변환할 수 있음
  • timeInterval을 사용하여 D-day를 계산할 수 있음. 이때 timeInterval은 초 단위로 계산해야함!
@IBAction func datePickerValueChanged(_ sender: UIDatePicker) {
        let format = DateFormatter()
        format.dateFormat = "yy년 MM월 dd일" // 21/10/20
        
        let value = format.string(from: sender.date)
        print(value)
        
        // 100일 뒤: TimeInterval
        let afterDate = Date(timeInterval:  86400 * 100, since: sender.date)
        print(afterDate)
    }

👩‍💻 Mission

📂 DateFormat

  • DateFormat의 다양한 종류와 이를 어떻게 응용할 수 있을지? (ex. 카카오톡 채팅의 오전 10:20, 오후 4:33)

📂 Class/Struct Upgrade

  • 클래스와 구조체에 관련된 인스턴스 프로퍼티, 타입 프로퍼티, 연산 프로퍼티, 타입 메서드, 인스턴스 메서드, 타입 캐스팅, 디이니셜라이저, 초기화 위임 등 개념 살펴보기

0개의 댓글