SSAC_iOS_Day 8 | TIL
👩💻 수업 & 추가 스터디
📂 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
분류 | Class | Struct |
---|---|---|
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
- 클래스와 구조체에 관련된
인스턴스 프로퍼티
,타입 프로퍼티
,연산 프로퍼티
,타입 메서드
,인스턴스 메서드
,타입 캐스팅
,디이니셜라이저
,초기화 위임
등 개념 살펴보기
Author And Source
이 문제에 관하여(SSAC_iOS_Day 8 | TIL), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@hope1053/SSACiOSDay-8-TIL저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)