한 눈에 끝내는 고랭 기초
    • 01
      시작하기에 앞서
    • 강의대상
      Go란?
      실습 환경 구축 - 구름IDE
      Hello goorm! 출력해보기
    • 02
      변수와 상수
    • 콘솔 출력 함수의 기본
      변수의 선언과 초기화
      상수의 선언과 초기화
      간단한 덧셈
      잘못된 신상정보
    • 03
      연산자
    • 연산자 종류
      연산자 우선순위
      콘솔 입력 함수의 기본
      간단한 덧셈과 곱셈
      몫과 나머지
    • 04
      자료형
    • 자료형의 종류와 특징
      문자열의 표현
      자료형의 변환
      강제 형 변환
    • 05
      콘솔 출력과 입력 함수
    • 콘솔 출력 함수(Print)
      콘솔 입력 함수(Scan)
      정돈된 표
      신상정보 입력과 출력
    • 06
      반복문 - for
    • 오로지 for
      구구단
      빛나는 이등변삼각형
    • 07
      조건문 - if/else
    • 조건에 따른 실행과 흐름 분기
      7과 9의 배수
      두 수의 차
    • 08
      분기문 - switch
    • swich문에 의한 선택적 실행
      안좋은 계산기
    • 09
      제어문
    • break, continue, goto문
      구구단2
      두 수를 더하면 99
    • 10
      컬렉션
    • 배열(Array)
      슬라이스(Slice)
      맵(Map)
      역행렬
      가장 긴 이름
      중간고사 평균 점수
    • 11
      함수
    • Go언어에서의 함수
      전역변수와 지역변수
      매개변수
      반환값(리턴값)
      익명 함수
      오름차순 정렬
      아이패드를 사주는 조건
      역학적 에너지
    • 12
      클로저
    • 외부 변수 접근 : 클로저
      동전 정리
    • 13
      구조체와 메소드
    • 구조체
      메소드
      성적 저장 프로그램
      역학적 에너지2
    • 14
      인터페이스(interface)
    • 메소드의 집합 인터페이스
      직육면체와 원기둥
    • 15
      defer와 panic()
    • 지연 처리 defer
      종료하는 panic(), 복구하는 recover()
      엘리베이터
      중간고사 평균 점수2
    • 16
      에러 처리
    • 에러 처리의 기본
      에러 출력 및 처리
      중간고사 평균 점수3
    • 17
      고루틴(Goroutine)
    • 비동기 프로세스의 기본
      고루틴의 활용
      고루틴 실습
    • 18
      채널(Channel)
    • 고루틴의 데이터 통로 : 채널
      비동기 채널과 버퍼
      동기 채널
      채널 닫기
      송신 전용, 수신 전용 채널
      채널 select문
      고루틴 실습2
      메시지 전송
      동기 채널 실습
      비동기 채널 실습
    • 19
      패키지(package)
    • 패키지의 개념
    • 20
      실전 프로젝트 - 마일리지 상점
    • 프로젝트를 시작하기 앞서
      실습모드에서 실습
      마일리지 상점의 주요 기능
      필수 구조체와 매인 메뉴
      잔여 수량, 잔여 포인트 구현
    • 21
      실전 프로젝트 - 주문하기, 장바구니 담기
    • 구매 구현(1)
      구매 구현(2)
      장바구니에 담기
      장바구니 확인(1)
      장바구니 확인(2)
    • 22
      실전 프로젝트 - 고루틴으로 배송하기
    • 배송 상태 확인(1)
      배송 상태 확인(2)
      배송 상태 확인(3)
      최종 코드
    메소드의 집합 인터페이스
    14 인터페이스(interface)
    메소드의 집합 인터페이스

    '구조체와 메소드' 챕터에서 구조체와 메소드가 프로그래밍을 할 때 없어서는 안되는 이유와 그들의 기능에 대해 배웠습니다. 이번 챕터에서 다룰 내용은 구조체, 메소드와 일맥상통하는 주제인 '인터페이스'입니다. 구조체는 같은 속성의 필드들의 집합체이고, 메소드는 함수중에서도 구조체의 속성을 기능적으로 수행하는 특별한 함수라고 했습니다. '메소드' 강의에서 삼각형의 넓이를 구하는 예시 코드로 공부했습니다. 인터페이스의 필요성을 흐름으로 알아보기 위해 이 예시를 다시 한 번 천천히 짚어보겠습니다.

    삼각형의 넓이를 구하기 위해 필요한 변수는 '너비'와 '높이'입니다. 그래서 다수의 삼각형 정보를 저장하기 위해 너비와 높이의 정보를 각각 따로 선언하는 것이 아니라 '삼각형의 정보'를 담는 구조체를 선언해 높이와 너비를 필드로 선언했습니다. 그리고 '삼각형의 넓이'를 연산하는 기능의 함수를 만들어야하는데 이는 삼각형의 정보 구조체를 이용한 기능만 수행하는 것이기 때문에 특정 구조체 전용 기능인 메소드로 따로 선언했습니다. 그래서 삼각형의 정보들인 구조체 객체를 이용해 넓이를 연산하는 메소드를 사용함으로써 완벽한 프로그램이라고 생각했습니다.

    그런데 프로그램을 확장하다 보면 삼각형의 넓이 뿐만이 아니라 둘레, 무게중심 기능이 추가될 수 있습니다. 더 나아가 원, 사각형과 같은 다양한 구조체들과 그에 따른 기능들이 추가되면 어떻게 될 것 같습니까? 어떤 객체에 어떤 메소드를 사용해야 하는지 굉장히 헷갈리게 될 것입니다. 따라서 변수를 묶은 구조체만 필요한 것이 아니라, 메소드를 모아놓은 '인터페이스'도 필요합니다.


    물론 인터페이스는 메소드들의 집합체로서 같은 속성의 기능을 하는 메소드들을 한눈에 보기 편하다는 점이 있습니다. 하지만 '단순히 명시만 하는 기능인가?'에 대한 부분에서 의문점이 생길 수 있습니다.

    예를 들어 구조체로 

    • '원'의 정보
    • '사각형'의 정보

    가 있고 이 구조체를 이용해 넓이를 구하는 메소드가 있다고 생각해봅시다. 기능은 같지만 두 구조체의 필드가 다르고 연산 방법도 다르기 때문에 메소드도 두 개를 선언해야합니다. 따라서 이름은 같지만 내용물이 다른 메소드를 만들어야합니다.


    우선 아래에 인터페이스를 사용하지 않고 두 객체의 넓이를 출력하는 예시 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!

    위 코드는 사각형의 너비와 높이 정보를 필드로 가지는 Rect와 원의 반지름 정보를 필드로 가지는 Circle 구조체가 있습니다. 그리고 두 구조체의 정보를 이용해 넓이를 구하는 기능을 하는 area 메소드가 두 개 있습니다. 두 개의 area 메소드는 공통적으로 넓이를 구하는 기능을 하지만 전달받는 구조체 객체와 그에 따른 연산 과정이 다르기 때문에 각각 따로 선언했습니다. 전달받는 구조체가 다르기 때문에 메소드의 이름이 동일하게 선언되어도 괜찮습니다. 그리고 r1c1에 각각 사각형과 원의 구조체를 선언 및 초기화하고 area 메소드를 실행하고 출력합니다.

    만약 많은 수의 객체의 넓이를 출력하려면 어떻게 해야하나요? 전달하는 객체의 형(구조체)이 다르기 때문에 같은 기능의 메소드지만 매개변수를 다르게 설정해줘야합니다. 그래서 같은 속성의 기능을 묶어놓은 인터페이스를 활용하면 인터페이스에 있는 메소드들을 호출할 수 있습니다.


    인터페이스를 활용해 위 예시를 수정해보겠습니다. 아래 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!

    위 코드에서 인터페이스는 매개변수로 선언이 되어 따로 선언하지 않았습니다. 매개변수로 인터페이스를 사용한다는 것은 구조체에 관계없이 인터페이스에 포함된 메소드를 사용하겠다는 뜻입니다. 


    좀 더 복잡해진 아래 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!

    빈 인터페이스(Empty Interface)


    함수부터 인터페이스까지 숨 가쁘게 다양한 용법에 대해 배웠습니다. 그래서 지금쯤 한 가지 간과하는 부분이 있을 수 있습니다. 바로 형(Type)에 관한 것입니다. 함수와 구조체는 형으로 쓸 수 있습니다. 이것에 관한 내용은 '익명 함수' 강의에서 '일급 함수'에 대해 배울 때 알았습니다. 결국 구조체도 형을 사용자 정의로 사용하는 것이고 함수도 특별한 것이 아니라 형으로 사용할 수 있다고 했습니다. 인터페이스도 마찬가지입니다. 빈 인터페이스에 대해 알아보기 위해 몇 가지 특징을 알아보겠습니다.

    • 인터페이스는 내용을 따로 선언하지 않아도 형으로서 사용할 수 있습니다.
    • 인터페이스는 하나의 형이기 때문에 매개변수로 사용될 수 있습니다.
    • 인터페이스는 어떠한 타입도 담을 수 있는 컨테이너입니다. 즉 'Dynamic type'입니다.

    예를 들어 어떤 변수에 순서대로 string형을 저장해 출력하고 int형을 저장해 출력한다고 생각해봅시다. 형이 다르기 때문에 다른 매개변수형을 가지는 함수를 만들고, 형이 달라짐에 따라 변수도 새롭게 초기화해야 합니다. 하지만 빈 인터페이스 형을 쓰면 어떠한 형도 담을 수 있어 편하게 사용할 수 있습니다.


    아래에 빈 인터페이스를 활용한 간단한 예시 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!

    위 예시에서는 간단한 코드의 형태로 사용해봤지만 앞으로 Go언어를 접하면 빈 인터페이스를 많이 볼 수 있을 것입니다. 이는 다양한 형을 담기 위한 Dynamic type이라는 것을 잘 알아두기 바랍니다.


    Type Assertion


    Assertion은 '주장'이라는 뜻입니다. 인터페이스형으로 선언된 변수는 초기화하는 값에 따라 형이 자동 명시되지만 사실 위에서 언급했다시피 Danamic type입니다. 따라서 확실한 형을 표현하기 위해서 'Type Assertion'을 할 필요가 있습니다. 인터페이스 형에서 형을 선언하기 위해서는 "변수이름.(형)"을 명시하면 됩니다. 주의해야할 점은 인터페이스 형으로 선언됐는데 nil 값인 경우 에러가 발생합니다.


    아래 간단한 코드를 바로 실행해보세요.

    go
    실행 결과를 확인해보세요!
    질문하기