업데이트:

#extension #접근제어 #protocol #enum

오버로딩과 오버라이딩

오버로딩 (overloading) : 하나의 클래스 안에 같은 이름의 함수가 여러 개 있는 것

오버라이딩 (overriding) : 부모 클래스에서 정의된 함수를 자식 클래스가 재정의 하는 것, override 키워드 필수

class Health {
    var height : Float
    var weight : Float
    func display() {
        print("키 : \(height)cm 몸무게 : \(weight)kg")
    }
    init(height: Float, weight: Float) {
        self.height = height
        self.weight = weight
    }
}
class subHealth : Health {
    var bloodPressure : String
    override func display() { // 오버라이딩
        print("키 : \(height)cm 몸무게 : \(weight)kg 혈압 : \(bloodPressure)")
    }
    init(height: Float, weight: Float, bloodPressure: String) {
        self.bloodPressure = bloodPressure
        super.init(height: height, weight: weight)
    }
}
var guest : subHealth = subHealth(height: 166.2, weight: 54.7, bloodPressure: "고혈압")
guest.display() // 키 : 166.2cm 몸무게 : 54.7kg 혈압 : 고혈압

UIProgressView 클래스

UIProgressView  
기능 시간 경과에 따른 진행 상황을 보여준다.
생성자 init(progressViewStyle: UIProgressView.Style)
  init(frame: CGRect) init?(coder: NSCoder)
주요 함수 func setProgress(Float, animated: Bool)
예제 let myProgressView: UIProgressView = UIProgressView(frame: CGRect(x:0, y:0, width:100, height:5))
  myProgressView.setProgress(0.3, animated: true)

Extention : 확장

하위 클래스를 생성 또는 참조하지 않고 기존 클래스에 메서드, 생성자, 계산 프로퍼티(computed property) 등의 기능을 추가하기 위해 사용된다.

extension Double {
     var sec : Double {
         return self * 60 * 60
     }
 }
 
 let hour: Double = 2.5
 print("\(hour)hour = \(hour.sec)seconds") // 2.5hour = 9000.0seconds
 print(1.5.sec) // 5400.0 소수점이 있어도 .으로 사용 가능

Access modifiers : 접근 속성

클래스, 메서드, 멤버의 접근 가능성을 설정하며 구성 요소를 캡슐화 하는 데 사용된다. 언어별로 디폴트 접근 속성(생략 가능)이 있다. (C# : internal, C++ : private, Java : package, Swift : internal) Swift에는 private, fileprivate, internal, public, open의 다섯 가지 속성이 있다.

open, public 모듈의 모든 소스 파일 내에서와 정의한 모듈을 가져오는 다른 모듈의 소스 파일 에서도 접근 가능 (단, open 접근은 클래스 및 클래스 멤버에만 적용 가능)
internal 해당 모듈(ex. 앱)의 모든 소스 파일 내에서 사용 가능
fileprivate 현재 소스 파일 내에서만 사용 가능
private 현재 블록 내에서만 사용 가능

protocol : 프로토콜

특정 클래스와 관련없는 함수들의 선언 집합을 의미한다. (ex. 자바나 C#의 interface) Swift에서 상속할 때 부모 클래스는 하나만 가능하다. 만약 콜론 다음에 여러 개가 온다면 나머지는 프로토콜이다. 그러나 프로토콜은 다중 상속(부모 프로토콜 여러 개)도 가능하다

class 클래스명: 부모명, 프로토콜명{}
// 부모가 있다면 부모 다음에 표기 (부모로부터 상속, 프로토콜 채택)
class 클래스명: 프로토콜명{}
// 부모가 없을 경우 바로 표기 가능
protocol 프로토콜명 : 부모프로토콜1, 부모프로토콜2{}
// 프로토콜 다중 상속

Swift 상속과 protocol 채택

프로토콜 채택(adopt) : 클래스, 구조체, 열거형, extension에 가능 상속 : 클래스만 가능

정의, 채택, 준수

protocol Showable {
    var x : Int { get set } // 읽기 & 쓰기 가능, { get } : 읽기만 가능
    func show() // 선언만
}
class Ray : Showable { // 채택 adopt
    var x : Int = 5 // 준수 conform
    func show() { print("보인다") } // 준수 conform
}
let eye = Ray()
print(eye.x) // 5
eye.show() // 보인다

예제 1

protocol B {
    func bb(x: Int) -> Int
}
class C { }
class A : C, B {
    func bb(x: Int) -> Int {
        return x * 2
    }
}
let a = A()
print(a.bb(x: 3)) // 6

예제 2

protocol Buyable { // 프로토콜
    func calc(money: Int, price: Int) -> ()
}
class Item {
    var item: String = ""
    var price: Int
    init(item: String, price: Int) {
        self.item = item
        self.price = price
    }
    init(price: Int) { // 오버로딩
        self.price = price
    }
    func display() {
        print("품목: \(item) 가격: \(price)")
    }
}
class Cheap : Item, Buyable { // 상속
    var memo: String
    init(price: Int, memo: String) {
        self.memo = memo
        super.init(price: price)
    }
    func calc(money: Int, price: Int) -> () {
        print("가격: \(price)원 지불한 돈: \(money) 거스름돈: \(money-price)원") 
    }
    override func display() { // 오버라이딩
        print("내용: \(memo) 지출: \(price) 원")
    }
}
var aa = Cheap(price: 65000, memo: "신발 구입")
aa.display()
// 내용: 신발 구입 지출: 65000 원
aa.calc(money: 3000, price: 1800)
// 가격: 1800원 지불한 돈: 3000 거스름돈: 1200원

enum : 열거형

관련있는 데이터들이 멤버로 구성되어 있는 자료형 객체를 의미한다

정의

enum Family {
    case Mother, Father, GrandMother, GrandFather, Me
}
print(Family.Me) // Me
var female = Family.Mother
female = .Me // 두번째 부터 열거형명 생략 가능
print(female, type(of:female)) // Me Family

멤버별 기능 정의

enum Family {
    case Mother, Father, GrandMother, GrandFather, Me
}
var hangeul : Family
hangeul = .GrandFather
switch hangeul {
case .Mother:
    print("엄마")
case .Father:
    print("아빠")
case .GrandMother:
    print("할머니")
case .GrandFather:
    print("할아버지")
case .Me:
    print("나")
} // 할아버지

Notice: iOS프로그래밍기초(21-2학기) 한성현교수님 강의 내용 변형 및 요약

댓글남기기