일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Java
- 파일 시스템
- LoB
- PHP
- 백준
- C
- HTML
- 파이썬
- 정렬 알고리즘
- c언어
- web
- OSI
- 스택
- windosws wbcs
- 자료구조
- 큐
- 재귀
- windosw 문자열
- pwnable.kr
- 두근두근 자료구조
- System
- ftz level13
- level13
- 미로 탐색 알고리즘
- War Game
- 시간복잡도
- SWiFT
- Stack
- 암호수학
- ftz
- Today
- Total
나의 기록, 현진록
[Swift] 10.1.3 연산 프로퍼티 / 접근자와 설정자 본문
스위프트 프로그래밍 3판 - 야곰 지음
연산 프로퍼티는 실제 값을 저장하는 프로퍼티가 아니라, 특정 상태에 따른 값을 연산하는 프로퍼티입니다. 인스턴스 내/외부 값을 연산하여 적절한 값을 돌려주는 접근자(getter)의 역할이나 은닉화된 내부의 프로퍼티 값을 간접적으로 설정하는 설정자(setter)의 역할을 할 수도 있습니다. 클래스, 구조체, 열거형에 연산 프로퍼티를 정의할 수 있습니다.
굳이 메소드를 두고 연산 프로퍼티를 사용하는 이유
인스턴스 외부에서 메소드를 통해 인스턴스 내부 값에 접근하려면 메소드를 두 개(접근자, 설정자) 구현해야 합니다. 또한 이를 감수하고 메소드로 구현한다 해도 두 메소드가 분산 구현되어 코드의 가독성이 나빠질 수 있습니다.
다만 연산 프로퍼티는 접근자인 get메소드만 구현해둔 것처럼 읽기 전용 상태로 구현하기 쉽지만, 쓰기 전용 상태로 구현할 수 없다는 단점이 있습니다. 메소드로는 설정자 메소드만 구현하여 쓰기 전용 상태로 구현할 수 있지만 연산 프로퍼티는 불가능합니다.
연산 프로퍼티를 적용하지 않고 메소드로 접근자와 설정자를 구현한 코드이다.
struct CoordinatePoint{
var x: Int
var y: Int
func oppositePoint() -> Self{
return Self(x: -x, y: -y)
}
mutating func setOppositePoint(_ opposite: CoordinatePoint){
x = -opposite.x
y = -opposite.y
}
}
var currentPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
//현재 좌표
print(currentPosition)
//대칭 좌표
print(currentPosition.oppositePoint())
//대칭 좌표를 (15, 10)으로 설정하면
currentPosition.setOppositePoint(CoordinatePoint(x:15, y:10))
//현재 좌표는 -15, -10으로 설정됩니다.
print(currentPosition)
oppositePoint() 메소드로 대칭점을 구할 수 있으며 setOppositePoint() 메소드로 대칭점을 설정해줘야 합니다. 이는 접근자와 설정자 이름의 일관성을 유지하기 힘들며, 해당 포인트에 접근할 때와 설정할 때 사용하는 코드를 한 번에 읽기도 쉽지 않습니다.
하지만 연산 프로퍼티를 사용하면 이 두 메소드를 좀 더 확실하게 표현할 수 있습니다.
struct CoordinatePoint{
var x: Int
var y: Int
var oppositePoint: Self{
//접근자
get{
//return 키워드 생략 가능
return CoordinatePoint(x: -x, y: -y)
}
//설정자
set(opposite){
x = -opposite.x
y = -opposite.y
}
}
}
var currentPosition: CoordinatePoint = CoordinatePoint(x: 10, y: 20)
//현재 좌표
print(currentPosition)
//대칭 좌표
print(currentPosition.oppositePoint)
//대칭 좌표를 (15, 10)으로 설정하면
currentPosition.oppositePoint=CoordinatePoint(x: 15, y:10)
//현재 좌표는 -15, -10으로 설정됩니다.
print(currentPosition)
이런 식으로 연산 프로퍼티를 사용하면 하나의 프로퍼티에 접근자와 설정자가 모두 모여 있고, 해당 프로퍼티가 어떤 역할을 하는지 좀 더 명확하게 보입니다. 인스턴스를 사용하는 입장에서도 마치 저장 프로퍼티인 것처럼 사용할 수 있습니다.
결과 값 타입이 프로퍼티 타입과 같다면 return 키워드를 생략할 수 있습니다.
'Programming > Swift' 카테고리의 다른 글
[Swift] 타입 프로퍼티 (0) | 2021.07.19 |
---|---|
[Swift] 10.1.4 프로퍼티 감시자 (0) | 2021.07.19 |
[Swift] 10.1.2 지연 저장 프로퍼티 (0) | 2021.07.16 |
[Swift] 구조체와 클래스의 차이 / 식별연산자 (0) | 2021.07.15 |
[Swift] 구조체와 클래스 (0) | 2021.07.15 |