본문 바로가기
iOS

iOS 7주차

by asd135 2024. 10. 16.
728x90

 

인스턴스: 메모리에 올라온 객체
객체: 클래스로부터 만들어짐

 

C++ 클래스 생성

class Dog {
public:
    string name;
    int age;

    Dog(string n, int a) {
        name = n;
        age = a;
    }
};

Dog myDog("Buddy", 3);

new 연산자 안써도 가능

 

Java 클래스 생성

class Dog {
    String name;
    int age;

    Dog(String n, int a) {
        name = n;
        age = a;
    }
}

Dog myDog = new Dog("Buddy", 3);

new 연산자 필수

 

Swift 클래스 생성

class Dog {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

let myDog = Dog(name: "Buddy", age: 3)

 

class 클래스 이름 : 부모 클래스 {
	// 프로퍼티 (멤버 변수)
    // 인스턴스 메서드 
    // type (클래스 메서드)
}

 

type 메서드(static 메서드)

 

대부분의 언어에서 상속은 : 키워드, swift에서도 상속을 : 키워드로 한다.

 

 

중요

 

스토어드 프로퍼티(멤버 변수)는 초기 값이 있어야함

 

 

옵셔널 변수는 nil으로 자동으로 초기화 됨, 초기값을 안줘도 된다.

 

정리

 

class Man {
    var age : Int = 0
    var weight : Double = 0.0
    init(){}
    func display() {
        print("나이: \(age), 몸무게: \(weight)")
    }
}

var x : Int
var kim : Man = Man() // Man.init() 생략가능, kim 자료형 추론가능하기 때문에 : Man 생략가능
kim.age = 10

 

정리

 

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() //클래스 메서드는 클래스가 호출
// 에러
han.cM()
han.scM()

 

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

 

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)
kim.display()

 

designated initializer모든 프로퍼티를 다 초기화 시키는 생성자

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
  } //designated initializer
}
//var kim : Man = Man()  //오류
//init()을 하나라도 직접 만들면 default initializer는 사라짐
var kim : Man = Man(age:10, weight:20.5)
kim.display()

self키워드: 현재 클래스 내 메서드나 프로퍼티를 가르킬 때 사용함, 자바, C++ 등 대부분의 언어에서는 this키워드를 사용함

 

 

메서드 중첩(method overloading)

class Man{
  var age : Int = 1
  var weight : Double = 3.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 kim : Man = Man(age:10, weight:20.5)  //1
var kim1 : Man = Man(age:10) //2
//var kim2 : Man = Man()
//init가 없다면 인스턴스 만드는 방법
kim.display()
kim1.display()

메서드 중첩 조건: 매개변수의 개수와 자료형은 달라야함

 

애플에서 만든 uiimage 함수, 생성자 중첩이 많이 되어있음

 

부모클래스: superclass

자식클래스: subclass

상속 방법: 자식 class : 부모 class

특징:C++에서는 여러 부모가 올 수 있지만 Swift 하나만 올 수 있음

 

 

프로토콜: 자바의 인터페이스와 비슷한 개념

 

 

부모와 자식간 같은 메서드가 있으면 자식의 메서드를 우선적으로 하기위해 Overriding 키워드를 사용해야함

 

failable initializer 만드는 법: init 뒤에 ? 붙임

  init?(age: Int, weight : Double){
    self.age = age
    self.weight = weight
  }

 

  init?(age: Int, weight : Double){
      if age <= 0 || weight <= 0.0 {
          return nil
      }
      else {
    self.age = age
    self.weight = weight
  }

조건식을 써주고, 반드시 return nil 구문이 있어야한다.

 

var han : Man? = Man(age:5, weight:10.3)

옵셔널 타입으로 선언해줘야 한다.

 

han!.display()
han!.age = 10
han!.weight = 25.4

옵셔널 타입이기 때문에 ! 키워드로 nil 언래핑 해야함, 위 방식은 권장하지 않는 방법. 이유는 han 변수가 nil일 경우 언래핑하면 clash 나기 때문

 

3, 4 방식 비추천

 

방법.1

var han : Man? = Man(age:5, weight:10.3)
if let han {
    han.display()
}

변수 han nil 일 경우 if문이 거짓이기 때문에 clash 발생 안함

 

방법.2

if let han = Man(age:5, weight:10.3) {
    han.display()
}

인스턴스 생성과 동시에 언래핑 하는 방식

 

상속, 오버라이딩, failableinitalizer

// 부모 클래스 정의
class Animal {
    var name: String
    
    // 기본 초기화
    init(name: String) {
        self.name = name
    }
    
    // 메서드 정의
    func makeSound() {
        print("Animal sound")
    }
}

// 자식 클래스 정의 (상속)
class Dog: Animal {
    
    // 오버라이딩
    override func makeSound() {
        print("Bark")
    }
}

// Failable Initializer를 가진 클래스 정의
class Cat: Animal {
    
    // Failable Initializer
    init?(name: String) {
        // 이름이 비어있으면 초기화 실패
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    
    // 오버라이딩
    override func makeSound() {
        print("Meow")
    }
}

// 사용 예시
let dog = Dog(name: "Buddy")
dog.makeSound()  // 출력: Bark

if let cat = Cat(name: "") {
    cat.makeSound()
} else {
    print("Failed to initialize Cat")  // 출력: Failed to initialize Cat
}

if let cat2 = Cat(name: "Whiskers") {
    cat2.makeSound()  // 출력: Meow
}

'iOS' 카테고리의 다른 글

IOS 10주차  (1) 2024.11.06
iOS 9주  (0) 2024.10.30
iOS 6주차  (1) 2024.10.09
iOS 5주차  (0) 2024.10.07
IOS 4주차  (4) 2024.09.25