[go] 구조체(struct)의 캡슐화 및 정보 은닉 개념

구조체(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() 메서드를 통해서만 외부로 값을 반환합니다. 이를 통해 구조체 내부의 데이터를 감추고 외부에서 직접적인 조작을 막을 수 있습니다.

결론

구조체의 캡슐화와 정보 은닉은 코드의 안정성과 유지보수성을 높이기 위해 중요한 개념입니다. 캡슐화를 통해 구조체의 내부를 은닉하고 메서드를 통해서만 데이터에 접근하도록 하면, 부적절한 조작을 막을 수 있고 내부 구현을 숨길 수 있습니다. 정보 은닉은 구조체 내부의 데이터를 외부로부터 감추어 구조체의 상태를 보호하고 외부에서의 직접적인 조작을 제한할 수 있습니다.