Getter와 Setter 메서드
Coddy GO 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 107개 중 49번째.
내보내지 않은 필드는 패키지 외부에서 직접 액세스할 수 없으므로, 제어된 액세스를 허용하는 메서드를 제공해야 합니다. 이러한 메서드는 일반적으로 getters와 setters라고 합니다.
Go에서 getter의 관례는 간단합니다. 필드 이름의 첫 글자를 대문자로 사용하세요. "Get"을 앞에 붙이지 말고, GetBalance()가 아니라 Balance()를 사용하세요:
type BankAccount struct {
balance int // 비공개
}
// Getter - 값을 반환합니다
func (b *BankAccount) Balance() int {
return b.balance
}
// Setter - 유효성 검사와 함께 값을 수정합니다
func (b *BankAccount) SetBalance(amount int) {
if amount >= 0 {
b.balance = amount
}
}
세터의 진정한 강점은 유효성 검사나 비즈니스 로직을 추가하는 데 있습니다. 외부 코드가 어떤 값이든 직접 설정하도록 허용하는 대신, 허용되는 값을 제어할 수 있습니다:
func (b *BankAccount) Deposit(amount int) bool {
if amount <= 0 {
return false
}
b.balance += amount
return true
}
이 Deposit 메서드는 규칙을 적용하는 특수한 setter 역할을 합니다. 음수 입금은 허용되지 않습니다. 외부 코드는 반드시 사용자의 메서드를 거쳐야 하므로, 구조체는 항상 유효한 상태를 유지합니다. 이것이 바로 캡슐화의 실제 적용입니다. 데이터를 숨기는 동시에 제어된 동작을 외부에 제공합니다.
챌린지
쉬움getter 및 setter 메서드를 사용한 적절한 캡슐화를 보여 주는 온도 변환기를 만들어 보겠습니다. 내부적으로 온도를 Celsius로 저장하지만 검증이 포함된 메서드를 통해 제어된 접근을 제공하는 struct를 만들게 됩니다.
코드를 두 파일로 구성합니다:
temperature.go: 내보내지 않는celsiusfield(float64)를 포함하는Temperaturestruct를 Create합니다. 다음 메서드를 Implement합니다:Celsius()- current 온도를 Celsius로 반환하는 getterSetCelsius(value float64)- absolute zero(-273.15) 이상인 값만 accepts하는 setter입니다. 값이 이 기준보다 낮으면 온도는 변경되지 않은 상태로 유지되어야 합니다.Fahrenheit()- 다음 Formula를 사용하여 온도를 Fahrenheit로 converted합니다:(celsius * 9/5) + 32SetFahrenheit(value float64)- input을 Fahrenheit에서 Celsius로 converts하여 저장하지만, resulting Celsius value가 -273.15 이상인 경우에만 저장합니다.
NewTemperature(celsius float64) *Temperature를 추가합니다(constructor의 input은 valid하다고 가정합니다).main.go: input에서 온도 값을 Read하고 getter/setter 메서드를 보여 줍니다. 온도를 Create하고, 두 단위로 해당 값을 Print한 다음, 새 값을 설정하고 resulting 값을 보여 줍니다.
다음 input이 제공됩니다:
- 1번째 줄: initial Celsius value
- 2번째 줄: 설정할 new Celsius value
- 3번째 줄: 설정할 new Fahrenheit value
모든 온도 output을 소수점 둘째 자리까지 format합니다. 다음 순서로 Print합니다:
- 생성 후:
C: [celsius] F: [fahrenheit] - Celsius 설정 후:
C: [celsius] F: [fahrenheit] - Fahrenheit 설정 후:
C: [celsius] F: [fahrenheit]
예를 들어 25, -300, 212가 given되면 output은 다음과 같아야 합니다:
C: 25.00 F: 77.00
C: 25.00 F: 77.00
C: 100.00 F: 212.00두 번째 줄에서 -300이 absolute zero보다 낮기 때문에 setter가 이를 거부하여 변경되지 않은 값이 표시된다는 점에 유의하세요. 세 번째 줄에는 212°F를 성공적으로 설정한 후의 온도가 표시됩니다(이는 100°C로 converts됩니다). 이것이 setter의 강력한 기능입니다. setter는 데이터를 valid하게 유지하는 규칙을 적용합니다.
직접 해보기
package main
import (
"fmt"
)
func main() {
// 입력 값 읽기
var initialCelsius float64
var newCelsius float64
var newFahrenheit float64
fmt.Scanln(&initialCelsius)
fmt.Scanln(&newCelsius)
fmt.Scanln(&newFahrenheit)
// TODO: 생성자를 사용하여 새 Temperature 생성
// TODO: 초기 값을 "C: [celsius] F: [fahrenheit]" 형식으로 소수점 2자리까지 출력
// TODO: 새로운 Celsius 값 설정을 시도하고 결과 출력
// TODO: 새로운 Fahrenheit 값 설정을 시도하고 결과 출력
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
8에러 처리와 OOP
error 인터페이스사용자 정의 에러 타입에러 래핑 (fmt.Errorf)센티넬 에러errors.Is()와 errors.As()Panic, Defer, Recover요약 - 파일 파서직접 연습해 보세요: 온라인 Go 컴파일러