Golang에서의 상속 이해
Olivia Novak
Dev Intern · Leapcell

Key Takeaways
- Golang은 전통적인 상속을 지원하지 않지만 코드 재사용을 위해 struct embedding을 사용합니다.
- 메서드 오버라이딩은 포함된 struct에서 동일한 이름의 메서드를 정의하여 구현할 수 있습니다.
- 인터페이스는 다형성을 가능하게 하여 다른 유형이 공통된 동작을 공유할 수 있도록 합니다.
상속은 객체 지향 프로그래밍(OOP)의 기본 개념으로, 한 클래스가 다른 클래스의 속성과 동작을 획득할 수 있도록 합니다. 그러나 Golang(Go)은 Java나 C++과 같은 언어에서 볼 수 있는 전통적인 클래스 기반 상속을 지원하지 않습니다. 대신 Go는 구성(composition) 및 **인터페이스 임베딩(interface embedding)**을 사용하여 유사한 기능을 구현합니다.
상속 대신 구성
Go에서 struct 임베딩은 상속과 유사한 동작을 구현하는 주요 메커니즘입니다. Go는 클래스 기반 계층 구조를 사용하는 대신, struct가 다른 struct를 포함하여 해당 필드와 메서드를 재사용할 수 있는 구성을 권장합니다.
Struct 임베딩 예제
package main import "fmt" // 기본 struct type Person struct { Name string Age int } // Person 메서드 func (p Person) Greet() { fmt.Printf("Hello, my name is %s.\n", p.Name) } // Person을 임베딩하는 Employee struct type Employee struct { Person Position string } func main() { emp := Employee{ Person: Person{Name: "Alice", Age: 30}, Position: "Engineer", } // 임베딩된 struct의 필드에 직접 액세스 fmt.Println(emp.Name) // Alice fmt.Println(emp.Age) // 30 fmt.Println(emp.Position) // Engineer // 임베딩된 struct에서 메서드 호출 emp.Greet() // Hello, my name is Alice. }
여기서 Employee
는 Person
을 임베딩하여 명시적인 하위 클래스 없이 해당 필드와 메서드를 상속할 수 있습니다. Person
의 Greet()
메서드는 임베딩으로 인해 Employee
에서 액세스할 수 있습니다.
임베딩된 Struct에서 메서드 오버라이딩
Go에는 명시적인 메서드 오버라이딩이 없지만, 임베딩 struct에서 동일한 이름의 메서드를 정의하여 유사한 효과를 얻을 수 있습니다. 이 경우 임베딩 struct의 메서드가 우선합니다.
package main import "fmt" type Person struct { Name string } func (p Person) Greet() { fmt.Println("Hello from Person") } type Employee struct { Person } // Greet 메서드 오버라이딩 func (e Employee) Greet() { fmt.Println("Hello from Employee") } func main() { emp := Employee{Person: Person{Name: "Bob"}} emp.Greet() // Hello from Employee }
이 경우 Employee
는 자체 Greet()
메서드를 정의하며, 이는 Employee
인스턴스에서 호출될 때 Person
의 메서드를 오버라이드합니다.
다형성을 위한 인터페이스 사용
Go는 인터페이스를 통해 다형성을 지원합니다. 인터페이스를 정의하고 이를 다른 struct에서 구현함으로써 상속과 유사한 동작을 구현할 수 있습니다.
package main import "fmt" type Greeter interface { Greet() } type Person struct { Name string } func (p Person) Greet() { fmt.Printf("Hello, I am %s.\n", p.Name) } type Robot struct { Model string } func (r Robot) Greet() { fmt.Printf("Beep boop, I am %s.\n", r.Model) } func SayHello(g Greeter) { g.Greet() } func main() { p := Person{Name: "Alice"} r := Robot{Model: "X100"} SayHello(p) // Hello, I am Alice. SayHello(r) // Beep boop, I am X100. }
여기서 Person
과 Robot
은 모두 Greet()
메서드를 정의하여 Greeter
인터페이스를 구현합니다. SayHello
함수는 Greeter
를 구현하는 모든 유형과 함께 작동하여 Go의 다형성 구현 방식을 보여줍니다.
결론
Go는 클래식 상속을 지원하지 않지만, 코드 재사용 및 다형성을 촉진하기 위한 struct 임베딩 및 인터페이스와 같은 강력한 메커니즘을 제공합니다. 상속보다 구성을 선호함으로써 Go는 프로그램 구조에서 더 나은 유지 관리성 및 유연성을 보장합니다.
FAQs
아니요, Golang은 전통적인 상속 대신 struct 임베딩 및 인터페이스에 의존합니다.
포함하는 struct에서 동일한 이름의 메서드를 정의하면 우선적으로 적용됩니다.
인터페이스는 다형성을 가능하게 하여 서로 다른 유형이 직접적인 상속 없이 동일한 동작을 구현할 수 있도록 합니다.
Go 프로젝트 호스팅을 위한 최고의 선택, Leapcell입니다.
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하세요.
무료로 무제한 프로젝트 배포
- 사용량에 대해서만 지불하고 요청이나 요금은 없습니다.
뛰어난 비용 효율성
- 유휴 요금 없이 사용한 만큼만 지불하세요.
- 예: $25로 평균 응답 시간 60ms에서 694만 건의 요청을 지원합니다.
간소화된 개발자 경험
- 간편한 설정을 위한 직관적인 UI.
- 완전 자동화된 CI/CD 파이프라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장성 및 고성능
- 고도의 동시성을 쉽게 처리할 수 있도록 자동 확장됩니다.
- 운영 오버헤드가 전혀 없으므로 빌드에만 집중하세요.
Documentation에서 자세히 알아보세요!
X에서 저희를 팔로우하세요: @LeapcellHQ