DongSup
dev's gait
DongSup
전체 방문자
오늘
어제
  • 분류 전체보기 (71)
    • flask (13)
    • iOS (11)
    • python (22)
    • CS (21)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Swift
  • 파이썬
  • 언어공부
  • 한걸음
  • 첫글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
DongSup

dev's gait

Swift 문법 (클래스/ 클래스 상속)
iOS

Swift 문법 (클래스/ 클래스 상속)

2021. 10. 12. 23:59

클래스 메서드

 

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.cM()  Man 타입의 인스턴스가 호출하면 error

kim.display() //인스턴스 메서드는 인스턴스가 호출

Man.cM() //클래스 메서드는 클래스가 호출

Man.scM()  //클래스 메서드는 클래스가 호출

//나이=1, 몸무게=3.5

//cM은 클래스 메서드입니다.

//scM은 클래스 메서드(static)

◼ 클래스명.클래스메서드()

◼ Man 타입의 인스턴스가 호출하면 error


 

designated initializer

 

class Man{

var age : Int = 1 //초깃값은 없어도 생략가능

var weight : Double = 3.5 //초깃값은 없어도 생략가능

func display(){

print("나이=\(age), 몸무게=\(weight)")

}

init(yourAge: Int, yourWeight : Double){

age = yourAge

weight = yourWeight

} //designated initializer

}

//var kim : Man = Man() //오류

//init()을 하나라도 직접 만들면 default

//initializer는 사라짐

var kim : Man = Man(yourAge:10, yourWeight:20.5)

// 클래스 이름 다음에 괄호가 있으면 그 클래스에 initializer를 호출하는 과정이다

//init(yourAge: Int, yourWeight : Double)호출

kim.display()

//나이=10, 몸무게=20.5

◼ 생성자에서 프로퍼티의 값들을 초기화하는 initializer


 

self

 

class Man{

var age : Int = 1

var weight : Double = 3.5

func display(){

print("나이=\(age), 몸무게=\(weight)")

}

init(age: Int, weight : Double){

self.age = age //프로퍼티 = 매개변수

self.weight = weight

}

}

var kim : Man = Man(age:10, weight:20.5)

kim.display()

//나이=10, 몸무게=20.5

class woMan{

var age1 : Int = 1

var weight1 : Double = 3.5

func display1(){

print("나이=\(age1), 몸무게=\(weight1)")

}

init(yourAge: Int, yourWeight : Double){

age1 = yourAge //self.age = yourAge

weight1 = yourWeight

}

}

var lim : woMan = woMan(yourAge:20, yourWeight:30.5)

lim.display1()

//나이=20, 몸무게=30.5

◼ 현재 클래스 내 메서드나 프로퍼티를 가리킬 때 메서드나 프로퍼티 앞에 self.을 붙임

◼ 프로퍼티 이름을 매개변수 이름과 같게 주게되면 매개변수 값이 프로퍼티에 들어가야하기 때문에 구별하기위해 사용


 

computed property의 getter와 setter , method overloading

 

class Tree{

var apple : Int = 1 //stored property

var mango : Double = 3.5 //stored property

var add1 : Int{ //computed property

get{ return apple-1 }

set{ apple = newValue + 1 }

}

var add2 : Double{

get{ return mango-1.3 }

set{ mango = newValue + 1.4 }

}

func display(){

print("첫번째=\(apple), 두번째=\(mango)")

}

init(apple: Int, mango : Double){

self.apple = apple

self.mango = mango

}

init(mango : Double){

self.mango = mango

}

}

var Ahn : Tree = Tree(apple:10, mango:20.5)

var Ahn1 : Tree = Tree(mango:34.3)

Ahn.display()

Ahn1.display()

print(Ahn.add1) // getter호출

print(Ahn.add2)

Ahn.add1 = 3 //setter호출

Ahn.add2 = 5.0

print(Ahn.apple)

print(Ahn.mango)

//첫번째=10, 두번째=20.5

//첫번째=1, 두번째=34.3

//9

//19.2

//4

//6.4

◼  computed property - property가 설정되거나 검색되는 시점에서 계산 또는 파생된 값으로 계산 프로퍼티 내에는 값을 리턴하는 게터(getter) 메서드와 값을 대입하는 세터(setter) 메서드가 있다.

◼  매개변수의 개수와 자료형이 다른 같은 이름의 함수를 여러 개 정의


 

failable initializer

 

class Tree{

var apple : Int

var mango : Int

func display(){

print("첫번째=\(apple), 두번째=\(mango)")

}

init?(apple: Int, mango : Int){

if apple <= 0 {

return nil

}

else if mango <= 0{

return nil

}

else{

self.apple = apple

}

self.mango = mango

}

}

var Ahn : Tree? = Tree(apple:1, mango:3)

//1-1.옵셔널 형으로 선언

if let Ahn1 = Ahn { //1-2.옵셔널 바인딩

Ahn1.display()

}

//2.인스턴스 생성과 동시에 옵셔널 바인딩

if let Ahn2 = Tree(apple:-2, mango:5) {

Ahn2.display()

}

if let Ahn3 = Tree(apple:4, mango:7) {

Ahn3.display()

}

if let Ahn4 = Tree(apple:1, mango:-5) {

Ahn4.display()

}

//3.인스턴스 생성하면서 바로 강제 언래핑

//var Ahn5 : Tree = Tree(apple:3, mango:-7)!  error

//Ahn5.display()

//4.옵셔널 인스턴스를 사용시 강제 언래핑

//var Ahn6 : Tree? = Tree(apple:4, mango:10)  error

//Ahn6!.display()

//var Ahn7 : Man = Man(age:0, weight:7.5)! error

//Ahn7.display()

//첫번째=1, 두번째=3

//첫번째=4, 두번째=7

◼  failable initialize가 있는 클래스의 인스턴스 생성 방법

◼  강제 언레핑하는 방법은 위험하고 에러가 날 수 있음

 


init() [iOS UIKit class hierarchy]

let myChoose : UIColor = UIColor(hue: 0, saturation: 1, brightness: 0.5, alpha: 1.5)

let Color = UIColor(displayP3Red: 1, hue: 0, brightness: 0)

let myChoose : UIColor? = UIColor(named: "hello")

let myChoose : UIColor = UIColor(named: "hello")!

◼  같은 이름의 init 함수가 여러 개 있는 것으로 매개변수가 다른 두 생성자를 통해 두 가지 방법으로 인스턴스를 만들 수 있음

◼  init?(named: String)

init?로 만든 인스턴스는 옵셔널 형으로 만들어져서, 사용하려면 옵셔널을 언래핑해야함

 


 

클래스 상속

 

class Tree{

var apple : Int

var mango : Double

func display(){

print("사과 갯수=\(apple), 망고갯수=\(mango)")

}

init(apple: Int, mango : Double){

self.apple = apple

self.mango = mango

}

}

class Student : Tree {

var taste : String

func displayS() {

print("과일 \(taste), 사과 갯수=\(apple), 망고갯수=\(mango)")

}

init(apple: Int, mango : Double, taste : String){

self.taste = taste

super.init(apple:apple, mango:mango) // 안쓰면 error

}//error:'super.init' isn't called on all paths before returning from initializer

}

var lee : Student = Student(apple:10,mango:34.5,taste:"맛있겠다")

lee.displayS()

lee.display()

//과일 맛있겠다, 사과 갯수=10, 망고갯수=34.5

//사과 갯수=10, 망고갯수=34.5

◼ 상속은 클래스만 가능

◼ super : 부모 메서드 호출 시 사용

◼ 부모와 자식에 같은 메서드가 있으면 자식 우선

'iOS' 카테고리의 다른 글

맥(Mac)  (0) 2021.11.02
Swift 문법 (extension / 접근 제어 / protocol / enum)  (0) 2021.10.19
Swift 문법 (1급 객체 / 1급 시민 / 글로저 / 클래스 기초)  (0) 2021.10.05
Swift 문법 (guard / switch-case / 함수)  (0) 2021.09.28
옵셔널(optional) / 연산자(operator) / 제어문  (0) 2021.09.21
    'iOS' 카테고리의 다른 글
    • 맥(Mac)
    • Swift 문법 (extension / 접근 제어 / protocol / enum)
    • Swift 문법 (1급 객체 / 1급 시민 / 글로저 / 클래스 기초)
    • Swift 문법 (guard / switch-case / 함수)
    DongSup
    DongSup

    티스토리툴바