iOS 실무 4주차

2025. 3. 27. 15:40iOS앱개발

class Man {
    var age : Int = 1
    var weight : Double = 3.5
    
    init(age:Int, weight: Double){
        self.age = age
        self.weight = weight
    }// designated initializer
    
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
}

var gu = Man(age: 10, weight: 12.12)
gu.display()
	
class Student : Man {
    var name : String
    func display() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double, name : String){
        self.name = name
        super.init(age:age, weight:weight) //이 줄을 안쓰면?
    }//error:'super.init' isn't called on all paths before returning from initializer
}

var kim = Student(age: 20, weight: 100.12, name: "sangtae")
kim.displayS()​
  init(yourAge:Int, yourWeight: Double){
        age = yourAge
        weight = yourWeight
    }// designated initializer​
import UIKit  // iOS 개발을 위한 UIKit 프레임워크를 가져옵니다. UI 관련 기능을 사용할 수 있습니다.

class ViewController: UIViewController {  
    // ViewController 클래스를 선언합니다. 
    // UIViewController를 상속하여 화면을 관리할 수 있도록 합니다.

    override func viewDidLoad() {  
        // viewDidLoad() 메서드는 뷰가 메모리에 로드될 때 한 번 호출됩니다.
        super.viewDidLoad()  
        // 부모 클래스(UIViewController)의 viewDidLoad()를 호출하여 기본 동작을 수행합니다.
    }
}

Argument vs Parameter

Parameter(매개변수)

  • 함수를 선언할 때 사용
  • 함수가 받을 값의 이름과 타입을 정의하는 역할

Argument(인수)

  • 함수를 호출할 때 전달하는 실제 값
  • 매개변수(Parameter)에 할당되는 값

함수와 메서드의 차이점

 

 

함수를 호출할때는 적절한 argument label을 지정해줘야 한다.

매개변수(Parameter):

  • x: Int와 y: Int는 add 함수의 **매개변수(Parameter)**입니다.
  • 이 매개변수들은 함수 내부에서 값을 받을 변수로 정의되어 있습니다.

인수(Argument):

  • add(x: 10, y: 20)에서 10과 20은 **인수(Argument)**입니다.
  • 함수가 호출될 때 매개변수(x, y)에 전달되는 실제 값입니다.

📌 정리:

  • **x와 y**는 함수 선언에서 **매개변수(Parameter)**입니다.
  • 함수 호출 시 전달되는 **10과 20**은 **인수(Argument)**입니다.

함수의 자료형

func add (x: Int, y: Int) -> Int {
    return x + y
}

print(type(of: add)) //(Int, Int) -> Int

 

Argument Label

func add2 (xx x: Int, yy y: Int) -> Int {
    return x + y
}

print(add2(xx: 10,yy: 20))

함수를 호출할때 사용하는 label입니다. 함수 내부에서는 xx , yy로 접근할 수 없고 x와 y로 접근해야합니다.

 

label로 _를 줄 경우 생략한다는 의미를 가지기 때문에 인자를 전달해줄때 위 방식으로 전달을 하면 에러가 나게 된다. 따라서

이러한 방식으로 값을 전달해주어야 하지만 별로 추천되는 방법은 아니다.

 

권장하는 방법?

func add2 (_ x: Int, second y: Int) -> Int {
    return x + y
}

print(add2(10, second: 20))

이와같이 첫번째 argument label은 생략하고 두번째 인자부터 label을 달아주는 방식이 권장된다.

 

함수의 이름

func add (x: Int, y: Int) -> Int {
    print(#function) //add(x:y:)
    return x + y
}
print(add(x:10, y: 20))
func add (first x: Int, second y: Int) -> Int {
    print(#function) //add(first:second:)
    return x + y
}
print(add(first: 10, second: 20))
func add (_ x: Int, _ y: Int) -> Int {
    print(#function) //add(_:_:)
    return x + y
}
print(add(10, 20))
func add (_ x: Int, second y: Int) -> Int {
    print(#function) // add(_:second:)
    return x + y
}

print(add(10, second: 20))

Class

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

var gu: Man = Man(yourAge: 10, yourWeight: 12.12)
gu.display()

 

클래스는 기본적으로 프로퍼티, 생성자 함수, 메소드, 클래스 메소드를 가진다.

 

 

클래스 내부에 사용자 정의 생성자(init())가 없으면 Swift가 기본 생성자(default initializer)를 자동으로 제공한다.

 

  init(yourAge:Int, yourWeight: Double){
        age = yourAge
        weight = yourWeight
    }// designated initializer

모든 프로퍼티를 다 초기화시키는 생성자를 designated initailizer라고 한다.

// Man 클래스 정의
class Man {
    // 속성 (Property): 나이(age)와 몸무게(weight)를 저장
    var age: Int = 1    // 기본값 1로 초기화
    var weight: Double = 3.5  // 기본값 3.5로 초기화
    
    // (Initializer): 객체가 생성될 때 나이와 몸무게를 설정할 수 있도록 합니다.
    init(age: Int, weight: Double) {
        // 초기화 내에서 self를 사용하여 인스턴스 속성에 값을 할당
        self.age = age  // 외부에서 전달된 age 값을 클래스의 age 속성에 할당
        self.weight = weight  // 외부에서 전달된 weight 값을 클래스의 weight 속성에 할당
    } // `Man` (Designated Initializer)
    
    // 메서드 (Method): 객체의 정보를 출력하는 메서드
    func display() {
        // 현재 객체의 나이와 몸무게를 출력
        print("나이=\(age), 몸무게=\(weight)") 
    }
}

// Man 클래스의 인스턴스 생성
var gu: Man = Man(age: 10, weight: 12.12)  // age: 10, weight: 12.12로 `Man` 객체를 생성

// display() 메서드 호출: 생성된 객체의 나이와 몸무게를 출력
gu.display()  // 출력: 나이=10, 몸무게=12.12

student클래스에는 상속받은 display를 가지고 있기 떄문에 현재 에러가 나는 상황이다

class Man {
    var age : Int = 1
    var weight : Double = 3.5
    
    init(age:Int, weight: Double){
        self.age = age
        self.weight = weight
    }// designated initializer
    
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
}

var gu = Man(age: 10, weight: 12.12)
gu.display()
	
class Student : Man {
    var name : String
    override func display() {
        print("이름=\(name), 나이=\(age), 몸무게=\(weight)")
    }
    init(age: Int, weight : Double, name : String){
        self.name = name
        super.init(age:age, weight:weight) 
    }
}

var kim = Student(age: 20, weight: 100.12, name: "sangtae")
kim.displayS()

override 키워드를 통해서 자식 클래스에서 메소드를 재정의하기위해 사용한다

 

protocol

스위프트에서 프로토콜(Protocol)은 어떤 특정 작업을 수행하는 데 필요한 요구 사항을 정의하는 블루프린트입니다. 프로토콜은 메서드, 속성, 기타 요구 사항을 정의하지만 그 자체로는 구현을 포함하지 않습니다. 대신, 이 프로토콜을 채택하는 타입(클래스, 구조체, 열거형)이 요구 사항을 구현해야 합니다.

 

프로토콜을 사용하면 다양한 타입이 동일한 메서드나 속성을 구현하도록 강제할 수 있습니다. 이는 객체 지향 프로그래밍에서 다형성을 구현하는 데 유용합니다.

protocol SomeProtocol {
    var someProperty: String { get set } // 프로퍼티 요구 사항
    func someMethod() // 메서드 요구 사항
}

프로토콜을 채택했다면 프로토콜이 요구하는 프로퍼티와 메소드를 반드시 구현해야한다.

// 1. 프로토콜 정의: `Runnalbe` 프로토콜을 정의합니다.
// 프로토콜은 해당 타입이 채택해야 하는 요구사항을 정의하는 블루프린트입니다.
protocol Runnalbe {
    var x: Int { get set }  // `x`라는 변수는 읽기 및 쓰기가 가능해야 함
    func run()  // `run`이라는 메서드가 정의되어야 함
}

// 2. `Man` 클래스 정의: `Runnalbe` 프로토콜을 채택합니다.
// 클래스가 프로토콜을 채택하려면, 프로토콜에 정의된 요구사항을 구현해야 합니다.
class Man: Runnalbe { // `Man` 클래스는 `Runnalbe` 프로토콜을 채택합니다.
    
    // 3. `x` 프로퍼티 구현: 프로토콜에서 요구하는 `x` 프로퍼티를 구현합니다.
    // `x`는 `Int` 타입이고, 읽기 및 쓰기가 가능합니다.
    var x: Int = 1 // `x`의 초기값은 1로 설정
    
    // 4. `run` 메서드 구현: 프로토콜에서 요구하는 `run()` 메서드를 구현합니다.
    // `run` 메서드는 "run"을 출력하는 기능을 합니다.
    func run() {  // `run` 메서드를 정의
        print("run")  // "run"을 출력
    }
}

// 5. `Man` 클래스의 인스턴스를 생성하여 사용
var kim = Man()  // `Man` 클래스의 인스턴스를 생성하고, `kim`이라는 이름으로 변수에 저장

// 6. `run()` 메서드 호출
kim.run()  // `kim` 객체에서 `run()` 메서드를 호출하여 "run"을 출력

예시 

// 프로토콜 정의
protocol Flyable {
    func fly()
}

// 부모 클래스 정의
class Animal {
    var name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func makeSound() {
        print("\(name)가 소리를 낸다!")
    }
}

// 자식 클래스가 프로토콜과 상속을 함께 채택
class Bird: Animal, Flyable {
    var wingspan: Double
    
    init(name: String, age: Int, wingspan: Double) {
        self.wingspan = wingspan
        super.init(name: name, age: age)
    }
    
    func fly() {
        print("\(name)가 날고 있어요!")
    }
}

// 객체 생성 및 사용
let eagle = Bird(name: "Eagle", age: 5, wingspan: 2.5)
eagle.makeSound()  // 출력: Eagle가 소리를 낸다!
eagle.fly()  // 출력: Eagle가 날고 있어요!

 

'iOS앱개발' 카테고리의 다른 글

iOS실무 6주차  (0) 2025.04.10
iOS실무 5주차- 맛집 앱 개발(1) Table View  (0) 2025.04.03
iOS 실무 3주차  (0) 2025.03.20
iOS 실무 2주차  (0) 2025.03.13
iOS실무  (0) 2025.03.06