본문 바로가기

Swift 문법정리

1.3 Classes and Structures Method정리

Classes and StructuresMethod

1.1 Method

클래스, 구조체, 열거형과 같은 객채 내에서 함수가 선언될 경우 메서드라고 칭합니다. 함수와의 차이점은 함수는 독립적인 기능을 구현하기 위해 만들어졌다면 메서드는 하나의 객체 내에 정의된 다른 메서드들과 협력하여 함수적인 기능을 수행합니다. 

객체의 인스턴스를 생성해야 사용할 수 있는 인스턴스 메서드와 객체의 인스턴스를 생성하지 않아도 사용할 수 있는 타입 메서드로 나눌 수 있습니다. 

1.2 Instance Method

클래스, 구조체, 열거형과 같은 객체 타입이 만들어 내는 인스턴스에 소속된 함수를 인스턴스 함수라고 합니다. 객체의 인스턴스에 대한 기능적인 면을 제공합니다. 객체 타입 내부에 선언되었다는 점을 제외하면 일반 함수와 형식은 같습니다. 

 

struct Resolution {
    var width = 0 
    var height = 0
    
    // 구조체의 요약된 설명을 리턴해주는 인스턴스 메소드
    func desc() -> String {
        let desc = "이 해상도는 가로 \(self.width) X \(self.height)로 구성됩니다."
        return desc
    }
}

class VideoMode {
    var resolution = Resolution
    var interlaced = false
    var frameRate = 0.0
    var name : String?
    
    // 클래스의 요약된 설명을 리턴해주는 인스턴스 메소드
    func desc() -> String {
        if self.name != nil {
            let desc = "이 \(self.name!) 비디오 모드는 \(self.frameRate)의 프레임 비율로 표시됩니다."
            return desc
        }
    }
 }

 

위 예시는 구조체와 클래스 안에 desc라는 인스턴스 메소드를 만들 예시입니다. 인스턴스 메서드와 일반 함수의 차이가 있습니다.

1. 인스턴스 메소드는 구조체와 클래스의 인스턴스에 소속된다는 점
2. 메소드 내에서 정의된 변수와 상수뿐만 아니라 클래스 범위에서 정의된 프로퍼티도 모두 참조할 수 있다는 점
3. self 키워드를 사용할 수 있다는 점

 

self.프로퍼티명

 

구조체 Resolution에 선언된 desc() 메서드는 내부 프로퍼티 width, height를 이용하면서 self 키워드를 붙였습니다. self키워드는 클래스, 구조체 자신의 인스턴스에 속한 프로퍼티라는 의미를 가집니다. 대부분 알아서 self 처리를 해주지만 메서드 내부에 프로퍼티와 동일한 이름을 가진 변수나 상수가 선언되었을 경우 반드시 self를 붙여 처리해주어야 합니다. 

 

struct Resolution {
    var width = 0 
    var height = 0
    
    func judge () -> Bool {
        let width = 30
        return self.width == width
    } // false
}

 

위의 예시같은 경우 Resolution의 width와 메 소은 안의 width를 구분하기 위해 self를 붙여 다름을 표시했습니다.

 

class Counter {
    // 카운트를 저장할 프로퍼티
    var count = 0
    
    // 카운트를 1 증가
    func increment () {
        self.count += 1
    }
    
    //입력된 값만큼 카운트를 증가
    func incrementBy(amount : Int) {
        self.count += amount
    }
    
    //카운트를 0으로 초기화
    func reset () {
        self.count = 0
    }
}

 

Counter 클래스에 3개의 인스턴스 메서드와 1개의 변수 프로퍼티가 있습니다. 이들을 호출하기 위해서는 인스턴스를 할당한 변수, 상수의 이름을 메서드 이름과 점으로 연결시키면 됩니다. 

 

// Counter 클래스의 인스턴스를 생성하고 초기 카운터 값은 0입니다.
let counter = Counter ()

// 카운터 값을 증가시킵니다. 카운터는 1입니다.
counter.increment()

//카운터 값을 5 증가시킵니다. 카운터는 6입니다.
counter.incrementBy(amount : 5)

// 카운터 값을 초기화 합니다. 카운터 값은 0입니다.
counter.reset()

 

위의 예시처럼 점 구문을 활용하여 호출이 가능합니다.

 

struct Point {

    var x = 0.0, y = 0.0
    
    mutating func moveByX (x deltaX : Double, y deltaY : Double) {
        self.x += deltaX
        self.y += deltaY
    }
}

var Point = Point (x : 10.5, y ; 12.0)
point.moveByX (x : 3.0, y : 4.5)
point("이제 새로운 좌표는 (\(point.x), \(point.y))입니다.")

// 이제 새로운 좌표는 (13.5, 16.5)입니다.

 

구조체나 열거형의 인스턴스 메소드내부에서 프로퍼티의 값을 수정할 때는 반드시 메서드 앞에 mutating 키워드를 붙여야 합니다. 내부 프로퍼티 값을 수정한다는 것을 알려야 합니다. 

구조체나 열거형 인스턴스를 상수로 할당 받으면 mutating 메서드를 호출할 수 없습니다. 내부의 값을 전혀 변경할 수 없는 상수에 값을 할당하면 프로퍼티 값을 수정할 수 없게 됩니다. 

 

class Location {

    var x = 0.0, y = 0.0
    
    func moveByX (x deltaX : Double, y deltaY : Double) {
        self.x += deltaX
        self.y += deltaY
    }
}

var loc = Location ()
loc.x = 10.5
loc.y = 12.0
loc.moveByX (x : 3.0, y : 4.5)
point("이제 새로운 좌표는 (\(loc.x), \(loc.y))입니다.")

// 이제 새로운 좌표는 (13.5, 16.5)입니다.

 

클래스의 인스턴스 메소드에서는 프로퍼티를 수정할 때 별도의 키워드가 필요하지 않습니다. 

1.3 Type Method

인스턴스 메소드의 경우 인스턴스에 의해 호출되는 메서드로 반드시 인스턴을 통해 호출할 수 있습니다. 반대로 타입 메서드는 인스턴스를 생성하지 않고 객체 타입 자체에서 호출할 수 있는 메서드입니다. 

타입 인스턴스와 마찬가지로 구조체, 열거형, 클래스 타입 모두 타입 메서드를 선언할 때 static 키워드를 사용합니다. 클래스 타입에서만 재정의 가능한 타입 매소드를 선언할 때만 class를 쓸 수 있습니다. 

 

class Foo {
    // 타입 메소드 선언
    class func fooTypeMethod () {
        // 타입 메소드의 구현 내용이 여기에 들어갑니다.
    }
}

let f = foo ()
f.fooTypeMethod () // 오류
Foo.fooTypeMethod ()

 

타입 메소드는 객체의 값을 변경하면 해당 객체 타입을 사용하는 모든 곳에 변경된 값이 적용됩니다. 타입 메서드에서는 인스턴스 프로퍼티를 참조할 수 없습니다. 타입 메서드 자체에 인스턴스가 존재하지 않기 때문에 사용할 수 있는 프로퍼티는 타입 프로퍼티뿐입니다.

'Swift 문법정리' 카테고리의 다른 글

1.2 Classes and Structures Property 정리  (0) 2020.05.14
1.1 Classes and Structures 정리  (0) 2020.05.13
Function 정리  (0) 2020.05.11
Collection Types 정리  (0) 2020.05.08
Optional 정리  (0) 2020.05.08