Language/Golang

Golang (Go언어) 인터페이스(Interface)

HeeWorld 2024. 11. 27. 21:30

Tucker의 Go 언어 프로그래밍 책과 유튜브를 통해 학습 중입니다.

Golang 마스 코트 Gopher(고퍼)

 

인터페이스(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)