구조체(struct)는 여러 개의 데이터를 묶어서 하나의 자료형으로 사용할 수 있는 기능을 제공합니다. 하지만 구조체 내부의 데이터에 접근하거나 수정하는 것은 자유롭기 때문에, 코드의 안정성과 유지보수성이 떨어질 수 있습니다. 이를 해결하기 위해 캡슐화(encapsulation)와 정보 은닉(data hiding) 개념을 구조체에 적용할 수 있습니다.
캡슐화 (Encapsulation)
캡슐화는 객체 내부의 데이터와 그 데이터를 다루는 메서드를 하나의 단위로 묶는 것을 의미합니다. 구조체에 캡슐화를 적용하기 위해서는 구조체의 멤버 변수를 private
으로 설정하고, 멤버 변수에 접근하는 메서드를 제공해야 합니다. 이렇게 하면 외부에서는 직접적으로 멤버 변수에 접근할 수 없고, 메서드를 통해서만 데이터를 조작할 수 있습니다. 이렇게 하면 데이터의 부적절한 조작을 막고, 구조체의 내부 구현을 숨길 수 있습니다.
type Person struct {
name string
age int
}
// name 멤버 변수의 값을 설정하는 메서드
func (p *Person) SetName(name string) {
p.name = name
}
// age 멤버 변수의 값을 설정하는 메서드
func (p *Person) SetAge(age int) {
if age >= 0 {
p.age = age
}
}
// name 멤버 변수의 값을 반환하는 메서드
func (p *Person) GetName() string {
return p.name
}
// age 멤버 변수의 값을 반환하는 메서드
func (p *Person) GetAge() int {
return p.age
}
func main() {
person := Person{}
person.SetName("John")
person.SetAge(25)
fmt.Println(person.GetName()) // John
fmt.Println(person.GetAge()) // 25
}
위의 예제에서는 Person 구조체의 멤버 변수인 name과 age를 private
으로 설정하고, SetName(), SetAge(), GetName(), GetAge() 메서드를 통해 외부에서 데이터를 설정하고 조회할 수 있게 하였습니다. 이렇게 하면 외부에서는 직접적으로 멤버 변수에 접근할 수 없고, 메서드를 통해서만 데이터에 접근할 수 있게 됩니다.
정보 은닉 (Data Hiding)
정보 은닉은 객체 내부의 데이터를 외부로부터 감추는 것을 의미합니다. 구조체의 캡슐화와 마찬가지로 멤버 변수를 private
으로 설정하여 직접적인 접근을 제한하고, 메서드를 통해서만 데이터에 접근할 수 있도록 합니다. 이렇게 함으로써 구조체 내부의 상태를 보호하고, 외부에서의 부적절한 조작을 막을 수 있습니다.
type BankAccount struct {
accountNumber string
balance int
}
// accountNumber 멤버 변수의 값을 반환하는 메서드
func (b *BankAccount) GetAccountNumber() string {
return b.accountNumber
}
// balance 멤버 변수의 값을 반환하는 메서드
func (b *BankAccount) GetBalance() int {
return b.balance
}
func main() {
account := BankAccount{
accountNumber: "1234567890",
balance: 1000000,
}
fmt.Println(account.GetAccountNumber()) // 1234567890
fmt.Println(account.GetBalance()) // 1000000
}
위의 예제에서는 BankAccount 구조체의 멤버 변수인 accountNumber와 balance를 private
으로 설정하고, GetAccountNumber(), GetBalance() 메서드를 통해서만 외부로 값을 반환합니다. 이를 통해 구조체 내부의 데이터를 감추고 외부에서 직접적인 조작을 막을 수 있습니다.
결론
구조체의 캡슐화와 정보 은닉은 코드의 안정성과 유지보수성을 높이기 위해 중요한 개념입니다. 캡슐화를 통해 구조체의 내부를 은닉하고 메서드를 통해서만 데이터에 접근하도록 하면, 부적절한 조작을 막을 수 있고 내부 구현을 숨길 수 있습니다. 정보 은닉은 구조체 내부의 데이터를 외부로부터 감추어 구조체의 상태를 보호하고 외부에서의 직접적인 조작을 제한할 수 있습니다.