[iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용 변형 및 요약]
클래스(class or type) 메소드
선언 : class 또는 static 키워드를 앞에 붙여서 선언
호출 : 클래스이름.클래스메소드()
class키워드로 만든 클래스메소드는 자식클래스에서 override 가능
class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
class func cM(){
print("cM은 클래스 메서드입니다.")
}
static func scM(){
print("scM은 클래스 메서드(static)")
}
}
var kim : Man = Man()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM() //클래스 메서드는 클래스가 호출
인스턴스 초기화 : init( )
클래스, 구조체, 열거형 인스턴스가 생성되는 시점에서 해야 할 초기화 작업인스턴스가 만들어질 때 자동 호출designated initializer : 모든 프로퍼티를 초기화시키는 생성자* init()을 하나라도 직접 만들면 눈에 보이지않는 default initializer는 사라짐소멸자 : 인스턴스가 사라질 때 자동 호출, deinit{ }
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(myAge: Int, myWeight : Double){
age = myAge
weight = myWeight
}
}
var shim : Man = Man(myAge:23, myWeight:56)
shim.display() // 나이=23, 몸무게=56.0
self
현재 클래스 내 메소드나 프로퍼티를 가리킬 때 앞에 붙이는 키워드
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight // '프로퍼티 = 매개변수'
}
}
var shim : Man = Man(age:23, weight:56)
shim.display() // 나이=23, 몸무게=56.0
stored(저장) property, computed(계산) property
computed(계산) property는 프로퍼티가 설정되거나 검색되는 시점에서 계산 또는 파생된 값
계산 프로퍼티 안의 메소드 : 값을 리턴하는 getter 메소드, 값을 대입하는 setter 메소드
class Man{
var age : Int
var weight : Double
var manAge : Int {
get{ //setter가 없으면 생략가능
return age-1
} //setter가 없으면 생략가능
set(newValue){
age = newValue + 1
}
}
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){
self.age = age
self.weight = weight // '프로퍼티 = 매개변수'
}
}
var shim : Man = Man(age:23, weight:56)
shim.display() // 나이=23, 몸무게=56.0
print(shim.manAge) // 22, getter 호출
shim.manAge = 14 // setter 호출
print(shim.age) // 15
- setter가 없으면 get{ } 생략 가능하고 var로 선언해야 한다.
- setter의 매개변수명은 newValue가 기본 (다른 매개변수명도 가능)
method overloading : 생성자 중첩
매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러개 정의
class Man{
var age : Int = 20
var weight : Double = 52.5
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight : Double){ // 생성자1
self.age = age
self.weight = weight
}
init(age: Int) { // 생성자2
self.age = age
}
}
var shim : Man = Man(age:23, weight:56) // 생성자1
var shimdu : Man = Man(age:23) // 생성자2
shim.display() // 나이=23, 몸무게=56.0
shimdu.display() // 나이=23, 몸무게=52.5
Failable Initializers (실패 가능한 생성자 : init?)
ex) let myImage: UIImage = UIImage(named : "apple.png")!
출처 : https://developer.apple.com/documentation/uikit/uiimage
Apple Developer Documentation
developer.apple.com
- apple.png 파일이 없으면 인스턴스를 만들 수 없음 = nil
- nil값을 저장할 수 있으려면 init 다음에 '?'를 붙여 옵셔널 값이 리턴됨
- init? 으로 만들어진 인스턴스는 옵셔널형이기 때문에, 사용하려면 옵셔널을 언래핑해야 해서 (ex)줄 마지막에 '!'가 있음
class Man{
var age : Int
var weight : Double
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init?(age: Int, weight : Double){
if age <= 0 || weight <= 0 {
return nil
}
else {
self.age = age
self.weight = weight
}
}
}
var shim : Man? = Man(age:23, weight:0) // 옵셔널 형으로 선언
if let shim1 = shim { // 옵셔널 바인딩
shim1.display() //
}
if let shim2 = Man(age:0, weight:58.0){ // 한번에 인스턴스 생성과 옵셔널 바인딩
shim2.display() //
}
클래스 상속
하위(sub) 클래스 = 자식(child) 클래스 : 상속받은 클래스
상위(super) 클래스 = 부모(parent) 클래스 : 하위 클래스가 상속받은 클래스
* Swift에서는 하위 클래스는 단 하나의 부모 클래스만 상속 가능
class 자식: 부모, 프로토콜1, 프로토콜2 {
}
// 부모가 있으면 부모 다음에 프로토콜을 표기
// 부모가 없으면 바로 표기 가능
- 상속은 클래스만 가능
- 클래스, 구조체, 열거형, extension에 프로토콜을 채택할 수 있다.
class Man{
var age : Int = 20
var weight : Double = 56.2
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
}
class Child : Man {
var name : String
func cDisplay() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight: Double, name: String){
self.name = name
super.init(age:age, weight:weight)
}
}
var shim : Child = Child(age:23, weight:54, name:"SDY")
shim.display() // 나이=23, 몸무게=54.0
shim.cDisplay() // 이름=SDY, 나이=23, 몸무게=54.0
override : 부모와 자식에 같은 메소드가 있으면 자식 우선
class Man{
var age : Int = 20
var weight : Double = 56.2
func display(){
print("나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight: Double){
self.age = age
self.weight = weight
}
}
class Child : Man {
var name : String = "SDY"
override func display() {
print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
}
init(age: Int, weight: Double, name: String){
super.init(age:age, weight:weight)
self.name = name
}
}
var shim : Child = Child(age:23, weight:54, name:"Shim")
shim.display() // 이름=Shim, 나이=23, 몸무게=54.0
- Child 클래스의 인스턴스 shim이 display( )를 호출할 때, 자식 클래스가 새로 만든 display( ) 메소드를 우선적으로 호출하게 하려면 Child 클래스의 fun diplay( ) 앞에 override 키워드를 써야 한다.
'Language > Swift 수업' 카테고리의 다른 글
iOS 프로그래밍 기초 (9) (0) | 2021.11.01 |
---|---|
iOS 프로그래밍 기초 (7) (0) | 2021.10.15 |
iOS 프로그래밍 기초 (5) (0) | 2021.10.02 |
iOS 프로그래밍 기초 (4) (0) | 2021.09.25 |
iOS 프로그래밍 기초 (3) (0) | 2021.09.17 |
Comment