위치로 진입 점

마지막 업데이트: 2022년 2월 26일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
main()은 함수의 구조를 하고 있습니다. 보통 함수라고 불리는 용어는 클래스의 멤버가 되는 경우 메서드(Method) 혹은 특정 클래스의 멤버 메서드라고 부를 수 있습니다.

create-react-app 진입 점 또는 index.js 위치 변경 / 추가

간단한 웹 앱을 만들기 위해 create-react-app을 사용하려고합니다. 페이지와 구성 요소를 pages 및 레이블이 지정된 src 아래의 별도 디렉토리로 옮겼습니다 components . index.js의 진입 점을 src / index.js에서 src / pages / index.js로 변경 / 추가하고 싶습니다. 또 다른 옵션은 index.js를 src /에 유지하고 페이지 및 구성 요소 디렉토리에서 가져 오는 것입니다. 누군가가 진입 점 경로를 변경할 수있는 방법을 찾도록 도와 줄 수 있습니까?

기본 html-webpack-plugin 구성 파일의 위치를 ​​찾을 수없는 것 같습니다.

1 answers

이것은에 필요한 정확한 변경 사항입니다 [email protected] . 실행 한 후 npm run eject , 두 개의 새로운 폴더 즉 config 및 scripts 프로젝트 홈 디렉토리에 추가됩니다.
: 항목 업데이트 appIndexJs: resolveModule(resolveApp, 'src/index') 에를 appIndexJs: resolveModule(resolveApp, 'src/pages/index') . 그런 다음 평소와 같이 프로젝트를 빌드 / 실행할 수 있습니다.

Related questions

  • 11 Webpack에서 jQuery 플러그인 종속성 관리
  • 6 Webpack을 사용하는 vue.js 프로젝트에서 at ( '@') 로그인 경로를 사용하여 ES6 가져 오기
  • 17 create-react-app은 src 디렉토리 외부에서 제한을 가져옵니다.
  • 1 div 클래스에 속하는 특정 텍스트를 얻는 방법
  • 3 배열에 동일한 요소가 2 개 이상 있는지 확인하는 방법은 무엇입니까? [복제]
  • 1 Google 앱 시각화로 가능합니까? 확대 / 축소 옵션이있는 타임 라인
  • 2 Stringify 및 Regex 교체로 JSON 형식 (JavaScript)에 도움이 필요합니다.
  • 1 서로 다른 경로에 대해 서로 다른 템플릿을 사용하여 라우터에 반응 v. 5
  • 2 Netlify에서 react-router-dom을 사용하여 내 반응 앱을 무료로 호스팅 할 수 있습니까?
  • 2 Firebase가 데이터로드 (vue)를 완료 할 때까지 기다림 / 'await'가 작동하지 않음
  • 3 jquery .each ()를 사용하여 개별 이벤트 리스너를 추가하는 방법은 무엇입니까?
  • 1 div의 줄 수를 세고 첫 번째 몇 줄의 textContent를 얻는 방법이 있습니까?-Javascript [duplicate]
  • 1 Google Apps Script의 첨부 파일
  • 1 연속적인 공백을 피하기 위해이 정규식이 필요합니다. [중복]
  • 2 노드 그룹 주위에 원 그리기
  • 1 오류 : 입력을 확인할 때 오류가 발생했습니다. density_Dense1_input에 3 차원이 있어야합니다. 하지만 1,9 모양의 배열이 있습니다.
  • 2 IE11에서 정규식 컴파일 기능 테스트
  • 2 sweetalert 2의 동일한 행에서 라벨을 정렬하고 드롭 다운을 선택합니다. [닫힘]
  • 1 방법이 함수가 아닙니다 몽구스 방법 문제
  • 1 경로를 다시 추가 한 후 D3 클릭 이벤트가 작동하지 않습니다.

MORE COOL STUFF

케이트 블란쳇, 3일 만에 남편과 잤고 25년 만에 여전히 결혼

케이트 블란쳇, 3일 만에 남편과 잤고 25년 만에 여전히 결혼

케이트 블란쳇은 남편을 만났을 때 전형적인 데이트 조언을 무시했습니다.

마이클 쉰이 비영리 배우인 이유

마이클 쉰이 비영리 배우인 이유

Michael Sheen은 비영리 배우이지만 정확히 무엇을 의미합니까?

Hallmark Star Colin Egglesfield는 RomaDrama Live에서 스릴 넘치는 팬과의 만남을 제공합니다! [독점적인]

Hallmark Star Colin Egglesfield는 RomaDrama Live에서 스릴 넘치는 팬과의 만남을 제공합니다! [독점적인]

Hallmark 스타 Colin Egglesfield는 RomaDrama Live에서 스릴 넘치는 팬 만남에 대해 설명했습니다! 그리고 대회에서의 그의 INSPIRE 프로그램.

'북부 노출'을 온라인으로 스트리밍할 수 없는 이유

'북부 노출'을 온라인으로 스트리밍할 수 없는 이유

Northern Exposure가 90년대의 가장 인기 있는 쇼 중 하나가 된 이유를 알아보려면 Blu-ray 또는 DVD 플레이어의 먼지를 털어내야 합니다.

신장 결석은 고통스럽지만 통증의 원인은 놀랍습니다.위치로 진입 점

신장 결석이 있으면 등을 찔린 것처럼 느낄 수 있습니다. 그러나 그것이 타는 듯한 고통을 일으키는 돌인가 아니면 다른 무엇인가?

깨끗한 물을 유지하기 위해 머리카락을 기부하세요

미용실에서 깎은 머리카락과 개인 기부금은 유출된 기름을 흡수하고 환경을 보호하는 매트로 용도를 변경할 수 있습니다.

백악관에서 가장 기억에 남는 결혼식 살펴보기

지난 200여 년 동안 백악관에서 결혼한 사람은 극소수에 불과합니다. 그들은 누구이며 결혼식을 성사시키기 위해 필요한 것은 무엇입니까?

흰색, 빨간색 또는 분홍색 중 가장 달콤한 자몽은 무엇입니까?

과즙이 많은 자몽을 먹을 생각만 하면 입이 떡벌어지나요? 자몽에는 몸에 필요한 비타민과 항산화제가 풍부하기 때문에 주무르세요.

제 70 회 프라임 타임 에미 상 후보작은 다음과 같습니다.

제 70 회 프라임 타임 에미 상 후보작은 다음과 같습니다.

Academy of Television Arts & Sciences는 오늘 아침 제 70 회 Primetime Emmy Awards 후보를 발표했으며, 스트리밍 플랫폼 (하나 이상의 스트리밍 플랫폼)의 지속적인 상승을 반영하는 다양한 경쟁 분야에 9,100 개의 제출물을 조각했습니다. 어제의 업계 리더들이 디지털 라이벌처럼되도록 장려되는 TV 환경의 변화 Samira Wiley와 Ryan Eggold는 로스 앤젤레스의 Wolf Theatre에서 후보자를 발표했으며 Wiley는 그녀가 Outstanding 후보로 지명되었다는 말을 받았습니다. The Handmaid 's Tale 두 번째 시즌에 출연 한 드라마 시리즈의 게스트 여배우.

뿌리의 일부가 된 후 1 년에 10 번의 개인적인 반성

뿌리의 일부가 된 후 1 년에 10 번의 개인적인 반성

아주 똑똑한 Brothas의 데이먼 영과 파나마 잭슨 1 년에 얼마나 큰 차이가 있습니다. 불과 1 년 전, Damon과 저는 The Root의 일부가되는 과정을 완료하기 위해 최종 서명에 서명했습니다.

안전하지 않은 시즌 3이 돌아옵니다 : 로렌스는 어디에 있습니까?

안전하지 않은 시즌 3이 돌아옵니다 : 로렌스는 어디에 있습니까?

공동 제작자 / 총괄 프로듀서 / 작가 / 배우 Issa Rae (L)와 배우 Yvonne Orji가 2018 년 5 월 31 일 캘리포니아 로스 앤젤레스에서 열린 텔레비전 아카데미의 Insecure FYC 무대에서 연설합니다. 불안전함이 돌아옵니다! 하지만 로렌스가 사라 졌나요? 일요일에 HBO는 매우 인기있는 (적어도 우리에게는) 쇼의 시즌 3 예고편을 공개했습니다.

Cardi B는 전 매니저를 상대로 그녀와 오프셋 사이에 끼어들려고 했다고 비난했습니다.

Cardi B는 전 매니저를 상대로 그녀와 오프셋 사이에 끼어들려고 했다고 비난했습니다.

지난 4월, Cardi B의 전 매니저 Klenord "Shaft" Raphael이 그녀를 상대로 1천만 달러의 소송을 제기했다는 뉴스가 나왔습니다. 그에게 샤프트를 있는 그대로 제공함으로써 그의 노력. Bartier Cardi는 현물로 대응했으며 Shaft를 상대로 반소를 제기했습니다.

Christina Hall은 그녀의 세 자녀와 남편 Josh Hall과 함께 7월 4일을 축하합니다: 'My Loves'

Christina Hall은 그녀의 세 자녀와 남편 Josh Hall과 함께 7월 4일을 축하합니다: 'My Loves'

Christina Hall은 전 Tarek El Moussa와 아들 Brayden(6세), 딸 Taylor(11세), 그리고 전 Ant Anstead와 아들 Hudson(2세)을 두고 있습니다.

Azealia Banks, 마이크 던지고 마이애미 프라이드 공연에서 폭풍 : '여기에 서게 되어 정말 기쁘지 않습니다'

Azealia Banks, 마이크 던지고 마이애미 프라이드 공연에서 폭풍 : '여기에 서게 되어 정말 기쁘지 않습니다'

"Wynwood Pride는 너무 빈민가였습니다. 나는 튕겨야 했습니다." Azealia Banks는 그녀가 공연 도중 무대 밖으로 돌진한 후 트위터에 썼습니다.

그리스 2의 캐스트: 그들은 지금 어디에 있습니까?

그리스 2의 캐스트: 그들은 지금 어디에 있습니까?

개봉 40년이 지난 지금, 그리스 2의 출연진을 만나보세요.

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

받는 위치로 진입 점 것의 가치

A Go Brain Teaser

받는 것의 가치

다음 프로그램이 무엇을 인쇄할 것이라고 생각합니까? 기다리다! 뭐? 좌표는 fmt.Stringer 인터페이스를 구현합니다.

다채로운 언어

영어는 어딜가나 똑같지 않다.

다채로운 언어

영어가 모든 곳에서 동일하지 않다는 첫 번째 확인은 이 이야기의 제목에서 이미 분명합니다. 나는 단어를 "colorful"로 철자법을 배웠지만 우리의 철자 검사기는 (분명히 심각한 미국 영향 하에) 그것이 "colorful"이어야 한다고 주장했습니다.

Visual Studio 코드에 C 언어 설치(Windows 11)

Visual Studio 코드에 C 언어 설치(Windows 11)

이 글은 영어와 태국어 2개 국어로 구성되어 있습니다.(이 글은 영어와 태국어 2개 국어로 구성되어 있습니다.) Visual Studio 코드에 C 언어를 설치해 보겠습니다.

2022년 초보자 작가를 위한 경쟁이 낮은 프리랜서 웹사이트 10곳

경쟁이 적은 웹사이트는 프리랜서 작문 경력을 시작하는 데 좋습니다.

2022년 초보자 작가를 위한 경쟁이 낮은 프리랜서 웹사이트 10곳

최고의 프리랜서 작가들은 Fiver, Upwork, Freelancer.com과 같은 유명한 프리랜서 사이트를 피하라고 조언합니다.

위치로 진입 점

- 리눅스는 실행파일의 형식으로 ELF(Executable and Linkable Format)를 규정하고 있다.

- readelf -h [파일명]으로 확인할 수 있다.

- ELF 헤더 중 진입점(Entry Point, EP) 필드를 통해 시작 주소를 확인할 수 있다. 아래 예시에서는 0X400400임을 알 수 있다.

- start 명령어로 프로그램 진입점의 주소를 확인해볼 수 있다.

2. GDB 분석

(1) 시작과 종료

• 시작 : gdb [프로그램명][core 파일명][PID]

• 종료 : q or ctrl + d


(2) 소스보기 ( list or l )

• list : main 함수 기점으로 소스 출력

• list 10 : 10행을 기준으로 출력

• list func : func함수의 소스를 출력 (c++ 의 위치로 진입 점 클래스 멤버의 경우 클래스 이름도 입력 해야 함)

• list - : 출력된 행의 이전행을 출력

• list file.c:func : file의 func 함수 부분을 출력

• file.c:10 : file의 10행을 기준으로 출력

(3) 브레이크 포인트 ( break or b )

• break func : func 함수의 시작부분에 브레이크 포인트 설정

• break 10 : 10행에 브레이크포인트 설정

• break file.c:func : file.c 파일에 func함수에 브레이크 포인트 설정

• break file.c:10 : file.c 파일에 10행에 브레이크 포인트 설정

• break +2 : 현재 행에서 2개 행 이후 브레이크 포인트 설정

• break -2 : 현재 행에서 2개 행 이전 지점에 브레이크 포인트 설정

• break *0x8049000 : 특정 주소에 브레이크 포인트 설정

• break 10 if var ==0 : 10행에 브레이크포인트를 설정하는데 var 값이 0일 때 작동

• tb : break 와 같으나 1회용 브레이크 포인트임. 문법은 b 와 같음

• info break : 현재 브레이크 포인트 보기

• cl : 브레이크 포인트 지우기 ( 옵션은 b와 유사하다 )

• d : 모든 브레이크 포인트 지우기

• run (r) : 프로그램 수행 ( ndk 환경에서는 지원되지 않는다. )

- run 명령어 사용 시 인자값을 주려면 $()와 함께 파이썬 코드를 입력하면 전달 위치로 진입 점 가능

- 다음과 같은 코드를 컴파일 했다고 가정.

- 첫번째 인자값 설정 후 입력값도 설정

• kill (k) : 프로그램 수행 종료

• step (s): 현재 행 수행 후 정지, 함수 호출시 함수 안으로 들어감

• s 5 : step 다섯번 수행과 동일

• next (n) : 현재 행 수행 후 정지, 함수 호출시 함수 수행 다음 행으로 감

• n 5 : next 다섯번 수행과 동일

• continue (c) : 다음 브레이크 포인트까지 진행

• finish : 현재 함수를 수행하고 빠져 나감

• return : 현재 함수를 수행하지 않고 빠져 나감

• return 123 : 위와 같으나 리턴값을 지정함

• si : 어셈블리 명령어 단위의 수행 ( 진행은 step 과 같음 )

• ni : 어셈블리 명령어 단위의 수행 ( 진행은 next 와 같음 )

(4) 와치 포인트 ( watch )

• watch 변수명 : 특정변수에 와치 포인트를 설정하고, 특정변수가 바뀔 때마다 브레이크가 걸리면서 이전/현재값을 출력한다.


(5) 변수출력 관련

• info locals : 현재 스택의 로컬변수모두 출력

• info variables : 전역변수 모두 출력 ( 스크롤 압박주의! )

• p [변수명] : 해당변수 value 출력 ( 포인터변수 입력시 주소값출력, *포인터변수명시 실제 value출력 )

• p $[레지스터명] : 레지스터 값출력 ( p $eax )

• p *[포인터]@[숫자] : struct/class 의 배열일 때 배열의 크기를 알림 ( p *[email protected] )

• p ‘[파일명]’::[변수명] : 변수명 중복시 특정 파일의 전역변수 출력

• p [함수명]::[변수명] : 변수명 중복 시 특정 함수의 static 변수명 출력 ( 변수명이 중복될 때 기본으로 local 변수가 출력 )

• p /[출력형식][변수명] : 출력형식에 맞추어 변수값 출력
- t : 2진수
- o : 8진수
- d : 부호없는 10진수
- u : 부호없는 10진수
- x : 16진수
- c : 최초 1바이트 값을 문자형으로 출력
- f : 부동소수점
- a : 가장가까운 심볼의 오프셋을 출력

- p (캐스팅)[변수명] : 변수를 캐스팅하여 출력 ( p (char *)ptr )

- p 위치로 진입 점 위치로 진입 점 [포인터변수or배열]+[숫자] : 특정 주소 + 숫자 위치 출력 ( p (array[1]+4) )
- p [변수명] = [value] : 특정 변수의 값을 설정

• info registers : 레지스터 전체 출력

• info all-registers : MMX 포함 레지스터 전체출력

• info registers : 레지스터 전체 출력

• info all-registers : MMX 포함 레지스터 전체출력


• display [변수명] : 매번 p 치기 귀찮으니 특정변수 진행 중 계속 출력 ( p 와 동일한 방식으로 출력형식 지정가능 )
- disable display [번호] : 일시적으로 디스플레이 중단
- enable display [번호] : 중단했던 번호 다시 출력
- undisplay [번호] : 출력하던 display 변수 제거

(6) 스택 상태 검사

• info f [프레임 번호] : 스택 프레임 내용 출력

• info args : 함수 호출시 인자를 출력

• info locals : 함수의 지역변수를 출력

• info catch : 함수의 예외 핸들러를 출력

• bt : 전체 스택 프레임 출력 ( 콜스택 )

• frame [스택번호] : 스택번호의 스택 프레임으로 이동

• up : 상위 스택프레임으로 이동

• up [숫자] : 숫자만큼 상위 스택프레임으로 이동

• down : 하위 스택프레임으로 이동

• down [숫자] : 숫자만큼 하위 스택프레임으로 이동

(7) 메모리상태 검사

• x/[범위][출력형식][범위의단위] [메모리주소나 함수명]
• 범위 : 기본 4byte 단위
• 출력 형식
- t : 2진수
- o : 8진수
- d : 부호없는 10진수
- u : 부호없는 10진수
- x : 16진수
- c : 최초 1바이트 값을 문자형으로 출력
- f : 부동소수점
- a : 가장가까운 심볼의 오프셋을 출력
- s : 문자열로 출력
- i : 어셈블리 형식으로 출력

• 범위의 단위
- b : 1 byte 단위
- h : 2 byte 단위
- w : 4 byte 단위
- g : 8 byte 단위

• Example
- x/10i main : main 함수로 부터 40byte 를 어셈블리로 출력
- x/10 main : main 함수로 부터 40byte를 출력
- x/10b 0x8048200 : 주소로 부터 10byte를 출력

(8) 기타

• directory [경로] : 소스파일을 탐색하기 위해 경로에 directory 를 추가

• objectdir [경로] : 오브젝트 경로 등록

• disas [함수명] : 특정함수의 어셈블리 코드를 출력

• disas [주소] [주소] : 주소사이의 어셈블리 코드를 출력

• call [함수명(인자)] : 특정 함수를 인자값으로 호출함

• jump *[주소] : 주소로 강제적으로 분기

• jump [행번호] : 특정 행으로 강제 분기

• jump [ 함수명] : 특정 함수로 강제 분기

• info signals : signal 종류 출력

• signal [시그널명] : 디버깅중인 프로세스에 시그널 전달 ( signal SIGKILL )

• set [주소] = [값] : 특정 메모리에 값을 지정 ( set 0x8048300 = 100 )

• info 탭키 : info 로 확인 가능한 명령어 출력

• 환경 설정
- info set : 설정 가능한 내용 출력
- set prompt euclid : 프롬프트른 euclid 로 변경

www.devkuma.com

함수(function)란 "기능"을 뜻한다. 즉, 기능을 구현하는 부분을 따로 떼어 구현하는 것으로, 구조화 프로그램의 중요한 개념이라 하겠다. 여기서는 함수 작성법 및 호출 방법에 대해서 설명하겠다.

반복되는 처리는 함수로서 부품화할 수 있다.

특정 처리를 함수에 정리한다

지금까지 프로그램은 main() 함수에 작성해 왔다. 처음에 설명했듯이 main() 함수는 프로그램이 실행될 때에 최초에 호출되는 애플리케이션 진입점을 나타내는 특수한 함수이다. 우리는 필요한 경우 main() 이외의 함수를 만들 수 있다. 지금까지는 표준 함수로 정해져 있는 printf()와 scanf() 등의 함수를 사용하여 왔는데, 이러한 일부 기능을 정리한 함수를 직접 만들 수 있는 것이다.

프로그램에서 여러번 사용되는 처리 함수로 정리하여, 동일한 코드를 여러번 작성하는 번거로움에서 해방되어 프로그램 전체에 정합성을 갖게 할 수 있다. 이는 응용 프로그램의 설계에 있어서 매우 중요한 것이다. 처음에 약간 설명했지만, 함수를 정의하려면 다음과 같이 설명한다.

함수의 정의

기본적인 작성법은 main() 함수와 동일하다. 함수명은 변수와 동일하게 C 언어의 명명 규칙을 따르고 있으면 자유롭게 지정할 수 있다. 함수의 기능을 나타내어 위치로 진입 점 알기 쉽게 의미있는 이름으로하는 것이 바람직하다. 반환 값과 매개 변수 목록은 "파라미터와 반환 값"에서 자세히 설명하겠지만, 이것들을 이용하면 함수간에 데이터를 교환할 수 있다. 이 장에서는 우선 함수는 다음과 같이 정의한다.

이 함수는 값을 받지 않고 값을 돌려주지 않는 것을 나타낸다. 반환 값의 자료형으로 지정하는 void는 함수가 값을 반환하지 않는 것을 의미한다. 값을 반환하지 않는 함수는 return 키워드 값을 반환할 수 없다. 함수를 호출할 때는 printf()와 같은 표준 함수처럼 호출할 수 있다.

한번 만든 함수는 여러번 호출할 수 있기 때문에, 프로그램의 재사용이 가능하다. 다음의 위치로 진입 점 프로그램은 새로운 함수 Function()를 정의하고 main() 함수에서 이것을 호출하여 사용하고 있다.

Function() 함수는 printf() 함수를 호출하여 화면에 문자를 표시하는 간단한 처리를 수행한다. main() 함수에서 Function() 함수를 두번 호출한다. 그 결과, 화면에는 "Kitty on your lap"이라는 문자가 두 줄에 걸쳐 표시된다. 그러나 함수는 사용되는 함수보다 먼저 기술해야 합니다. 코드1을 보고 알 수 있듯이, Function() 함수는 이를 호출하는 main() 함수보다 이전에 정의되어 있다.

왜 함수가 사용되기 이전의 위치로 지정해야 하냐면, 함수를 발견하기 전에 함수를 호출하면 컴파일러는 기본적으로 int 형의 반환 값을 가진 인수를 받지 않는 함수로 인식한다. 따라서 기본 형식이 아닌 함수를 정의보다 이전에 호출하고, 형의 불일치로 컴파일 에러가 되어 발생한다.

예를 들어, 다음 프로그램은 Function1()는 문제없이 호출할 수 있지만 Function2()는 오류이다.

Function1()는 반환 값이 int 형으로 매개 변수가 없는 함수이므로 정의가 호출보다 뒤에 있어도 호출과 같은 형태이므로 문제없이 호출할 수 있지만, Function2()는 반환 값이 void 형이므로 그 이전 호출과 형태가 다르다. 컴파일러는 함수를 다시 선언으로 간주하고, 형태가 다르기 때문에 오류를 발생시키는 것이다.

코드1의 흐름을 따르면, 먼저 main() 함수가 실행되고 Function() 함수가 호출된다. 함수가 호출되면 프로그램은 그 함수에 제어를 이동시킨다. 코드1의 경우 Function() 함수의 본체에 제어가 이동하게 된다. Function() 함수의 처리가 완료되면, 프로그램은 함수를 호출한 원래 위치에 제어를 리턴한다. 이 경우는 main() 함수로 돌아 오게 된다.

그림1 - 함수의 호출과 복귀

함수를 호출하면 함수의 처리가 완료되면 제어가 함수를 호출한 원래의 위치로 돌아오기 때문에 프로그램의 흐름은 결국 main() 함수로 돌아간다.

void 형의 반환 값을 갖는 함수는 값을 돌려 줄 필요가 없기 때문에 return 문을 생략할 수 있다. main() 함수는 int 형의 종료 코드를 시스템에 반환해야 하므로 return 문을 사용하여 값을 반환하지만 Function() 함수는 return 문을 사용하지 않는다. 그러나 다음과 같이 명시적으로 return 문을 사용하여 함수를 종료 할 수 있다. 그러나 값은 반환시키지 않기 때문에 식을 지정할 수는 없다.

특정 위치에서 함수를 끝내고 싶다면, return 문을 사용하여 제어를 반환할 수 있다.

함수는 몇겹씩 호출할 수 있습니다.main()함수가 Function1()함수를 호출하는, Function1()함수가 Function2()함수를 호출하는……라는 듯 함수에서 다른 함수를 몇겹으로 불러냈다고 해도 함수는 자신을 불러낸 장소에 제어를 되돌리는 성질이 있으므로 반드시 최고 수준의 제어, 즉 main()함수로 돌아갑니다.

함수는 몇번이나 겹쳐서 호출할 수 있다. main() 함수가 Function1() 함수를 호출하고, Function1() 함수가 Function2() 함수를 호출 . 등등 함수에서 다른 함수를 여러번 호출해도 함수는 자신을 호출한 곳으로 제어를 되돌리는 성질이 있으므로 반드시 최상위 제어, 즉 main() 함수로 복귀한다.

코드2는 Function1() 함수에서 Function2() 함수를 호출한다. 이 프로그램은 제어의 흐름을 시각적으로 확인할 수 있도록 하기 위해, 각 함수는 자신의 함수명과 처리를 화면에 표시한다.

프로그램은 먼저 main() 함수에서 Function1() 함수를 호출하여 Function1() 함수는 Function2() 함수를 호출한다. Function2() 함수는 즉시 제어를 반환하기 때문에 Function1() 함수에 제어가 돌아간다. 그리고 Function1() 함수를 종료하고, 마지막으로 main() 함수에 복귀하고 있는 것을 확인할 수 있다. 표시된 결과를 보면 프로그램이 어떤 순서로 실행되고 있는지 이해할 수 있다.

[연재] 코틀린 프로그래밍 - IntelliJ IDEA 프로젝트 구성하기

Note:이 연재는 'Do it! Kotlin Programming'에서 일부의 내용을 연재하고 있습니다. 완전한 내용은 책을 참고해 주세요!

코틀린 프로젝트 시작하기

Hello Kotlin! 프로젝트 만들기

설정을 마치면 다음과 같은 화면이 나타납니다. 이제 프로젝트를 만들 준비가 된 것이죠. 그러면 본격적으로 첫 번째 프로젝트를 만들어 볼까요? 앞으로 실습을 진행하면서 여러 번 프로젝트를 생성하기 때문에 이 내용을 잘 익혀둡니다.

Tip:[Import Project]는 다른 개발 도구의 프로젝트를 IntelliJ IDEA용으로 가져오는데 사용하고, [Open]은 현재 작업공간의 프로젝트를 여는 데 사용합니다. [Check out from Version Control]은 버전 관리 저장소로부터 소스를 가져올 수 있습니다. IntelliJ IDEA는 자주 업데이트 되므로 [Configure]를 통해 업데이트 내용을 반영하거나 기타 설정을 할 수 있습니다.


코틀린 프로젝트 만들기

1. Welcome to IntelliJ IDEA 화면에서 [Create New Project]를 눌러 새 프로젝트를 만들겠습니다. [Create New Project]를 누르면 다시 새로운 프로젝트 설정 화면이 나타납니다. 가장 먼저 해야 할 일은 왼쪽의 [Kotlin]를 선택하고 오른쪽의 [Kotlin/JVM]을 선택한 다음 [Next] 버튼을 누릅니다.

Note: 쾌적한 코딩을 위해 글꼴 설정은 기본!

본격적인 코딩을 시작하기 전에 가독성이 높은 코드의 글꼴과 크기를 변경해 보겠습니다. 프로그래밍을 할때는 한 글자만 틀려도 작동하지 않기 때문에 숫자 0과 영문 O를 구분하거나 1과 소문자 l을 구분하는 것이 중요합니다. 이것을 명확히 구분해주는 글꼴을 사용해 봅시다.
설정을 위해 [Ctrl + Alt + S]를 누르거나 [File → Settings]를 눌러 설정 화면을 열어볼까요? 설정 화면에서 왼쪽 상단의 검색 상자에서 font를 입력하면 왼쪽 메뉴에 [Editor > Font] 메뉴로 이동합니다.

최근 언어의 소스 코드에서 사용하는 여러가지 심볼인 powerline 심볼을 추가했으며 ligature 문자를 지원하여 특수 문자의 구분도 명확하게 할 수 있어 매우 편리합니다. 예를 들어 람다의 화살표식(->)이 심볼로 들어 있습니다. 마우스 휠로 글꼴 크기를 조정하면 매우 편리하겠죠. [General]을 누른 다음 Change font size (Zoom) with Ctrl + Mouse Wheel 체크 박스를 선택합니다. 그러면 [Ctrl] 키와 마우스 휠로 글자 크기를 마음대로 확대, 축소할 수 있습니다.

첫 프로그램의 코딩

편집기 화면에 main을 입력하고 [Tab] 키를 누르면 자동으로 메인 함수가 만들어집니다. 이를 자동 템플릿 완성 기능이라고 부릅니다. 앞으로 자주 사용하게 될 기능이니 꼭 익숙해 지길 바랍니다.

혹은 다음과 같이 main() 함수의 위치로 진입 점 매개변수를 사용하지 않는 경우 생략할 수도 있습니다.

다음과 같이 메인 함수에 출력문을 작성해 봅시다.

안녕 코틀린! HelloKotlin.kt

코드를 입력했으니 이제 실행을 해야겠죠? 상단의 메뉴 [Run → Run…]을 찾아 눌러 실행합니다. 윈도우에서 Ctrl + Shift + F10 키를 눌러 프로그램을 실행할 수도 있습니다. 이후Debug 선택 화면에 실행 설정이 나타나면서 녹색 삼각형 버튼을 누르고 실행할 수도 있습니다.
▶ 더 간편한 방법으로 화면 상단에 보이는 [▶] 버튼을 눌러도 됩니다.

Tip:각 실행창의 단축키 이용

편집 화면의 각 창은 단축키를 가지고 있습니다. 왼쪽 제일 하단부의 아이콘을 클릭하면 각 창의 단축키를 볼 수 있습니다. 예를 들어 프로젝트(Project) 창은 윈도우에서는 Alt + 1, 맥에서는 Cmd + 1로 이동할 수 있습니다. 각 도구 창의 단축키는 다음과 같습니다.

  • Messages Alt + 0 (Cmd + 0)
  • Project Alt + 1 (Cmd + 1)
  • Favorites Alt + 2 (Cmd + 2)
  • Run Alt + 4 (Cmd + 4)
  • Debug Alt + 5 (Cmd + 5)
  • TODO Alt + 6 (Cmd + 6)
  • Structure Alt + 7 (Cmd + 7)
  • Terminal Alt + F12 (Option + F12)

단축키를 잘 활용해 손쉽게 각 편잡 창을 이동할 수 있도록 합니다. 특히, 자주 실행하여 결과를 볼 것이기 때문에 실행 창인 Alt+4 단축키는 외워 두는게 좋을 것 같습니다. 이 책에서는 주로 윈도우 운영체제의 단축키를 기준으로 설명합니다.

Hello Kotlin의 분석

Hello Kotlin 코드는 간단하면서도 많은 내용을 가지고 있습니다. 앞으로 많은 장을 걸쳐 공부하게 될 내용도 가지고 있죠. 하지만 '먼저 맞는 매가 덜 아프다'는 속담이 있듯이 개념을 잘 몰라도 먼저 간단히 읽어봅니다. 이번 장에서는 전부 이해하려고 노력하지 않아도 됩니다. 추후에 다시 나오게 된다면 아하! 하며 좀 더 쉽게 이해하게 될 것입니다.

코틀린의 main()은 최상위 함수로 실행 진입점이다

코틀린에서 main() 함수는 실행 진입점입니다. 자바와 같은 객체 지향 언어에서는 프로그램을 실행하려면 최소한 하나의 클래스와 그 안에 실행할 수 있는 main() 함수가 있어야 합니다. 하지만 코틀린은 선언된 클래스가 없는데도 불구하고 main() 메서드 하나로 println() 함수를 통해 콘솔에 문자열 "Hello Kotlin"을 출력 하고 있습니다. 어떻게 이런 일이 가능할까요?

main()은 함수의 구조를 하고 있습니다. 보통 함수라고 불리는 용어는 클래스의 멤버가 되는 경우 메서드(Method) 혹은 특정 클래스의 멤버 메서드라고 부를 수 있습니다.

실제로 코틀린 코드는 JVM상에서 실행하기 위해서main 메서드는 파일명을 기준으로 자동으로 클래스가 생성됩니다. 만들어진 파일은 IntelliJ IDEA의 메뉴에 [Tools → Kotlin → Show Kotlin Bytecode]를 누른 후 생성된 화면에서 [Decompile]을 사용해서 어떤 형태로 소스가 해석 되었는지를 확인해 볼 수 있습니다.

생성된 소스에서 main() 메서드를 보면 HelloKotlinKt 클래스 안에 속한 멤버 메서드로 선언되어 있는 것을 알 수 있습니다. 이것은 자바 가상 머신인 JVM에 실행되기 위해, 문자열은 String var1 으로 선언되어 System.out.println() 에 의해 콘솔 장치에 출력 되는 것이죠.

변환된 자바의 main()메서드의 의미

main 메서드는 많은 개념을 내포하고 있는데요. 코드를 정의된 main()함수를 다시 한번 살펴 봅시다.

public 은 가시성 지시자로 이 메서드의 접근 방법을 가리키고 있습니다. public 은 클래스인 HelloKotlinKt 외부 어디서는 접근 할 수 있다는 의미를 가지고 있습니다. 두번째 키워드로 static 은 이 메서드가 정적 메서드임을 나타내고 있습니다. static 으로 선언하면 프로그램의 정적 메모리 영역에 객체가 만들어지기 때문에 객체의 생성 없이 호출해 사용할 수 있게 됩니다. final 은 최종 메서드임을 나타내고 void 는 반환 할 것이 없는 경우 지정합니다.

Note:동적 메모리 영역

프로그램이 사용하는 메모리 영역에는 여러가지가 있습니다. 명령어가 들어가 있는 코드 영역과 프로그램이 컴파일 되면 문자열이나 정적 변수나 문자열 등이 들어간 정적 메모리 영역인 데이터(Data)가 있습니다. JVM에서는 이 영역을 메서드 정적 영역(위치로 진입 점 Method Static Area)으로도 부르고 있습니다. 또 실행 중 생성되는 객체의 경우에는 동적 메모리 영역인 힙(Heap)이라고 불리는 곳에 만들어 집니다.
추가적으로 코드 블록인 중괄호(<>) 안에 사용된 변수나 함수 호출 블록들은 임시로 쓰이는 메모리 영역인 스택(Stack)에 들어가며, 중괄호 블록이 끝나면 임시로 사용된 변수는 스택에서 제거가 됩니다.

먼저 실행을 위해 [Shift + Alt + F10]을 누르면 main을 가진 실행 클래스들이 다음과 같이 나열 됩니다.

여기서 ArrayIndexOutOfBoundsException 예외가 발생했습니다. 명령행으로부터 아무런 인자가 설정되어 있지 않기 때문이죠. 그러면 인자를 설정해 봅시다.
IntelliJ IDEA에서 직접 인자를 전달해 실행하고자 한다면 [Run] 메뉴에 [Edit Configurations]를 사용해 Program arguments에 필요한 명령행 인자를 나열할 수 있습니다.

명령행으로부터 받은 인자는 각각 args[0], args[1], args[2] 에 문자열 형태로 저장됩니다.
여기서 프로그램의 진입점 역할을 하는 main() 함수를 HelloKotlin.kt와 MainArgs.kt 파일을 통해 살펴봤습니다. 짧은 코드지만 많은 개념과 원리가 숨어 있다는 것을 알게 되었을 텐데요. 이렇게 쉬운 코드에 어려운 개념이 잔뜩 숨겨져 있었다니! 놀랐을 수도 있습니다. 하지만 항상 모든 것의 기본이 가장 어려운 것입니다. 이런 개념과 원리를 하나씩 밟아 가면서 기본에 충실하면 아무리 복잡한 코드가 나와도 손쉽게 이해할 수 있게 될 것입니다. 이제 코틀린과 함께하는 여행을 떠나 봅시다!

위치로 진입 점

잠깐! 현재 Internet Explorer 8이하 버전을 이용중이십니다. 최신 브라우저(Browser) 사용을 권장드립니다!

  • 데이터넷
  • 승인 2021.08.14 11:00
  • 댓글 0

[데이터넷] 전 세계적으로 분산된 서비스 형태로 제공되는 클라우드 기반 SaaS 애플리케이션 도입 기업들이 증가함에 따라 네트워크를 통해 제공되는 모든 서비스와 마찬가지로 클라우드 기반 애플리케이션에도 빠르고 효율적인 핵심 네트워크 서비스인 DDI(DNS, DHCP, IPAM)가 필수다. 사용자를 클라우드에서 가장 가까운 서비스 진입점으로 라우팅할 수 있어야 지연 시간이나 안정성 측면에서 최상의 사용자 경험을 제공할 수 있기 때문이다. 이에 DDI 선도기업인 인포블록스는 중요한 네트워크 서비스를 위한 클라우드 관리 솔루션인 ‘블록스원(BloxOne) DDI’가 주목된다.

비즈니스 및 업무 공간 트랜스포메이션은 전 세계 조직으로 확대되고 있다. 이는 모빌리티, 사물인터넷(IoT), 클라우드의 급격한 확산에 의해 주도되며 비즈니스 수행 방식을 변화시키고 있다.

특히 모바일 장치는 일상의 중요한 부분으로, 언제 어디서나 인터넷 접속이 가능해야 한다. 보안 감시, 제조, 의료 및 스마트 오피스의 IoT는 지속 성장하고 있으며, 비즈니스 크리티컬 애플리케이션과 서비스는 세일즈포스, 마이크로소프트 365, 드롭박스 등과 같은 클라우드 기반으로 빠르게 전환되고 있다.

그 결과 네트워크는 주로 분산된 위치와 해당 위치 내의 장치가 기하급수적으로 증가하는 엣지에서 확장되고 있다. 사용자는 중요한 비즈니스 애플리케이션 및 서비스에 대한 접속 속도 향상, 응답 시간 단축, 안정적인 연결 등을 요구하고 있다.

DDI 프로비저닝·관리 중앙 집중화
그러나 이러한 개선 사항을 평가하고 구현할 시간이나 리소스가 부족한 경우가 많다. 따라서 배포가 용이하고 분산 환경에서 접속, 가용성 및 성능을 개선하도록 최적화된 포괄적인 솔루션이 반드시 포함돼야 한다.

DDI 선도기업인 인포블록스는 이러한 중요한 네트워크 서비스를 위한 클라우드 관리 솔루션을 최초로 선보였다. ‘블록스원(BloxOne) DDI’는 분산된 업무 환경을 갖춘 기업을 위해 DDI의 프로비저닝 및 관리를 중앙 집중화한다.

특히 모바일, IoT, 클라우드 솔루션은 지연 시간에 민감하며 안정적인 DDI 인프라에 크게 의존한다. 블록스원 DDI는 분산 위치의 가시성, 관리 및 제어를 단일 인터페이스로 통합하고, 트래픽을 가장 가까운 SaaS 진입점으로 전달해 애플리케이션 성능을 향상시킨다. 또한 데이터센터와의 연결이 끊어질 경우 로컬 위치의 생존성을 보장한다.

뿐만 아니라 블록스원 DDI는 DNS 서버 그룹 및 액세스 제어 목록(ACL) 템플릿을 활용하고 확장 가능한 마이크로서비스 및 컨테이너 기반 플랫폼을 활용해 구축을 단순화하고 운영을 간소화하며 총소유비용을 최소화한다. 전체 API를 보완해 솔루션 전체에서 지원되는 기능에 안전하게 프로그래밍 방식으로 접속할 수도 있다.

▲ 분산된 지점을 위한 DDI 구성

유연한 API·고가용성·자동화 지원
블록스원 DDI의 모든 UI 기능은 고객이 접근하기 쉬운 API를 통해 지원된다. API 호출은 블록스원 DDI 장치가 아닌 클라우드로 이뤄지고, API를 사용하려면 사용자 자격 증명이 필요하며 해당 권한이 적용된다.

원격지에 있는 2개의 블록스원 DDI는 정보와 역할을 서로 공유하므로 어떤 이유로 다운된 경우 다른 하나의 블록스원 DDI가 해당 사이트의 DDI 서비스에 대한 역할을 위임받게 된다.

뿐만 아니라 ZTP(Zero-Touch Provisioning)는 블록스원 DDI 배포를 자동화하고 대폭 간소화하고, 블록스원 DDI 어플라이언스는 전 세계 모든 원격 사이트에 구성을 인증하고, 다운로드 및 배포한다. 더불어 확장 가능하고, 자동화된 DNS/DHCP 설정을 통해 여러 위치를 효율적으로 처리할 수 있다.

인포블록스 ‘블록스원 DDI’ 핵심 기능
■ 중앙 집중식 운영: 클라우드 관리 인터페이스를 통해 여러 위치에서 자동화된 DNS, DHCP 및 IP 주소 관리, 정책 제어 수행
■ 유연한 패킹: 구독 기반 가격으로 물리적 및 가상 구축 옵션 제공
■ 향상된 최종 사용자 경험: 모든 트래픽이 가장 가까운 애플리케이션 엔드포인트로 전송되도록 로컬 DNS가 확인
■ 로컬 운영 생존성: DNS 및 DHCP 서비스를 통해 재해가 발생하고 WAN 서비스가 중단되더라도 비즈니스 운영을 최소화하고 다운타임 없이 운영 지속
■ 향상된 안정성: 원활하고 중단 없는 작업을 위해 각 사이트에 사용할 수 있는 자동 장애 조치와 DHCP 인스턴스 페어링 구성 가능

인포블록스 ‘블록스원 DDI’ 특징
■ 가상 어플라이언스: VM웨어에서는 가상머신(VM)으로, 도커에서는 컨테이너로 사용 가능
■ 하드웨어 어플라이언스: 인포블록스에서 구매할 수 있는 하드웨어 어플라이언스 정격 용량 최대 5000QPS 및 50LPS
■ 스케일: 하드웨어 어플라이언스, VM, 컨테이너로 수평 확장 가능
■ DNS: DNS 서버는 호스트명을 IP주소로 확인하고 초당 500개의 쿼리와 재귀, 포워딩, 세컨더리 인증 DNS 및 DNS 서버 그룹과 ACL 템플릿 지원
■ DHCP: DHCP 서버는 IP 주소를 할당하고 초당 5개의 할당과 효율적인 IP 사용을 위한 할당 관리 지원
■ IP 주소 관리: IP 주소 관리는 프라이빗/퍼블릭 네트워크 IP 공간, 기기와 관련 데이터에 대한 계획, 추적, 관리 자동화


0 개 댓글

답장을 남겨주세요