Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.
인터페이스(Interface)
- 구체화된 객체(Concrete objecr)가 아닌 추상화된 상호작용으로 관계를 표현
✓ 인터페이스 선언
1) type을 씀
2) 인터페이스명을 씀
3) 인터페이스 키워드를 씀
4) { } 블록 안에 인터페이스에 포함된 메서드 집합을 씀
type DuckInterface interface {
Fly()
Walk(distance int) int
}
- 인터페이스도 구조체처럼 타입 중 하나이기 때문에 type을 써야 함.
= 변수 선언이 가능하고 변수의 값으로 사용할 수 있음.
✓ 메서드 집합을 쓸 때 주의할 점
- 메서드는 반드시 메서드명이 있어야 함.(빈칸 지시자(_) 사용 불가)
- 매개변수와 반환이 다르더라도 이름이 같은 메서드는 사용할 수 없음.
- 인터페이스에서는 메서드 구현을 포함하지 않음.
type Sample interface {
String() string
String(int) string // 에러: String 메서드명이 겹침
_(x int) // 에러: 메서드는 반드시 이름이 있어야 함.
}
package main
import "fmt"
type Stringer interface // Stringer 인터페이스 선언
String() string
}
type Student struct {
Name string
Age int
}
func (s Student) String() string { // Student의 String() 메서드
return fmt.Sprintf("안녕! 나는 %d살 %s라고 해", s.Age, s.Name) // 문자열 만들기
}
func main() {
student := Student{"철수", 12} // Student 타입
var stringer Stringer // Stringer 타입
stringer = student // Stringer 값으로 student 대입
fmt.Printf("%s\n", stringer.String()) // stringer의 String() 메서드 호출
}
// 결과
안녕! 나는 12살 철수라고 해
- Stringer 인터페이스 선언, Stringer 인터페이스는 매개변수 없이 string 타입을 반환하는 String() 메서드를 포함.
- 매개변수 없이 string 타입을 반환하는 String() 메서드를 포함한 모든 타입은 Stringer 인터페이스로 사용될 수 있음.
- Student 타입은 String() 메서드를 포함, 따라서 Student 타입은 Stringer 인터페이스로 사용될 수 있음.
- Sprintf() 함수를 사용해서 문자열을 만듦. (서식에 따라 문자열을 만들어서 반환하는 함수)
- stringer 값으로 Student 타입 변수 student를 대입
= stringer는 Stringer 인터페이스이고, Student 타입은 String() 메서드를 포함하고 있기 때문에 stringer 값으로,
student를 대입할 수 있음.
- stringer 인터페이스가 가지고 있는 메서드 String()을 호출
= stringer 값으로 Student 타입 student를 가지고 있기 때문에 student의 메서드 String()이 호출됨
인터페이스를 왜 쓰는지?
- 객체지향 프로그래밍에서 아주 중요한 역할을 함.
- 인터페이스를 이용하면 구체화된 객체가 아닌 인터페이스만 가지고 메서드를 호출할 수 있기 때문에 큰 코드 수정 없이
필요에 따라 구체화된 객체를 바꿔서 사용할 수 있게 됨. = 프로그램 변경 요청에 유연하게 대처 가능
추상화 계층(Abstraction layer)
- 내부 동작을 감춰서 서비스를 제공하는 쪽과 사용하는 쪽 모두에게 자유를 주는 방식을 추상화라고 함.
- 인터페이스는 추상화를 제공하는 추상화 계층
- 구체화된 타입으로 상호작용하는 게 아니라 관계로 상호작용함.
= 그 관계를 정의한 추상화 계층이 바로 인터페이스!
ex)
은행 창구에서 통장을 만든다는 가정을 하면, 어떤 절차로 승인을 얻어 어떤 시스템을 사용해 통장이 나오는지 알 수도 알 필요도 없다.
고객은 통장만 잘 나오면 된다.
은행에서는 고객이 원하는 통장만 발급해주면 되니까 언제든지 자유롭게 내부 시스템의 절차를 간소화하거나 효율적으로 변경할 수 있다.
✓ 이렇게 추상화 계층을 이용해 의존 관계를 끊는 것을 디커플링(decoupling)이라고 하며, 의존성은 낮을수록 좋음.
덕 타이핑(Duck typing)
"만약 어떤 새를 봤는데 그 새가 오리처럼 걷고 오리처럼 날고 오리처럼 소리내면 나는 그 새를 오리라고 부르겠다."
→ 타입 선언 시 인터페이스 구현 여부를 명시적으로 나타낼 필요 없이 인터페이스에 정의한 메서드 포함 여부만으로 결정하는 방식
type Stringer interface {
String() string
}
- 위 예제에서 Stringer 인터페이스를 정의 함.
type Student struct {
...
}
func (s *Student) String() string {
...
}
- Stringer 인터페이스를 구현한다는 별다른 명시 없이 String() 메서드를 포함한 것만으로 Stringer 인터페이스로 사용될 수 있었음.
= 이런 방식을 덕 타이핑 방식이라고 함.
type Student struct implements Stringer{
...
}
- 덕 타이핑을 지원하지 않는 많은 다른 언어들은 위와 같이 인터페이스 구현 여부를 타입 서언 시 명시함. (ex. Java)
'Language > Golang' 카테고리의 다른 글
Golang (Go언어) 자료 구조(Data Structure) 1/2 (1) | 2024.12.02 |
---|---|
Golang (Go언어) 함수고급편 (1) | 2024.11.29 |
Golang (Go언어) 메서드(Method) (2) | 2024.11.27 |
Golang (Go언어) 슬라이스(Slice) 2/2 (2) | 2024.11.20 |
Golang (Go언어) 슬라이스(Slice) 1/2 (0) | 2024.11.19 |