Computed Property(연산 프로퍼티) vs Method

이원희·2020년 12월 27일
0

 🐧 Swift

목록 보기
12/32
post-thumbnail

이 포스팅은 아래의 코드에 달린 코드리뷰에 대한 답글로 이뤄질 것이다!

enum Country {
    case Korea
    case Japan
    case China
    case America
    case France
    
    func getName() -> String {
        switch self {
        case .Korea:
            return "한국"
        case .Japan:
            return "일본"
        case .China:
            return "중국"
        case .America:
            return "미국"
        case .France:
            return "프랑스"
        }
    }
}

혹시 이부분은 연산프로퍼티를 사용할 수 있었을 것 같은데 메소드를 사용한 이유가 뭔지 궁금합니다😉

(🦉 붱이 감사해영)

이유는?

내가 코드를 짤때에는 프로퍼티에 대해 이해가 없어서 어떨때 연산프로퍼티를 쓰고 메소드를 쓸지에 대해 기준이 없었다.
그래서 익숙한 메서드로 구성했다.

지금이라면?

enum Country {
    case Korea
    case Japan
    case China
    case America
    case France
    
    var countryName: String {
        switch self {
        case .Korea:
            return "한국"
        case .Japan:
            return "일본"
        case .China:
            return "중국"
        case .America:
            return "미국"
        case .France:
            return "프랑스"
        }
    }
}

지금 다시 코드를 짠다면 위와 같이 연산 프로퍼티를 읽기 전용으로 구성할 것이다.

프로퍼티와 메서드를 어느정도 써봤고, 정리해본 결과 어느정도 기준이 생겼다.
연산 프로퍼티와 메서드를 결정하는 기준은 프로퍼티의 값을 변경하는지이다.

내가 원했던 작업은 case별로 나라 이름을 반환해주는 것이므로 프로퍼티의 값을 변경하지 않기 때문에 연산 프로퍼티로 구현할 것이다.


연산프로퍼티와 파라미터가 없는 메소드는 어떤 차이가 있을까요?

코드로 둘의 차이를 알아보자

Method

struct Point {
    var x: Int
    var y: Int
    
    func opposite() -> self {
        return Point(x: -x, y: -y)
    }

    mutating func setOpposite(_ opposite: Point) {
        x = -opposite.x
        y = -opposite.y
    }
}

opposite()접근자(getter)와 같은 역할을 하고 있다.
setOpposite()설정자(setter)와 같은 역할을 하고 있다.


computed Property

struct Point {
    var x: Int
    var y: Int
    
    var opposite: Point {
        get {
            return Point(x: -x, y: -y)
        }
        set(opposite) {
            x = -opposite.x
            y = -opposite.y
        }
    }
}

var position = Point(x: 10, y: 20)
position.opposite

opposite라는 computed Property를 선언했다.
접근자(getter)설정자(setter)가 모여 있는 모습을 볼 수 있다.
위의 타입으로 생성된 인스턴스를 사용하는 입장에서는 저장 프로퍼티처럼 사용할 수 있다.


비교

  • 메서드로 구현했다면 인스턴스 외부에서 메서드를 통해 내부 값에 접근하기 위해서는 접근자(getter), 설정자(setter) 역할을 하는 두개의 메서드를 구현해야 한다.
  • 접근자(getter), 설정자(setter) 역할을 하는 두개의 메서드가 분산 구현되어 가독성이 떨어진다.
  • 메서드로는 쓰기 전용 상태로만 구현이 가능하다.
  • 연산 프로퍼티는 접근자(getter)만 구현해 읽기 전용 상태 구현이 쉽다.
  • 연산 프로퍼티는 쓰기 전용 상태로는 구현이 불가능하다.

3개의 댓글

comment-user-thumbnail
2021년 4월 30일

글 잘 읽었습니다 :) 질문 드리고 싶은 것이 있는데 마지막 비교에서 메소드를 통해 내부 값에 접근하기 위해서는 접근자, 설정자 역할을 하는 2개의 메소드가 필요하다고 하셨는데 하나의 메소드 안에서 로직을 처리한 후 return하는 구조로 만들면 하나의 메소드에서 처리 가능하지 않나요? 연산 프로퍼티도 getter 내부에서 set의 로직을 처리하여 get 할 수 있는 것으로 알고 있는데 메소드와 computed의 모두 따로 만드려면 2개로 구현 가능하고, 읽기(get)에 한정해서는 두 방법 모두 하나의 표현으로 구현 가능하지 않은가 해서요! 제가 써주신 글을 이해 못한 걸 수도 있을 것 같아서 질문드립니다! 감사합니다 :)

2개의 답글