메소드 정의 및 호출

Objective

After completing this lesson, you will be able to 메소드를 정의하고 호출합니다.

메소드 정의

클래스의 정의 부분에서는 METHODS 를 사용하여 인스턴스 메소드를 정의하고 CLASS-METHODS 를 사용하여 정적 메소드를 정의합니다. 메소드의 이름 뒤에 메소드의 서명이 옵니다. 즉, 메소드가 호출자와 교환하는 값 세트와 메소드 중에 발생할 수 있는 예외입니다.

메소드의 서명은 매개변수와 예외로 구성됩니다. 각 매개변수에는 이름과 유형이 있습니다.

ABAP에는 다음과 같은 종류의 매개변수가 있습니다.

임포트 매개변수

임포트 매개변수는 메소드에서 호출자로부터 수신하는 값입니다. 메소드에는 임포트 매개변수를 원하는 수만큼 지정할 수 있습니다.

기본적으로 임포트 매개변수는 필수이지만 다음 두 가지 방법으로 이를 선택사항으로 만들 수 있습니다.

  • OPTIONAL 추가 요소 사용. 매개변수가 선택사항이고 기본값은 매개변수 유형에 적합한 초기 값임
  • DEFAULT <val> 추가 요소 사용. 매개변수가 선택사항이고 기본값은 <val>로 지정한 값임

메소드 내에서 임포트 매개변수를 변경할 수 없습니다. 이를 시도할 경우 구문 오류가 발생합니다.

엑스포트 매개변수

엑스포트 매개변수는 메소드에서 리턴되는 결과입니다. 메소드에는 엑스포트 매개변수를 원하는 수만큼 지정할 수 있습니다. 모든 엑스포트 매개변수는 선택사항입니다. 호출 프로그램은 실제로 필요한 값만 사용합니다.

변경 매개변수

변경 매개변수는 메소드가 호출자로부터 수신하는 값입니다. 임포트 매개변수와 달리 메소드로 이러한 매개변수 값을 변경할 수 있습니다. 그런 다음 해당 값이 동일한 이름의 호출자에게 리턴됩니다. 메소드에는 변경 매개변수를 원하는 수만큼 지정할 수 있습니다. 변경 매개변수는 기본적으로 필수지만 임포트 매개변수와 같은 방법으로 이를 선택사항으로 만들 수 있습니다.

반환 매개변수

리턴 매개변수는 표현식에서 직접 사용할 수 있는 메소드 결과입니다. 메소드에는 하나의 리턴 매개변수만 포함될 수 있습니다. 반환 매개변수는 값별(pass-by-value)이라고 하는 특별한 형태의 매개변수 전달을 사용해야 합니다. 이 형태의 매개변수 전달은 괄호 안의 매개변수 이름을 둘러싸서 정의됩니다(공백 없음). 키워드 VALUE로 그 앞에 옵니다.

키워드 RAISING은 오류 상황을 나타내기 위해 메소드에서 발생할 수 있는 예외를 나열하는 데 사용됩니다. 그러면 호출 프로그램이 오류에 반응할 수 있습니다.

예를 들어, lcl_connection 클래스에 두 개의 메소드를 추가합니다.

특성 connection_idcarrier_id 값을 설정하는 set_attributes( ) 메소드와 이러한 특성의 값을 리턴하는 get_attributes( ) 메소드. set_attributes( ) 에는 각 특성에 대해 하나씩 두 개의 임포트 매개변수가 필요합니다. get_attributes( ) 메소드에는 두 개의 엑스포트 매개변수가 필요합니다.

정의하는 모든 메소드에 대해 클래스의 구현 부분에서 구현도 생성해야 합니다. 그러기 전까지는 클래스에 구문 오류가 표시됩니다. 구문 점검을 통해 메소드 구현이 누락되었음을 알 수 있습니다.

힌트

ADT는 누락된 구현을 추가할 수 있는 Quick Fix를 제공합니다. 이 Quick Fix를 사용하려면 다음과 같이 하십시오.
  1. 오류가 있는 METHODS 문에 커서를 놓고 Ctrl + 1 을 누릅니다.
  2. 가능한 Quick Fix의 리스트에서 Add implementation for … 를 선택하고 Enter를 누릅니다. 여러 메소드에 대한 구현이 누락된 경우 Quick Fix 제목은 추가 … 구현되지 않은 메소드라고 합니다.

메소드 정의 방법

메소드 구현

정의하는 모든 메소드를 구현해야 합니다. 이 작업은 클래스의 구현 부분에서 METHOD <method_name> 문과 ENDMETHOD 문 쌍을 추가하여 수행합니다.

메소드 구현에는 메소드의 매개변수에 액세스할 수 있는 ABAP 문(임포트 매개변수를 변경할 수 없음)과 클래스에서 선언한 모든 유형, 특성 및 상수가 표시와는 별개로 포함되어 있습니다. 인스턴스 메소드는 인스턴스 특성과 정적 특성에 모두 액세스할 수 있습니다. 정적 메소드는 정적 컴포넌트에만 액세스할 수 있습니다.

클래스의 구현 부분에서 참조 변수와 '->'(또는 클래스 이름 및 '=>', 정적 특성의 경우) 없이 해당 클래스의 특성에 액세스할 수 있습니다.

인스턴스 메소드 구현에서만 ABAP에서 기본 제공 변수 ME가 제공됩니다. ME는 참조 변수로, 현재 클래스로 유형이 지정되고 런타임 시 현재 인스턴스의 주소로 채워집니다. ME의 사용은 선택사항이며 특성의 이름이 다른 데이터 오브젝트(예: 매개변수 이름)와 충돌하지 않는 한 피해야 합니다.

이 예에서 set_attributes( ) 메소드의 임포트 매개변수는 해당 특성과 이름이 동일합니다. 이러한 상황에서 이름 기준 자체는 매개변수를 나타냅니다. me-> 앞에 me-> 를 넣기만 하면 현재 인스턴스의 특성에 액세스하는 것이 명확해집니다.

메소드를 실행하는 동안 오류가 발생하면 메소드에서 RAISE EXCEPTION TYPE 문 뒤에 예외 이름을 사용하여 예외를 트리거할 수 있습니다.

노트

기술적으로 예외 이름은 특수 ABAP 클래스의 이름이며, RAISE EXCEPTION TYPE 문은 참조되는 클래스의 인스턴스를 생성합니다. 이 인스턴스는 예외 오브젝트라고 하며 특수 종류의 ABAP 클래스를 예외 클래스라고 합니다.

예외가 발생하는 순간 메소드 실행이 종료됩니다.

모든 선행조건이 충족되면 컨트롤이 호출 프로그램으로 반환됩니다. 그렇지 않으면 런타임 오류로 인해 전체 프로그램이 종료됩니다.

프로그램을 계속하기 위한 선행조건은 다음과 같습니다.

  • 발생한 예외는 메소드 서명의 RAISING 절에서 선언됩니다.
  • 메소드 호출은 TRY … ENDTRY 제어 구조로 둘러싸여 있습니다.
  • TRY … ENDTRY 제어 구조에는 예외에 대한 CATCH 블록이 있습니다.

노트

일부 예외의 경우 ABAP 편집기에서 메소드의 RAISING 절에 아직 선언되지 않은 예외를 발생시킬 때 구문 경고가 Quick Fix와 함께 표시됩니다.

메소드 구현 방법

메소드 호출

참조 변수 및 인스턴스 컴포넌트 선택자(->)를 사용하여 인스턴스 메소드를 호출합니다. 컴포넌트 선택 뒤에는 호출할 메소드의 이름이 옵니다. 정적 메소드의 경우 클래스 이름과 정적 컴포넌트 선택자(=>)를 사용합니다. 두 경우 모두 매개변수 전달은 한 쌍의 괄호로 구성됩니다. 어떤 경우든 괄호가 필요합니다. 매개변수를 전달하지 않으면 빈 상태로 유지됩니다.

노트

메소드 이름과 여는 괄호 사이에는 공백이 허용되지 않습니다. 반면 여는 대괄호 뒤와 닫는 대괄호 앞에는 공백이 하나 이상 필요합니다.

임포트 매개변수는 호출된 메소드에서 임포트하는 값이 호출 프로그램에 의해 엑스포트되기 때문에 키워드 EXPORTING 뒤에 나열됩니다. 매개변수 이름은 등호(=)의 왼쪽에, 표현식은 오른쪽에 나열됩니다. 이 표현식은 리터럴, 상수 또는 변수처럼 단순할 수 있지만 표현식의 유형이 매개변수 유형과 일치하면 다른 표현식도 허용됩니다.

엑스포트 매개변수는 키워드 IMPORTING 뒤에 나열됩니다. 엑스포트 매개변수의 경우 매개변수 이름도 등호 왼쪽에 나열됩니다. 오른쪽의 변수는 매개변수와 동일한 유형이어야 합니다.

변경 매개변수는 키워드 CHANGING 뒤에 나열됩니다. 오른쪽의 변수 유형은 왼쪽에 있는 매개변수의 유형과 일치해야 합니다.

이 예에서는 인스턴스 메소드 set_attributes( )get_attributes( )의 호출을 보여줍니다. 매개변수 이름은 항상 등호(=)의 왼쪽에 있습니다.

힌트

ADT에서 코드 자동 완성을 사용하여 매개변수 전달을 포함하여 메소드 호출을 생성할 수 있습니다. 이렇게 하려면 다음과 같이 하십시오.

  1. 참조 변수(또는 클래스 이름)와 컴포넌트 선택을 입력합니다.
  2. 컴포넌트 선택을 입력한 후 Ctrl + Space 를 눌러 컴포넌트 리스트를 표시할 수 있습니다.
  3. 메소드를 선택하고 Shift + Enter 를 눌러 메소드의 이름과 전체 서명을 코드에 삽입합니다. 선택적 매개변수가 주석 라인에 나열됩니다.

메소드를 호출할 때 엑스포트 매개변수의 값을 수신하려면 항상 키워드 IMPORTING이 필요합니다. 그러나 임포트 매개변수만 제공하려는 경우 키워드 EXPORTING은 선택 사항이 됩니다.

필수 임포트 매개변수가 하나뿐인 메소드의 경우 명시적 매개변수 지정을 생략할 수도 있습니다. 이 예에서 매개변수 i_carrier_id는 선택사항이며 기본값은 'LH'입니다. 따라서 괄호 사이의 값은 나머지 필수 임포트 매개변수인 i_connection_id에 지정됩니다.

메소드 호출 방법

예외 처리

이 과정의 이전 섹션에서 TRY … ENDTRY 제어 구조를 사용하여 런타임 오류를 처리하는 방법을 학습했습니다.

메소드 정의의 RAISING 절에서 선언된 예외는 다음과 같은 방식으로 처리됩니다.

  • TRY … ENDTRY 제어 구조의 TRY 블록에 메소드 호출을 배치합니다.
  • 처리하려는 예외 이름을 사용하여 CATCH 블록을 정의합니다.

노트

메소드 호출에 실패한 경우 스킵하려는 코드가 있는 경우 이 코드를 TRY 블록 안에 메소드 호출 뒤에 배치할 수 있습니다.

사용해 보기: 메소드 호출 및 예외 처리

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    123456789101112131415161718192021222324252627282930
    CONSTANTS c_carrier_id TYPE /dmo/carrier_id VALUE 'LH'. CONSTANTS c_connection_id TYPE /dmo/connection_id VALUE '0400'. DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * Create Instance ********************************************************************** connection = NEW #( ). * Call Method and Handle Exception ********************************************************************** out->write( |i_carrier_id = '{ c_carrier_id }' | ). out->write( |i_connection_id = '{ c_connection_id }'| ). TRY. connection->set_attributes( EXPORTING i_carrier_id = c_carrier_id i_connection_id = c_connection_id ). APPEND connection TO connections. out->write( `Method call successful` ). CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY.
  3. 로컬 유형 탭으로 이동한 후 다음 코드 스니핏을 삽입합니다.
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334
    CLASS lcl_connection DEFINITION. PUBLIC SECTION. * Attributes DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /dmo/connection_id. * Methods METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id DEFAULT 'LH' i_Connection_id TYPE /dmo/connection_id RAISING cx_abap_invalid_value. ENDCLASS. CLASS lcl_connection IMPLEMENTATION. METHOD set_attributes. IF i_carrier_id IS INITIAL OR i_connection_id IS INITIAL. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDIF. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD. ENDCLASS.
  4. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱으로 실행합니다.
  5. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다. 특히 두 상수의 값을 변경하여 예외 발생을 디버그합니다.

함수 메소드

리턴 매개변수가 있는 메소드를 함수 메소드라고 합니다. 동일한 메소드에 대해 여러 개의 리턴 매개변수를 정의할 수 없습니다. 리턴 매개변수를 VALUE(<parameter_name>) 형식으로 정의해야 합니다. 함수 메소드에는 리턴 매개변수 외에 다른 매개변수의 조합도 포함될 수 있습니다. 하지만 임포트 매개변수만 추가하는 것이 가장 일반적입니다. 그 이유는 추가 엑스포트 또는 변경 매개변수를 사용하면 함수 메소드의 가장 큰 이점, 즉 다른 ABAP 표현식에서 함수 메소드의 결과를 직접 사용할 수 있다는 것입니다.

이 그림은 표현식에서 함수 메소드를 사용하는 방법의 두 가지 예를 보여 줍니다. 첫 번째는 변수에 리턴 매개변수가 직접 지정되는 간단한 예입니다. 두 번째 예는 함수 메소드의 호출이 다른 메소드의 입력으로 사용되는 방법을 보여줍니다. 시스템은 함수 메소드를 실행한 다음 리턴 매개변수의 값을 메소드 write( )의 입력으로 사용합니다.

사용해 보기: 함수 메소드

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536
    DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * Create Instance ********************************************************************** connection = NEW #( ). connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). APPEND connection TO connections. * Calling Functional Method ********************************************************************** " in a value assignment (with inline declaration for result) DATA(result) = connection->get_output( ). " in logical expression IF connection->get_output( ) IS NOT INITIAL. " as operand in a statement LOOP AT connection->get_output( ) INTO DATA(line). ENDLOOP. " to supply input parameter of another method out->write( data = connection->get_output( ) name = ` ` ). ENDIF.
  3. 로컬 유형 탭으로 이동한 후 다음 코드 스니핏을 삽입합니다.
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243
    CLASS lcl_connection DEFINITION. PUBLIC SECTION. * Attributes DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /dmo/connection_id. * Methods METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id DEFAULT 'LH' i_Connection_id TYPE /dmo/connection_id. " Functional Method METHODS get_output RETURNING VALUE(r_output) TYPE string_table. * PROTECTED SECTION. * PRIVATE SECTION. ENDCLASS. CLASS lcl_connection IMPLEMENTATION. METHOD set_attributes. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD. METHOD get_output. APPEND |------------------------------| TO r_output. APPEND |Carrier: { carrier_id }| TO r_output. APPEND |Connection: { connection_id }| TO r_output. ENDMETHOD. ENDCLASS.
  4. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱으로 실행합니다.
  5. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다. 특히 함수 메소드 get_output( ). 의 여러 호출을 디버그합니다.

메소드 정의 및 호출

이번 연습문제에서는 로컬 클래스 lcl_connection에서 메소드를 정의하고 구현합니다. 그런 다음 전역 클래스의 main( ) 메소드에서 이 메소드를 호출합니다.

템플릿:

  • /LRN/CL_S4D400_CLS_INSTANCES(전역 클래스)

솔루션:

  • /LRN/CL_S4D400_CLS_METHODS(전역 클래스)

태스크 1: 템플릿 복사(선택사항)

템플릿 클래스를 복사합니다. 이전 연습문제를 완료한 경우 이 태스크를 건너뛰고 클래스 ZCL_##_LOCAL_CLASS 또는 클래스 ZCL_##_INSTANCES 를 계속 편집할 수 있습니다.

단계

  1. ABAP 편집기에서 전역 클래스 /LRN/CL_S4D400_CLS_INSTANCES 의 소스 코드를 엽니다.

    1. Eclipse 툴바에서 Open ABAP Development Object 를 선택합니다. 또는 Ctrl + Shift + A 를 눌러도 됩니다.

    2. 검색 문자열로 /LRN/CL_S4D400_CLS 를 입력합니다.

    3. 개발 오브젝트 리스트에서 /LRN/CL_S4D400_CLS_INSTANCES 를 선택하고 확인 을 선택합니다.

  2. 프로젝트 탐색기 뷰를 편집기와 연결합니다.

    1. 프로젝트 탐색기 툴바에서 편집기가 있는 링크 버튼을 찾습니다. 아직 누르지 않은 경우 선택합니다. 따라서 편집기에서 열려 있는 개발 오브젝트가 프로젝트 탐색기에서 강조표시되어야 합니다.

  3. /LRN/CL_S4D400_CLS_INSTANCES 클래스를 패키지에 포함된 클래스에 복사합니다(제안 이름: ZCL_##_METHODS, ##은 그룹 번호).

    1. 프로젝트 탐색기 뷰에서 클래스 /LRN/CL_S4D400_CLS_INSTANCES 를 마우스 오른쪽 버튼으로 클릭하여 컨텐트 메뉴를 엽니다.

    2. 단축 메뉴에서 Duplicate .... 를 선택합니다.

    3. 패키지 필드에 패키지 이름을 입력합니다. 이름 필드에 이름 ZCL_##_METHODS 를 입력합니다. 여기서 ##은 그룹 번호입니다.

    4. 내역을 조정하고 다음 을 선택합니다.

    5. 전송 요청을 확인하고 Finish를 선택합니다.

태스크 2: 방법 정의

로컬 클래스 lcl_connection 에서 인스턴스 메소드 get_outputset_attributes 를 정의합니다.

단계

  1. 로컬 클래스 lcl_connection 의 정의로 이동합니다.

    1. 전역 클래스에서 로컬 유형 을 선택합니다.

  2. 클래스의 public 섹션에 get_output 메소드를 추가합니다. 글로벌 테이블 유형 STRING_TABLE의 리턴 매개변수 r_output 한 개가 있어야 합니다.

    노트

    리턴 매개변수의 이름은 VALUE( )으로 둘러싸야 합니다.
    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      1234567891011121314
      PUBLIC SECTION. DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /DMO/Connection_id. CLASS-DATA conn_counter TYPE i. METHODS get_output returning value(r_output) type string_table. PROTECTED SECTION.

      노트

      지금은 "GET_OUTPUT" 메소드에 대한 구현 누락 구문 오류를 무시하십시오.
  3. 클래스의 public 섹션에 set_attributes 메소드를 추가합니다. 클래스의 각 인스턴스 특성에 대해 하나의 임포트 매개변수가 있어야 합니다. 특성을 입력할 때 사용한 매개 변수에도 동일한 유형을 사용합니다. 매개변수와 특성을 구분하려면 매개변수 이름에 접두부 i_ 를 추가합니다. 또한 메소드에서 예외 CX_ABAP_INVALID_VALUE가 발생해야 합니다.

    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      123456789101112131415161718192021
      PUBLIC SECTION. DATA carrier_id TYPE /dmo/carrier_id. DATA connection_id TYPE /DMO/Connection_id. CLASS-DATA conn_counter TYPE i. METHODS set_attributes IMPORTING i_carrier_id TYPE /dmo/carrier_id i_connection_id TYPE /dmo/connection_id RAISING cx_abap_invalid_value. METHODS get_output returning value(r_output) type string_table. PROTECTED SECTION.

      노트

      지금은 "SET_ATTRIBUTES" 메소드에 대한 구현 누락 구문 오류를 무시하십시오.

태스크 3: 메소드 구현

단계

  1. Quick Fix를 사용하여 클래스에 메소드 구현을 추가합니다.

    1. 편집기에서 메소드 중 하나의 이름에 커서를 놓고 Ctrl + 1 을 누릅니다.

    2. 제안 추가 2개의 구현되지 않은 메소드 를 더블 클릭합니다.

  2. get_output 메소드를 구현합니다. 리턴 매개변수 r_output 에 문자열 템플릿을 추가합니다. 문자열 템플릿에서 임베드된 표현식을 사용하여 특성 carrier_idconnection_id 의 값을 추가합니다.

    1. 로컬 클래스에서 ENDMETHOD. 문과 METHOD get_output. 사이에 다음 코드를 추가합니다.

      Code Snippet
      12345
      APPEND |------------------------------| TO r_output. APPEND |Carrier: { carrier_id }| TO r_output. APPEND |Connection: { connection_id }| TO r_output.
  3. set_attributes 메소드를 구현합니다. 두 임포트 매개변수 중 하나가 비어 있으면(IS INITIAL) CX_ABAP_INVALID_VALUE 예외를 발생시킵니다. 그렇지 않으면 두 개의 인스턴스 특성에 임포트 매개변수 값을 입력합니다.

    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      123456789101112
      METHOD set_attributes. IF i_carrier_id IS INITIAL OR i_connection_id IS INITIAL. RAISE EXCEPTION TYPE cx_abap_invalid_value. ENDIF. carrier_id = i_carrier_id. connection_id = i_connection_id. ENDMETHOD.
  4. 클래스를 활성화합니다.

    1. Ctrl + F3 을 선택하여 클래스를 활성화합니다.

태스크 4: 함수 메소드 호출

전역 클래스의 주요 메소드에서 함수 메소드 get_output 을 호출합니다.

단계

  1. 전역 클래스에서 if_oo_adt_classrun~main 메소드의 구현으로 전환합니다.

    1. 전역 클래스에서 전역 클래스 를 선택하고 if_oo_adt_classrun~main 메소드의 구현까지 아래로 스크롤합니다.

  2. 메소드 끝에서 참조 변수 연결을 작업 영역으로 사용하여 내부 테이블 연결에 루프를 추가합니다.

    1. ENDMETHOD. 앞에 다음 코드를 추가합니다.

      Code Snippet
      12345
      LOOP AT connections INTO connection. ENDLOOP.
  3. 루프에서 각 인스턴스에 대해 함수 메소드 get_output 을 차례로 호출하고 결과를 콘솔에 기록합니다.

    힌트

    메소드 get_output 의 호출을 out->write( ) 의 입력으로 직접 사용할 수 있습니다.
    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      1234567
      LOOP AT connections INTO connection. out->write( connection->get_output( ) ). ENDLOOP.
  4. 클래스를 활성화합니다. 콘솔 앱으로 실행하고 콘솔 출력을 분석합니다.

    1. Ctrl + F3 을 눌러 클래스를 활성화합니다.

    2. F9 를 눌러 클래스를 실행합니다.

    3. 콘솔 윈도우에서 출력을 분석합니다.

태스크 5: 코드 완료 사용 및 예외 처리

코드 자동 완성을 사용하여 set_attributes 메소드를 호출하고 메소드에서 발생하는 예외를 처리합니다.

단계

  1. lcl_connection 클래스의 첫 번째 인스턴스에서 특성 carrier_idconnection_id 에 대한 직접 액세스를 인스턴스 메소드 set_attributes( ) 의 호출로 바꿉니다. 코드 자동 완성을 사용하여 메소드의 전체 서명을 삽입합니다.

    힌트

    컴포넌트 선택(->)을 입력한 후 Ctrl + Space 를 눌러 사용 가능한 특성 및 메소드 리스트를 표시합니다. 메소드를 선택한 다음 Shift + Enter를 눌러 메소드의 전체 서명을 삽입합니다.
    1. 첫 번째 connection = NEW #( ). 다음 라인에 커서를 놓습니다.

    2. connection-> 을 입력하고 Ctrl + Space 를 누릅니다.

    3. set_attributes 를 선택하고 Shift + Enter 를 누릅니다.

    4. 임포트 매개변수에 값을 전달합니다. 이 인스턴스의 특성을 설정하는 데 이전에 사용했던 것과 동일한 리터럴을 사용합니다.

    5. 이 인스턴스의 인스턴스 특성에 대한 직접 액세스를 제거하거나 주석을 작성합니다.

  2. 예외를 처리합니다. TRY.ENDTRY.을 사용하여 메소드 호출을 둘러싸고 있습니다. CX_ABAP_INVALID_VALUE 예외를 처리하기 위해 CATCH-블록을 추가합니다. 메소드 호출에 성공한 경우에만 신규 인스턴스가 내부 테이블 연결에 추가되어야 합니다.

    1. 생성된 코드 라인 CATCH cx_abap_invalid_value. 의 주석 처리를 해제합니다.

    2. 메소드 호출 앞에 TRY. 를 추가합니다.

    3. ENDTRY. 을 CATCH 문 뒤에 추가합니다.

    4. CATCH 문과 ENDTRY 문 사이에 add out->write( `Method call failed` ).

    5. APPEND 문을 메소드 호출과 CATCH 문 사이를 위로 이동합니다.

    6. 전체 메소드 호출이 다음과 같아야 합니다.

      Code Snippet
      1234567891011121314151617
      TRY. connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). * connection->carrier_id = 'LH'. * connection->connection_id = '0400'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY.
  3. lcl_connection 클래스의 다른 두 인스턴스에 대해 이전 단계를 반복합니다.

    1. 이 단계가 끝나면 if_oo_adt_classrun~main 메소드의 구현이 다음과 유사하게 표시되어야 합니다.

      Code Snippet
      12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
      METHOD if_oo_adt_classrun~main. DATA connection TYPE REF TO lcl_connection. DATA connections TYPE TABLE OF REF TO lcl_connection. * First Instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'LH' i_connection_id = '0400' ). * connection->carrier_id = 'LH'. * connection->connection_id = '0400'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Second instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'AA' i_connection_id = '0017' ). * connection->carrier_id = 'AA'. * connection->connection_id = '0017'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Third instance ********************************************************************** connection = NEW #( ). TRY. connection->set_attributes( EXPORTING i_carrier_id = 'SQ' i_connection_id = '0001' ). * connection->carrier_id = 'SQ'. * connection->connection_id = '0001'. APPEND connection TO connections. CATCH cx_abap_invalid_value. out->write( `Method call failed` ). ENDTRY. * Output ********************************************************************** LOOP AT connections INTO connection. out->write( connection->get_output( ) ). ENDLOOP. ENDMETHOD.
  4. 클래스를 활성화합니다. 이를 실행하고 메소드 호출을 디버그합니다.

    1. Ctrl + F3 을 눌러 클래스를 활성화합니다.

    2. F9 를 눌러 클래스를 실행합니다.