Method
Methods — The Swift Programming Language (Swift 5.5)
인스턴스(instance) 메서드
- 인스턴스 메서드는 인스턴스에서 동작
var 인스턴스명 : 클래스명 = 클래스명() // ": 클래스명" 은 생략 가능
클래스(class or type) 메서드
- 타입 메서드 또는 클래스 메서드는 클래스 레벨에서 동작
- 타입 메서드는 인스턴스 메서드와 동일한 방법으로 선언하지만 class 나 static 키워드를 앞에 붙여서 선언
- class키워드로 만든 클래스 메서드는 자식 클래스에서 override가능
클래스명.클래스메서드()
Initialization
Initialization — The Swift Programming Language (Swift 5.5)
생성자 : init 메서드 - init() { }
- 클래스, 구조체, 열거형(enum) 인스턴스가 생성되는 시점에서 해야 할 초기화 작업
- 인스턴스가 만들어지면서 자동 호출됨
- designated initializer : 모든 프로퍼티(age, weight)를 다 초기화시키는 생성자
- init()을 하나라도 직접 만들면 기본적으로 만들어지는 눈에 안보이는 default initializer는 사라짐
- 소멸자 : 인스턴스가 사라질 때 자동 호출 - deinit{}
self
- 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self.을 붙임
- 다른 언어들의 this와 비슷
- 매개변수와 구분이 필요한경우 반드시 써야함
stored property(저장 프로퍼티)
- 초기값이 있어야 함, nil 포함(생성자가 있는경우 초기값 생략 가능)
computed property(계산 프로퍼티)
- property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값,게터(getter)와 세터(setter)
- 값을 리턴하는 게터(getter) 메서드, setter가 없으면 get{ }는 생략할 수 있으며 변경하지 않더라도 var로 선언해야 함
- 값을 대입하는 세터(setter) 메서드, 매개변수명은 newValue가 default값, Shorthand Setter Declaration,setter의 매개변수명이 newValue인 경우setter의 “(newValue)” 생략 가능
method overloading : 생성자 중첩
Function overloading - Wikipedia
- 매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의
- 생성자 중첩의 예,UIImage클래스의 init()함수, UIImage | Apple Developer Documentation
class Man{
var age : Int = 1 //stored property ,초기값 생략가능
var weight : Double = 3.5 //stored property ,초기값 생략불가
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
var manAge : Int{ //computed property
get{//setter가 없는경우 생략가능
return age-1
} //setter가 없는경우 생략가능
set(USAAge){
age = USAAge + 1
}
/*set(newValue){ //매개변수명이 newValue인경우, “(newValue)” 생략 가능
age = newValue + 1
}*/
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
init(yourAge: Int, weight : Double){ //1
self.age = yourAge //프로퍼티 = 매개변수,self생략가능
self.weight = weight //self생략불가
} //designated initializer
init(age: Int){ //2
self.age = age
}
}
//var kim : Man = Man() //오류
var kim : Man = Man(yourAge:10, weight:20.5) //init(yourAge: Int, weight : Double)호출
var lee : Man = Man(age:7) //init(age: Int)호출
kim.display() //인스턴스 메서드는 인스턴스가 호출 , 출력 : 나이=10, 몸무게=20.5
lee.display() //인스턴스 메서드는 인스턴스가 호출 , 출력 : 나이=7, 몸무게=3.5
Man.cM() //클래스 메서드는 클래스가 호출 , 출력 : cM은 클래스 메서드입니다.
Man.scM() //클래스 메서드는 클래스가 호출 , 출력 : scM은 클래스 메서드(static)
print("age: \(kim.age), manAge(getter): \(kim.manAge)")//출력 : age:10, manAge: 9
kim.manAge = 3 //setter호출
print("age: \(kim.age), manAge(getter): \(kim.manAge)")//출력 : age:4, manAge: 3
Failable Initializers : 실패 가능한 생성자
- nil값도 저장할 수 있으려면 init다음에 “?”를 하며 옵셔널 값이 리턴됨
- init?로 만든 인스턴스는 옵셔널형으로 만들어져서, 사용하려면 옵셔널을 언래핑해야 해야 하는 경우 생성자 호출 제일 마지막에 “!”를 씀
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init?(age: Int, weight : Double){
if age <= 0 {
return nil
}else {
self.age = age
}
self.weight = weight
}
}
var kim : Man? = Man(age:1, weight:3.5)
//1-1.옵셔널 형으로 선언
if let kim1 = kim { //1-2.옵셔널 바인딩
kim1.display() // 출력: 나이=1, 몸무게=3.5
}
//2.인스턴스 생성과 동시에 옵셔널 바인딩
if let kim2 = Man(age:2, weight:5.5) {
kim2.display() // 출력: 나이=2, 몸무게=5.5
}
//3.인스턴스 생성하면서 바로 강제 언래핑
var kim3 : Man = Man(age:3, weight:7.5)!
kim3.display() //출력: 나이=3, 몸무게=7.5
//4.옵셔널 인스턴스를 사용시 강제 언래핑
var kim4 : Man? = Man(age:4, weight:10.5)
kim4!.display() // 출력: 나이=4, 몸무게=10.5
/*--------------nil 반환----------------*/
var lee : Man? = Man(age:-1, weight:3.5)
//옵셔널 형으로 선언
if let lee1 = lee { //옵셔널 바인딩
lee1.display() // age가 nil값이라 출력안됨
}
//인스턴스 생성과 동시에 옵셔널 바인딩
if let lee2 = Man(age:0, weight:5.5) {
lee2.display() // age가 nil값이라 출력안됨
}
//인스턴스 생성하면서 바로 강제 언래핑
//crash!!
//강제 언래핑하는 방법은 위험함
/*var lee3 : Man = Man(age:0, weight:7.5)!
lee3.display()*/
클래스(class) 상속
Inheritance — The Swift Programming Language (Swift 5.5)
부모 클래스와 자식 클래스
- 상속된 클래스는 부모 클래스의 모든 기능을 상속받으며, 자신만의 기능을 추가 , 상속은 클래스만 가능
- 단일 상속 (single inheritance), Swift에서 하위 클래스는 단 하나의 부모 클래스만 상속받을 수 있
- class 자식:부모 { } , 부모 클래스는 하나만 가능 , 콜론 다음이 여러 개이면 나머지는 프로토콜
- override : 부모와 자식에 같은 메서드가 있으면 자식 우선
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight
}
}
class Student : Man {
var name : String
override func display() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
func displayS() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double, name : String){
self.name = name
super.init(age:age, weight:weight)
}
}
var lee : Student = Student(age:20,weight:65.2,name:"홍길동")
lee.displayS() // 출력 : 이름=홍길동, 나이=20, 몸무게=65.2
lee.display() // 출력 : 이름=홍길동, 나이=20, 몸무게=65.2
'잡다한지식 > iOS프로그래밍기초' 카테고리의 다른 글
iOS 학습과정(7주차) - Swift 문법 (0) | 2021.10.13 |
---|---|
iOS 학습과정(6주차) - 과제,소스 (0) | 2021.10.06 |
iOS 학습과정(5주차) - Swift 문법 (0) | 2021.09.29 |
iOS 학습과정(4주차) - Swift 문법 (0) | 2021.09.23 |
iOS 학습과정(3주차) - Swift 문법 (0) | 2021.09.16 |