메소드❗️

DEVJUN·2022년 6월 1일
0

Swift 문법

목록 보기
10/14
post-thumbnail

  메소드(Method)는 일종의 함수로서, 클래스나 구조체, 열거형과 같은 객체 내에서 함수가 선언될 경우 이를 메소드라고 통칭한다. 즉, 메소드는 특정 타입의 객체 내부에서 사용하는 함수라고 할 수 있다.

  메소드는 인스턴스 메소드타입 메소드로 구분되는데, 객체의 인스턴스를 생성해야 사용할 수 있는 메소드가 인스턴스 메소드, 객체의 인스턴스를 생성하지 않아도 사용할 수 있는 메소드가 타입 메소드이다.

1. 인스턴스 메소드

  인스턴스 메소드는 클래스, 구조체 또는 열거형과 같은 객체 타입이 만들어 내는 인스턴스에 소속된 함수이다. 인스턴스 메소드는 구조체나 클래스, 열거형 등의 객체 타입을 인스턴스화 한 후, 이 인스턴스를 통하여 호출하게 된다.

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.na,e!) 비디오 모드는 \(self.frameRate)의 프레임 비율로 표시됨"
            return desc
        } else {
        	let desc = "이 비디오 모드는 \(self.frameRate)의 프레임 비율로 표시됨"
            return desc
        } 
    }
}

  위 예제에서 desc() 함수가 구조체와 클래스의 멤버인 메소드이다. 메소드와 함수는 세가지 차이가 있다.

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

  self는 클래스나 구조체 자신을 가리킨다. 정확히는 클래스나 구조체의 인스턴스 자신을 가르키는 것이다. 프로퍼티와 일반 변수의 이름이 충돌할 경우에는 프로퍼티 앞에 반드시 self 키워드를 붙여 주어야 한다.

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

  self.width와 width는 다른 객체이기 때문에 다르다. 따라서 false를 반환한다.

	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 클래스의 인스턴스 생성
    let counter = Counter()
    
    // 카운터 값을 증가시킴. 카운터 값 1
    counter.increment()

	// 카운터 값으 5만큼 증가시킴 카운터 값 6
    counter.incrementBy(amount: 5)
    
	// 카운터 값을 초기화 시킴 카운터 값 0
    counter.reset()

  주의 해야 할 점이 하나 있다. 구조체나 열거형의 인스턴스 메소드 내부에서 프로퍼티의 값을 수정할 때는 반드시 앞에 'mutating'이라는 키워드를 추가해야 한다. 이 키워드가 추가되지 않은 상태에서 프로퍼티의 값을 변경하고자 하면 오류가 발생한다. 내부 프로퍼티의 값을 수정할 때는 반드시 mutating 키워드를 사용하여 내부 프로퍼티 값을 수정하는 메소드라는 것을 컴파일러에게 알려주어야 한다.

  또한, 구조체나 열거형 인스턴스를 상수로 할당 받으면 mutating 메소드를 호출할 수 없다.

  다음 예제는 프로퍼티를 수정하기 위해 mutating 키워드를 사용하는 구조체의 예시이다.

	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)
    print("새로운 좌표 (\(point.x), \(point.y))")
    
    새로운 좌표 (13.5, 16.5)

2. 타입 메소드

  타입 메소드는 인스턴스를 생성하지 않고도 객체 타입 자체에서 호출할 수 있는 메소드이다.

  구조체나 열거형, 클래스 모두 타입 메소드를 선언할 때 static키워드를 사용한다. 반면 하위 클래스에서 재정의 가능한 타입 메소드를 선언할 때에는 class 키워드를 사용한다.

	clas Foo {
    	// 타입 메소드 선언 
        class func fooTypeMethod() {
        	// 타입 메소드의 구현 내용
        }
    }
    
    let f = Foo()
    f.fooTypeMethod() // 오류
    Foo.fooTypeMethod()

  타입 메소드를 사용하여 객체의 값을 변경하면 해당 객체 타입을 사용하는 모든 곳에서 변경된 값이 적용된다. 따라서 타입 메소드를 사용할 때에는 이러한 영향 범위를 고려하여 사용해야한다.

  또한 타입 메소드에서는 인스턴스 프로퍼티를 참조할 수 없다. 타입 메소드 자체에 인스턴스가 존재하지 않기 때문이다.

profile
🧑🏻‍💻iOS

0개의 댓글