본문 바로가기
프로그래밍/Golang

Golang Interface - OOP에서의 인터페이스 개념, 예시 및 장점

by slowin 2024. 7. 26.

객체 지향 프로그래밍에서의 인터페이스

객체 지향 프로그래밍(OOP)에서 인터페이스는 매우 중요한 개념입니다. 인터페이스는 클래스가 구현해야 할 메서드들의 집합을 정의합니다. 설계도와 같아서, 어떤 기능들이 있어야 하는지를 명시합니다.

인터페이스 사용 예시

예를 들어, '동물' 인터페이스가 있다고 가정해봅시다.

인터페이스 동물 {
    소리내기()
    움직이기()
}

강아지[동물] {
    소리내기() {
        출력("멍멍!")
    }
    움직이기() {
        출력("강아지가 뛰어갑니다.")
    }
}

고양이[동물] {
    소리내기() {
        출력("야옹~")
    }
    움직이기() {
        출력("고양이가 살금살금 걷습니다.")
    }
}

동물소리듣기(동물 animal) {
    animal.소리내기()
}

동물움직임보기(동물 animal) {
    animal.움직이기()
}
이 인터페이스를 구현하는 '강아지' 클래스와 '고양이' 클래스는 반드시 '소리내기'와 '움직이기' 메서드를 가져야 합니다.


동물_소리듣기()동물_움직임보기() 함수는 동물 인터페이스를 파라미터로 받습니다. 이 함수들은 어떤 동물 객체가 전달되든 상관없이 해당 동물의 소리내기()와 움직이기() 메서드를 호출할 수 있습니다.
이것이 바로 인터페이스의 다형성을 보여주는 예시입니다. 동일한 인터페이스를 구현한 서로 다른 클래스의 객체들을 같은 방식으로 다룰 수 있게 되는 것이죠.
중요한것은, `동물`이라는 객체 or 구조체가 `소리내기`, `움직이기`의 메서드를 가지고 있냐는것입니다. 인터페이스는 특정 기능을 수행하기 위해 객체가 반드시 구현해야 하는 메서드들의 집합을 정의합니다.

인터페이스의 장점

인터페이스의 장점 일관성, 유연성, 테스트용이성에 대해서 알아보겠습니다.

1. 일관성

  • 여러 객체가 같은 인터페이스를 구현하면, 이 객체들은 같은 방식으로 사용될 수 있습니다.

모든 동물 객체(강아지, 고양이, 오리)가 같은 '동물' 인터페이스를 구현하고 있어서, 이들을 동일한 방식으로 다룰 수 있습니다.

동물들 = [강아지, 고양이, 오리]
각 동물 in 동물들 {
    동물.소리내기()
    동물.움직이기()
}


이 코드는 각 동물의 구체적인 구현을 알 필요 없이 모든 동물에 대해 동작합니다.

2. 유연성

  • 인터페이스를 이용하면 코드의 변경 없이 새로운 기능을 쉽게 추가할 수 있습니다.

새로운 동물을 추가하고 싶다면, 기존 코드를 변경하지 않고도 '동물' 인터페이스를 구현하는 새 클래스를 만들면 됩니다.

말[동물] {
    소리내기() {
        출력("히히힝~")
    }
    움직이기() {
        출력("말이 빠르게 달립니다.")
    }
}


이렇게 '말' 클래스를 추가해도 기존의 코드는 전혀 변경할 필요가 없습니다.

3. 테스트 용이성

인터페이스를 사용하면 실제 객체 대신 가짜 객체(mock)를 사용해 테스트하기 쉬워집니다.
실제 동물 객체 대신 가짜 객체(mock)를 만들어 테스트할 수 있습니다.

가짜동물[동물] {
    소리내기() {
        출력("테스트용 소리")
    }
    움직이기() {
        출력("테스트용 움직임")
    }
}

테스트_동물_소리내기(동물객체) {
    동물객체.소리내기()
    // 여기서 출력된 결과를 확인
}

// 테스트 실행
테스트_동물_소리내기(가짜동물)

이렇게 하면 실제 동물 객체를 사용하지 않고도 인터페이스의 동작을 테스트할 수 있습니다.

주의점

인터페이스는 필요할 때만 사용해야 합니다. 과도한 추상화는 코드를 복잡하게 만들 수 있습니다.

정리

인터페이스는 객체 지향 프로그래밍에서 중요한 개념으로, 코드의 구조를 개선하고 유지보수를 쉽게 만듭니다. 각 프로그래밍 언어마다 인터페이스를 구현하는 방식은 조금씩 다르지만, 그 핵심 개념은 동일합니다. 인터페이스를 잘 활용하면 더 유연하고 확장 가능한 프로그램을 만들 수 있습니다.

관련

Golang Interface - 포인터와 값 타입의 개념 및 활용

Golang Interface - 소프트웨어 인터페이스란?

Golang Interface - OOP에서의 인터페이스 개념, 예시 및 장점

Golang Interface - 암시적 인터페이스: 코드 유연성과 재사용성

Golang Interface - 빈 인터페이스 (interface{})

Golang Interface 최적화: 인터페이스 불필요한 추상화 피하고 테스트 용이성 높이기