Swift 문법 - 3

2024. 3. 27. 16:48iOS

1. 함수

1.1. C의 함수와 비교

//C, C++
int add(int x, int y) {
	return(x+y);
} 
add(10,20);
//Swift
func add(x: Int, y: Int) -> Int { 
	return(x+y)
}
add(x:10, y:20)

 

1.2. 함수명

- *함수명 출력 코드

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

- Swift의 함수명은 외부 매개변수명과 함께 출력되는 특징이 있다.

- 함수명이 길지만, 해당 함수의 기능을 추측할 수 있는 장점이 있다.

 

1.3. 함수의 자료형

- 함수의 자료형 출력 코드

print(type(of:add))

- 함수의 자료형 출력 시 매개변수와 리턴값의 자료형이 출력된다.

 

1.4. default parameter

- 함수 선언 시 매개변수 = '기본값'과 같이 정의했을 때, 해당 함수 호출 시 해당 매개변수에 값을 넘기지 않을 경우 선언 시 입력한 기본값으로 값이 넘어가게 된다.

- default parameter를 사용한 함수

 

 

2. 클래스

2.1. 클래스 기본 구조

class 새로운 클래스 이름 : 부모 클래스 {
    // property..
    // instance method..
    // type method..
}

 

2.2. stored property

- 클래스 내에 선언된 변수 및 상수

- 초기화 필수

- 초기화 방법: 값 입력, optional, 생성자

 

2.3. instance method

- 인스턴스에서 접근 가능한 메서드

 

2.4. type method

- 클래스에서 접근 가능한 메서드

- static으로 선언 시 subclass에서 재정의할 수 없다.

 

2.5. initializer

- 객체 초기화 시 사용하는 메서드

- default initializer: initializer를 따로 정의하지 않을 경우 생성되는 기본 생성자로, 매개변수를 넘기지 않는다.

- initializer는 method overloading을 통해 여러 개 생성할 수 있다.

- method overloading: 한 클래스 내에서 동일한 이름의 함수를 여러 개 중첩하여 정의할 수 있다.

- self: 현재 클래스 내 메서드나 프로퍼티를 가리키는 keyword

- *designated initializer: 클래스의 모든 프로퍼티를 초기화하는 생성자

 

2.6. 클래스를 선언, 호출한 코드

class Man {
    //stored property
    var age = 10
    var weight = 3.5
    
    //instance method
    func display(){
        print("나이=\(age), 몸무게=\(weight)")
    }
    
    //class method
    class func cM(){
    print("cM은 클래스 메서드입니다.")
    }
    
    //class method
    static func scM(){
    print("scM은 클래스 메서드(static)")
    }
    
    //initializer
    init(age: Int, weight : Double){
        self.age = age
        self.weight = weight
    }
}

var man = Man(age:10, weight:20)
print("생성한 인스턴스의 나이:\(man.age)")
man.display()
Man.scM()

 

2.7. 상속

- 클래스를 상속할 경우 하나만 가능하고, 프로토콜은 여러 개 가능하다.

- 클래스 선언 시 콜론(:)을 통해 상속 관계를 표현한다.

- 상속 시 부모의 프로퍼티와 메서드를 접근할 수 있다.

- super: 부모의 프로퍼티나 메서드 접근 시 사용하는 keyword

- override: 부모의 동일한 이름의 메서드를 재정의

- 2.6의 Man 클래스를 상속받은 Student 클래스

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: 55, weight: 35, name: "Shin")
kim.display()

 

 

3. access control

3.1. access control이란

- 코드의 일부분에 대한 접근을 제한하는 방법

- 캡슐화와 정보 은닉의 원칙을 구현

3.2. access modifier

- 클래스, 메서드, 멤버의 접근 가능성을 설정하는 객체 지향 언어의 키워드

- default access modifier: internal

3.3. access modifier의 종류

- Open과 Public

open과 public 액세스 수준은 가장 높은 접근 수준을 제공하며, 이를 사용하면 모든 모듈에서 해당 코드에 접근할 수 있습니다. 하지만 open과 public 사이에는 중요한 차이가 있습니다. open은 클래스와 클래스 멤버에만 사용할 수 있으며, 해당 클래스를 다른 모듈에서 상속받거나 오버라이드할 수 있게 해줍니다. 반면, public으로 선언된 클래스는 다른 모듈에서 상속받거나 오버라이드할 수 없습니다.

- Internal

internal 액세스 수준은 기본 설정으로, 같은 모듈 내에서만 접근할 수 있게 해줍니다. 다른 모듈에서는 접근할 수 없습니다. 대부분의 경우, 애플리케이션 또는 프레임워크 내부에서 사용되는 코드에 적합합니다.

- File-private

fileprivate 액세스 수준은 같은 소스 파일 내에서만 접근할 수 있게 해줍니다. 이를 통해 같은 파일 내의 다른 타입이나 함수와의 세밀한 접근 제어가 가능하며, 그 이외의 위치에서는 접근할 수 없습니다.

- Private

private 액세스 수준은 선언이 포함된 블록(예: 클래스, 구조체, 열거형, 또는 확장) 내에서만 접근할 수 있게 해줍니다. 이는 가장 제한적인 액세스 수준으로, 세부 구현을 숨기고 해당 블록 내에서만 사용되는 코드에 사용됩니다.

 

 

4. protocol

4.1. protocol의 개념

- 특정 클래스와 관련없는 함수(메서드)들의 선언 집합

- java, C#의 interface와 비슷한 개념을 보유

- POP(Protocol Oriented Programming): 프로토콜 단위로 묶어 표현하고, extension으로 기본적인 것을 구현하여 단일 상속의 한계를 극복하는 프로그래밍 기법

4.2. protocol의 기본 구조

protocol 프로토콜명{
	//property name
    //메서드 선언
}

 

 4.3. adopt, conform

- 한 class에서 여러 개의 protocol을 채택(adopt)할 수 있다.

- 준수(conform): 채택한 클래스는 상속한 protocol에서 선언된 property와 method를 반드시 구현해야 한다.

- protocol을 adopt한 class 코드

protocol Run {
    var x : Int { get set }
    func run()
}

class Man : Run {//adopt
    var x = 0//conform
    
    func run(){//conform
        print("뛰다")
    }
}

var kim = Man()
kim.run()

 

 

 

5. 참고자료: iOS 프로그래밍 실무 강의 - 한성현 교수님

'iOS' 카테고리의 다른 글

앱 개발 실습 - 2  (0) 2024.04.17
앱 개발 실습 - 1  (0) 2024.04.03
Swift 문법 - 2  (0) 2024.03.20
Swift 문법 - 1  (0) 2024.03.13
앱 개발 기술  (0) 2024.03.06