[ Swift ] func 메서드 vs 계산 프로퍼티(var {})
![[ Swift ] func 메서드 vs 계산 프로퍼티(var {})](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%25EB%25A7%25A4%25EC%259D%25BC%2B%25EC%259E%2591%25EC%258B%25AC%25EC%2582%25BC%25EC%259D%25BC%2B%25EC%258A%25A4%25EC%259C%2584%25ED%2594%2584%25ED%258A%25B8%26tag%3DTemplate%2B1%26description%3Dfunc%2B%25EB%25A9%2594%25EC%2584%259C%25EB%2593%259C%2Bvs%2B%25EA%25B3%2584%25EC%2582%25B0%2B%25ED%2594%2584%25EB%25A1%259C%25ED%258D%25BC%25ED%258B%25B0%2528var%2B%257B%257D%2529%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523ffffff%26bgEndColor%3D%2523ffffff%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3Dhttps%253A%252F%252Fsource.inblog.dev%252Flogo%252F2025-12-07T07%253A56%253A09.171Z-0f25584a-63d1-4225-858c-cfe5a6cdd826%26blogTitle%3DRN%2B%25EC%2582%25BD%25EC%25A7%2588%2B%25EC%259D%25BC%25EC%25A7%2580&w=3840&q=75)
Swift를 보다 보면 아래처럼 “똑같이 점수를 계산하는 코드”가 두 가지 형태로 등장한다.
struct Student {
var knowledge: Double
func didFinalTest() -> Int {
let score = Int(knowledge * 100)
return score
}
}struct Student {
var knowledge: Double
var didFinalTest: Int {
let score = Int(knowledge * 100)
return score
}
}겉보기엔 둘 다 계산해서 Int를 주는데, 둘의 정체는 다르다.
결론부터: “행동 호출” vs “값 조회”
func didFinalTest() -> Int
➜ 메서드(Method): “행동(동작)을 호출(call)한다”
➜ 사용:student.didFinalTest()var didFinalTest: Int { ... }
➜ 계산 프로퍼티(Computed Property): “값(속성)을 조회(get)한다”
➜ 사용:student.didFinalTest
즉, **괄호 ()가 있으면 행동(함수 호출), 없으면 값(프로퍼티 접근)**이라는 느낌으로 잡으면 이해가 빠르다.
가장 헷갈리는 포인트 1: “프로퍼티면 미리 계산된 값인가?”
아니다.
var didFinalTest: Int { ... } 같은 계산 프로퍼티는 저장된 값이 없다.
접근할 때마다 { ... } 블록이 실행되면서 그 순간 계산해서 반환한다.
즉,
메서드도 호출할 때 계산
계산 프로퍼티도 접근할 때 계산
둘 다 “지금 계산”이다.
“미리 계산된 값(저장된 값)”은 아래처럼 저장 프로퍼티(stored property)일 때다:
struct Student {
var knowledge: Double
let finalScore: Int // <- 저장된 값 (이미 들고 있음)
}가장 헷갈리는 포인트 2: “그럼 둘은 완전히 똑같은 것 인가?”
로직 실행 결과는 같을 수 있어도, 의미(의도)와 쓰임새가 다르다.
1) 의미(읽는 사람이 느끼는 뉘앙스)
메서드: “시험 본다 / 채점한다” 같은 행동
프로퍼티: “이 학생의 점수는” 같은 속성(값)
코드를 읽는 사람 입장에서는
student.didFinalTest()→ “뭔가를 시킨다”student.didFinalTest→ “값을 꺼내본다”
로 받아들인다.
2) 기능적으로도 차이가 난다
메서드는 이런 확장이 자연스럽다:
매개변수 받기
throws,async상태 변경(
mutating) 같은 “행동”에 적합
계산 프로퍼티는 보통:
가볍게 계산되는 “파생 값” 표현에 적합
값처럼 쓰는 게 목적 (
student.finalScore)
언제 메서드, 언제 계산 프로퍼티?
계산 프로퍼티가 어울릴 때
객체의 상태로부터 즉시 계산되는 파생 값
“이건 그 객체의 속성이다”가 자연스러움
예:
finalScore,fullName,isAdult,area
메서드가 어울릴 때
“무언가를 한다”는 행동이 자연스러움
파라미터가 필요하거나, 예외/비동기 처리 가능성이 있음
상태 변경이 포함될 수 있음
예:
takeTest(),submit(),fetchData(),updateProfile()
한 줄 요약
func= 행동을 호출한다 (())var {}= 값을 조회한다 (하지만 접근 순간마다 계산됨)
그리고 헷갈리면 이름부터 정리하면 거의 해결된다:
행동이면 동사형 메서드, 값이면 명사형 프로퍼티.