본문 바로가기
computing

20251013_iOS_7주차

by greentworkshop 2025. 10. 13.
1주

2주. tuple매년 시험에 나옴

3주. property제외,      as? as! 언제 사용하는지 구분하기

4주. guard let 개중요 , 검은색 예제는 불필요

5주. 후행클로저 안함**

6주. 클래스는 상속 가능, 구조체는 ~~ 이 정도 개념만 알아두삼(시험에 다 안 나옴)

Method (Swift) = Member function (Method)

stored property (Swift) = 멤버변수(C++)

 

stored property를 초기화하는 3가지 방법

class Man{
var age : Int = 1
//직접 지정
var weight : Double = 3.5
}
class Man{
var age : Int?
//옵셔널 변수는 nil로 자동 초기화
var weight : Double!} //옵셔널 변수는 nil로 자동 초기화
class Man{
var age : Int
var weight : Double init(){
//initializer로 초기화

age = 1
weight = 3.5 }}

xcode실행 file->new->playground

 

class Man{
    var age : Int = 1
    var weight : Double = 3.5
    //init(){}
    //눈에 보이지 않지만 자동으로 만들어지는 default initializer
    func display(){
        print("나이=\(age), 몸무게=\(weight)") }
    class func cM(){
        print("cM은 클래스 메서드입니다.")
    }
    static func scM(){
        print("scM은 클래스 메서드(static)")
    }
}
var kim : Man = Man() // ()는 init()호출하는 것  Man.init()
kim.display() //인스턴스 메서드는 인스턴스가 호출
Man.cM() //클래스 메서드는 클래스가 호출
Man.scM()
print(kim.age)

/*---result---
나이=1, 몸무게=3.5
cM은 클래스 메서드입니다.
scM은 클래스 메서드(static)
1
나이=1, 몸무게=3.5
cM은 클래스 메서드입니다.
scM은 클래스 메서드(static)
1
*/

 

class키워드로 만든 클래스 메서드는 자식 클래스에서 override가능 함

var kim = Man.init() .init생략됨

default initializer(.init 하나라도 만들면 사라짐) vs designated initializer(모든 프로퍼티를 초기화하는 이니셜라이저)

 

생성자 : 인스턴스가 만들어지면서 자동 호출

explicit = 수동으로

오류 해결하려면 self.age = age처럼 작성해야함

age = age는 class의 age변수에 age를 대입하라는 명령

기본생성자 - 나이:1, 몸무게:3.5

method overloading : 생성자 중첩

init(age: Int, weight : Double){  //1
    self.age = age
    self.weight = weight
} //designated initializer
init(){  //2
	self.age = 1
    self.weight = 3.5
}

UIImage클래스의 init()함수 overloading

**failable initializer( 실패 가능한 생성자: init?() )

ㄴ정상적인 객체가 아닌 객체가 출력될 경우 사용

kim = optional Man 자료형

강제 언래핑 !으로 풀어버리면 오류발생

optional binding으로 해제 필요

 

  1. 1. 이미지 로딩과 캐싱
    •  init?(named: String, in: Bundle?, compatibleWith: UITraitCollection?)
    •  init?(named: String)
    • 2. 이미지객체 생성 및 초기화
    •  init?(contentsOfFile: String)
    •  init?(data: Data)
    •  init?(data: Data, scale: CGFloat)
  • let myImage: UIImage = UIImage(named: "apple.png")! //느낌표가 왜 있지?

optional binding 활용

if let kim{ }. //생략하고 그냥 쓸 수도 있다.

 

var kim : Man? = Man(age:1, weight:3.5)
//1-1.옵셔널 형으로 선언
if let kim1 = kim { //1-2.옵셔널 바인딩
    kim1.display()
}
//2.인스턴스 생성과 동시에 옵셔널 바인딩
if let kim2 = Man(age:2, weight:5.5) {
    kim2.display()
}
//3.인스턴스 생성하면서 바로 강제 언래핑 XX비추
var kim3 : Man = Man(age:3, weight:7.5)!
kim3.display()
//4.옵셔널 인스턴스를 사용시 강제 언래핑 XX비추
var kim4 : Man? = Man(age:4, weight:10.5)
kim4!.display()

class 자식:부모 { }

  • 부모 클래스는 하나만 가능
  •  class 클래스명:프로토콜명1,프로토콜명2{} // 프로토콜은 여러개 가능
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
    }
}
class Student : Man {
    
}
var kim = Man(age:10, weight:20.5)
kim.display()
var kim1 = Student(age:20, weight:60.5)
kim1.display()

//상속받으면 부모의 기능 사용 가능
 슈퍼클래스

오버라이드***

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
    }
}
class Student : Man {
    var name : String
    func displayS() {  //부모랑 겹치지 않게 하려고 S추가함 같은 이름을 쓰려면 override func...
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age1: Int, weight1 : Double, name : String){
        self.name = name //자식의 프로퍼티 먼저 초기화
        super.init(age:age1, weight:weight1) //과제: 이 줄을 안쓰면?
    }//error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(age1:20,weight1:65.2,name:"홍길동")
lee.displayS()
lee.display()//만일 override를 사용하면 자식클래스의 메소드를 우선시하도록 바뀐다
//조심해야할 에러
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
    }
}
class Student : Man {
    var name : String
    Override func display() {  //부모랑 겹치지 않게 하려고 S추가함 같은 이름을 쓰려면 override func...
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age1: Int, weight1 : Double, name : String){
    	super.init(age:age1, weight:weight1) //
        self.name = name //error 반드시 자식의 프로퍼티 먼저 초기화
    }//error:'super.init' isn't called on all paths before returning from initializer
}
var lee : Student = Student(age1:20,weight1:65.2,name:"홍길동")
lee.displayS()
lee.display()//만일 override를 사용하면 자식클래스의 메소드를 우선시하도록 바뀐다

override : 객체 지향에서 상위(부모) 클래스에 정의된 메서드를 하위(자식) 클래스에서 동일한 이름과 매개변수 목록으로 재정의하여 사용하는 것

overloading : 같은 이름의 메서드를 여러 개 정의하는 기법

'computing' 카테고리의 다른 글

20251030_android8  (0) 2025.10.30
20251027_iOS9  (0) 2025.10.27
20251002_android_5_layout속성  (0) 2025.10.02
(Servlet, JSP), (MVC,MVCS), (MVVM, MVP)  (0) 2025.10.01
20250929_iOS5  (0) 2025.09.29