본문 바로가기

프로그래밍/Swift

접근 수준 활용하여 프레임워크 만들기

연결 리스트에 관한 프레임워크를 만들다가, 서로 연결된 데이터의 수를 반환하는 좋은 방법이 떠올랐다. 

 

연결 리스트 관련 포스팅: https://taeminator1.tistory.com/36

연결 리스트 관련 소스 코드: https://github.com/Taeminator1/Data-Structure

프레임워크 관련 포스팅: https://taeminator1.tistory.com/38

 

해당 변수의 이름은 Array에서와 마찬가지로 count로 정해줬다. count는 인스턴스의 첫 번째 노드를 시작으로 연결된 노드의 총개수를 반환하는 변수이다.

 

이러한 count를 구현하기 위해 처음에는 다음과 같이 구현하였다. 

public class LinkedList<Element> {
    var first: Node<Element>?
    var last: Node<Element>?
    public var count: Int
}​

먼저 LinkedList의 인스턴스에 노드가 추가되거나 제거될 때, 해당 count를 조작하면, 프레임워크를 사용하는 사용자는 연결된 노드의 수를 count 변수를 통해 반환받을 수 있다. 

하지만 문제는, 사용자가 임의로 count를 수정할 수 있다는 것이다. isEmpty와 같이 인스턴스 내부에서 count 변수를 사용하는 경우가 있기 때문에, 사용자에 의해 임의로 바뀌게 되면, count를 사용하는 다른 변수나 메서드에서 문제가 발생할 수 있다. 

 

그래서 count 변수에 대응하는 접근 수준이 낮은 임시 변수를 두어, count 변수는 getter를 통해 접근이 가능하도록 하고 해당 임시 변수는 기존에 count를 사용하던 변수나 메서드에서 사용하도록 변경하였다. 이렇게 하면 사용자는 count 변수를 임의로 조작할 수는 없지만 count를 반환받을 수는 있고, 기존에 count를 조작하던 메서드는 임시 변수를 조작하여 그대로 사용이 가능하다. 

 

다음의 코드를 살펴보자. 

public class LinkedList<Element> {
    var first: Node<Element>?
    var last: Node<Element>?
    var tmpCount: Int               // count를 임의로 수정하지 못하게 임시 저장하는 변수
    
    public var count: Int {
        return tmpCount
    }
    
    public func append(_ newNode: Node<Element>) {
        if isEmpty {
            first = newNode
        }
        else {
            last?.next = newNode
        }
        last = newNode
        tmpCount += 1
    }
}

앞에서 설명한 대로, count에 대한 임시 변수로 tmpCount를 선언해 주었다. 기존에 count는 getter로만 접근이 가능하기 때문에 tmpCount를 조작하도록 append 메서드를 수정해 주었다. 

 

따라서 Array에서 사용하는 count 변수와 유사하게, LinkedList에서도 count 변수를 활용할 수 있게 되었다. 

 

이렇듯 임시 변수를 통해 접근 수준을 제어하면 보다 안정성이 높은 코딩을 할 수 있게 된다.