위치로 진입 점

마지막 업데이트: 2022년 7월 9일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
AndroidManifest.xml

모듈 내보내고 가져오기

이전 챕터에서는 export 와 import 의 기본적인 사용법을 알아보았는데, 이번 챕터에선 좀 더 다양한 사용법을 배워보겠습니다.

선언부 앞에 export 붙이기

변수나 함수, 클래스를 선언할 때 맨 앞에 export 를 붙이면 내보내기가 가능합니다.

아래 내보내기는 모두 유효합니다.

클래스나 함수 선언 시, 선언부 앞에 export 를 붙인다고 해서 함수 선언 방식이 함수 선언문에서 함수 표현식(function expression) 으로 바뀌지 않습니다. 내보내 지긴 했지만 여전히 함수 선언문입니다.

대부분의 자바스크립트 스타일 가이드는 함수나 클래스 선언 끝에 세미콜론을 붙이지 말라고 권유합니다.

같은 이유로 export class 나 export function 끝에 세미콜론을 붙이지 않습니다.

선언부와 떨어진 곳에 export 붙이기

선언부와 export 가 떨어져 있어도 내보내기가 가능합니다.

아래 예시에선 함수를 먼저 선언한 후, 마지막 줄에서 위치로 진입 점 내보냅니다.

참고로 export 문을 함수 선언부 위에 적어주는 것도 동일하게 동작합니다.

import *

무언갈 가져오고 싶다면 아래와 같이 이에 대한 목록을 만들어 import <. >안에 적어주면 됩니다.

가져올 것이 많으면 import * as 처럼 객체 형태로 원하는 것들을 가지고 올 수 있습니다. 예시를 살펴보겠습니다.

이렇게 '한꺼번에 위치로 진입 점 모든 걸 가져오는 방식’을 사용하면 코드가 짧아집니다. 그런데도 어떤 걸 가져올 땐 그 대상을 구체적으로 명시하는 게 좋습니다.

이렇게 하는 데는 몇 가지 이유가 있습니다.

웹팩(webpack)과 같은 모던 빌드 툴은 로딩 속도를 높이기 위해 모듈들을 한데 모으는 번들링과 최적화를 수행합니다. 이 과정에서 사용하지 않는 리소스가 삭제되기도 합니다.

아래와 같이 프로젝트에 서드파티 라이브러리인 say.js 를 도입하였다 가정합시다. 이 라이브러리엔 수 많은 함수가 있습니다.

현재로선 위치로 진입 점 say.js 의 수 많은 함수 중 단 하나만 필요하기 때문에, 이 함수만 가져와 보겠습니다.

빌드 툴은 실제 사용되는 함수가 무엇인지 파악해, 그렇지 않은 함수는 최종 번들링 결과물에 포함하지 않습니다. 이 과정에서 불필요한 코드가 제거되기 때문에 빌드 결과물의 크기가 작아집니다. 이런 최적화 과정은 '가지치기(tree-shaking)'라고 불립니다.

어떤 걸 가지고 올지 명시하면 이름을 간결하게 써줄 수 있습니다. say.sayHi() 보다 sayHi() 가 더 간결하네요.

어디서 어떤 게 쓰이는지 명확하기 때문에 코드 구조를 파악하기가 쉬워 리팩토링이나 유지보수에 도움이 됩니다.

import ‘as’

as 를 사용하면 이름을 바꿔서 모듈을 가져올 수 있습니다.

sayHi 를 hi 로, sayBye 를 bye 로 이름을 바꿔서 가져와 봅시다.

Export ‘as’

export 에도 as 를 사용할 수 있습니다.

sayHi 와 위치로 진입 점 sayBye 를 각각 hi 와 bye 로 이름을 바꿔 내보내 봅시다.

이제 다른 모듈에서 이 함수들을 가져올 때 이름은 hi 와 bye 가 됩니다.

export default

모듈은 크게 두 종류로 나뉩니다.

  1. 복수의 함수가 있는 라이브러리 형태의 모듈(위 예시의 say.js )
  2. 개체 하나만 선언되어있는 모듈(아래의 user.js . class User 하나만 내보내기 함)

대개는 두 번째 방식으로 모듈을 만드는 걸 선호하기 때문에 함수, 클래스, 변수 등의 개체는 전용 모듈 안에 구현됩니다.

그런데 이렇게 모듈을 만들다 보면 자연스레 파일 개수가 많아질 수밖에 없습니다. 그렇더라도 모듈 이름을 잘 지어주고, 폴더에 파일을 잘 나눠 프로젝트를 구성하면 코드 탐색이 어렵지 않으므로 이는 전혀 문제가 되지 않습니다.

모듈은 export default 라는 특별한 문법을 지원합니다. export default 를 사용하면 '해당 모듈엔 개체가 하나만 있다’는 사실을 명확히 나타낼 수 있습니다.

내보내고자 하는 개체 앞에 export default 를 붙여봅시다.

파일 하나엔 대개 export default 가 하나만 있습니다.

이렇게 default 를 붙여서 모듈을 내보내면 중괄호 <> 없이 모듈을 가져올 수 있습니다.

중괄호 없이 클래스를 가져오니 더 깔끔해 보이네요. 모듈을 막 배우기 시작한 사람은 중괄호를 빼먹는 실수를 자주 합니다. named export 한 모듈을 가져오려면 중괄호가 필요하고, default export 한 모듈을 가져오려면 중괄호가 필요하지 않다는 걸 기억해 실수를 방지합시다.

named export default export
export class User export default class User
import from . import User from .

사실 named export와 default export를 같은 모듈에서 동시에 사용해도 문제는 없습니다. 그런데 실무에선 이렇게 섞어 쓰는 사례가 흔치 않습니다. 한 파일엔 named export나 default export 둘 중 하나만 사용합니다.

파일당 최대 하나의 default export가 있을 수 있으므로 내보낼 개체엔 이름이 없어도 괜찮습니다.

아래 예시의 개체엔 이름이 위치로 진입 점 없지만 모두 에러 없이 잘 동작합니다.

export default 는 파일당 하나만 있으므로 이 개체를 가져오기 하려는 모듈에선 중괄호 없이도 어떤 개체를 가지고 위치로 진입 점 올지 정확히 알 수 있으므로 이름이 없어도 괜찮습니다.

default 를 붙이지 않았다면 개체에 이름이 없는 경우 에러가 발생합니다.

‘default’ name

default 키워드는 기본 내보내기를 참조하는 용도로 종종 사용됩니다.

함수를 내보낼 때 아래와 같이 함수 선언부와 떨어진 곳에서 default 키워드를 사용하면, 해당 함수를 기본 내보내기 할 수 있습니다.

흔치 않지만 user.js 라는 모듈에 ‘default’ export 하나와 다수의 named export가 있다고 해봅시다.

아래와 같은 방식을 사용하면 default export와 named export를 동시에 가져올 수 있습니다.

* 를 사용해 모든 것을 객체 형태로 가져오는 방법도 있는데, 이 경우엔 default 프로퍼티는 정확히 default export를 가리킵니다.

default export의 이름에 관한 규칙

named export는 내보냈을 때 사용한 이름 그대로 가져오므로 관련 정보를 파악하기 쉽습니다.

그런데 아래와 같이 내보내기 할 때 쓴 이름과 가져오기 할 때 쓸 이름이 동일해야 한다는 제약이 있죠.

named export와는 다르게 default export는 가져오기 할 때 개발자가 원하는 대로 이름을 지정해 줄 수 있습니다.

그런데 이렇게 자유롭게 이름을 짓다 보면 같은 걸 가져오는데도 이름이 달라 혼란의 여지가 생길 수 있습니다.

이런 문제를 예방하고 코드의 일관성을 유지하기 위해 default export 한 것을 가져올 땐 아래와 같이 파일 이름과 동일한 이름을 사용하도록 팀원끼리 내부 규칙을 정할 수 있습니다.

그런데 규칙이 있어도 이를 지키지 않는 사람이 있을 수 있기 때문에 어떤 팀은 named export만 사용할 것을 강제하는 경우도 있습니다. 모듈 하나에서 단 하나의 개체만 내보내는 경우에도 default 없이 이름을 붙여 내보내면 혼란을 방지할 수 있기 때문이죠.

이런 규칙은 아래에서 배울 모듈 다시 내보내기를 쉽게 해준다는 장점도 있습니다.

모듈 다시 내보내기

export . from . 문법을 사용하면 가져온 개체를 즉시 ‘다시 내보내기(re-export)’ 할 수 있습니다. 이름을 바꿔서 다시 내보낼 수 있는 것이죠. 예시를 살펴봅시다.

다시 내보내기가 왜 필요한건지 의문이 드실 겁니다. 유스 케이스를 통해 다시 내보내기가 실무에서 언제 사용되는지 알아봅시다.

NPM을 통해 외부에 공개할 '패키지(package)'를 만들고 있다고 가정합시다. 이 패키지는 수많은 모듈로 구성되어있는데, 몇몇 모듈은 외부에 공개할 기능을, 몇몇 모듈은 이러한 모듈을 도와주는 ‘헬퍼’ 역할을 담당하고 있다고 합시다.

패키지 구조는 아래와 같습니다.

진입점 역할을 하는 '주요 파일’인 auth/index.js 을 통해 기능을 외부에 노출시키면 이 패키지를 사용하는 개발자들은 아래와 같은 코드로 해당 기능을 사용할 겁니다.

이때 우리가 만든 패키지를 사용하는 외부 개발자가 패키지 안의 파일들을 뒤져 내부 구조를 건드리게 하면 안 됩니다. 그러려면 공개할 것만 auth/index.js 에 넣어 내보내기 하고 나머는 숨기는 게 좋겠죠.

이때 내보낼 기능을 패키지 전반에 분산하여 구현한 후, auth/index.js 에서 이 기능들을 가져오고 이를 다시 내보내면 원하는 바를 어느 정도 달성할 수 있습니다.

이제 외부 개발자들은 import from "auth/index.js" 로 우리가 만든 패키지를 이용할 수 있습니다.

export . from . 는 위와 같이 개체를 가지고 온 후 바로 내보낼 때 쓸 수 있는 문법입니다. 아래 예시는 위 예시와 동일하게 동작합니다.

default export 다시 내보내기

기본 내보내기를 다시 내보낼 때는 주의해야 할 점들이 있습니다.

user.js 내의 클래스 User 를 다시 내보내기 한다고 가정해 봅시다.

User 를 export User from './user.js' 로 다시 내보내기 할 때 문법 에러가 발생합니다. 어디가 잘못된 걸까요?

default export를 다시 내보내려면 위 예시처럼 export 를 사용해야 합니다.

export * from './user.js' 를 사용해 모든 걸 한 번에 다시 내보내면 default export는 무시되고, named export만 다시 내보내집니다.

두 가지를 동시에 다시 내보내고 싶다면 두 문을 동시에 사용해야 합니다.

default export를 다시 내보낼 땐 이런 특이한 상황도 인지하고 있다가 처리해줘야 하므로 몇몇 개발자들은 default export를 다시 내보내는것을 선호하지 않습니다.

지금까지 배운 export 타입을 다시 한번 살펴봅시다.

아래 타입들을 쭉 보고 얼마나 기억하는지 체크해 보세요.

  • 클래스, 함수 등의 선언부 앞에 export 붙여서 내보내기:
    • export [default] class/function/variable .
    • export .
    • export from "module"
    • export * from "module" (default export는 다시 내보내 지지 않음)
    • export from "module" (default export를 다시 내보냄)

    가져오기 타입 역시 정리해 봅시다.

    • named export 가져오기:
      • import from "mod"
      • import x from "mod"
      • import from "위치로 진입 점 mod"
      • import * as obj from "mod"
      • import "mod"

      import/export 문은 스크립트의 맨 위나 맨 아래에 올 수 있는데 이 둘엔 차이가 없습니다.

      따라서 아래 스크립트는 문제없이 잘 동작합니다.

      대개는 편의상 스크립트 맨 위에 import 문을 위치시킵니다.

      import/export 문은 블록 <. >안에선 동작하지 않는다는 점에 유의하시길 바랍니다.

      조건을 충족하면 모듈을 가져오려는 의도로 작성된 아래 코드는 동작하지 않습니다.

      그런데 애플리케이션을 작성하다 보면 조건에 따라 모듈을 가져와야 하거나 어떤 특정 시점에 모듈을 불러와야 하는 경우가 생깁니다. 이럴 땐 어떤 방법을 사용해야 할까요? 요청이 있을 때만 모듈을 불러오는 게 가능할까요?

      네오가 필요해

      [Android] Entry point(시작점, 진입점) 변경(Launcher, Main) 하기

      • Steele Spiegel
      • Android/Android Dev
      • 2022. 4. 24.

      진입점(Entry point)

      일반적으로 프로그램들은 시작점(진입점)이라는 것이 존재합니다. 자바의 경우, main() 메소드로 진입을 하며 진입은 한개로 이루어지는 것이 보편적이지만, 안드로이드의 경우 단일 진입점 혹은 시작점이라는 것이 존재하지 않고, 4가지의 컴포넌트가 이를 대체합니다.

      AndroidManifest.xml

      AndroidManifest.xml

      위 화면은 AndroidManifest.xml 화면이며 이제 막 만든 프로젝트를 열어본 것입니다. Activity는 MainActivity밖에 없기 때문에 단일 시작점은 MainActivity가 됩니다.

      현재 이 프로젝트를 실행하면, 아래와 같이 기본으로 제공하는 Hello World! 화면이 뜨게 될 것입니다.

      Hello World 화면

      여기서 새로운 Activity를 추가해보도록 하겠습니다.

      Login Activity 추가

      전혀 다른 액티비티 화면을 보여주기 위해 Login Activity를 추가하였습니다.

      최종적으로 Finish를 눌러, LoginActivity를 생성하게 되면, 이제 안드로이드에서 로그인을 할 수 있는 액티비티와 로그인 기능에 도움이 되는 코드, layout 등이 추가 됩니다.

      로그인 기능들이 추가된 모습

      이제 이 로그인을 메인으로 잡아보도록 하겠습니다.

      추가된 Activity

      위 내용은 AndroidManifest.xml에서 Acvitiy 부분만 가져온 것입니다. 기존에는 MainActivity밖에 없었지만, 상단에 LoginActivity가 추가된 것을 볼 수 있습니다.

      MainActivity를 보면, intent-filter라는 것이 추가로 지정이 되어 있는데 이 영역으로 Entry Point를 변경할 수 있습니다.

      Main과 Launcher 변경

      위와 같이 intent-filter를 LoginActivity 영역으로 변경을 한 후, 프로그램을 다시 실행시켜보았습니다.

      진입점이 변경된 모습

      Login 화면

      변경을 하니 위와 같이 위치로 진입 점 로그인 화면이 처음에 등장하는 것을 확인할 수 있습니다. 이처럼 Entry Point를 변경하기 위해서는 AndroidManifest.xml에서 intent-filter를 변경해주면 쉽게 변경이 된다는 것을 알 수 있습니다.

      위치로 진입 점

      대상 컴퓨터에 설치된 LabWindows/CVI 런타임 엔진의 버전이 개발에 사용된 LabWindows/CVI 환경의 버전보다 오래된 경우 런타임 엔진이 동적 링크 라이브러리(.dll 파일)를 찾지 못할 수 있습니다. 이를 방지하려면 최소한 개발 환경과 동일한 버전 LabWindows/CVI 런타임 엔진을 다운로드하십시오.

      LabWindows/CVI 런타임 엔진 충돌 :

      여러 버전의 LabWindows/CVI 개발 환경을 시스템에 설치할 수 있지만 여러 버전의 LabWindows/CVI 런타임 엔진을 설치하면 .dll 파일을 참조할 때 충돌이 발생할 수 있습니다. 이를 완화하려면 NI 패키지 관리자를 사용하여 시스템에서 최신 버전의 LabWindows / CVI 런타임 엔진을 제외하고 모두 제거하거나 패키지 관리자가 설치되지 않은 경우 프로그램 추가/제거를 사용하십시오.

      .dll 파일의 다른 복사본이 메모리에 있습니다.

      LabWindows/CVI에는 .dll 파일을 확인하기 위해 디렉토리의 우선순위를 지정하는 데 사용되는 검색 순서가 있습니다. 따라서 이 오류는 LabWindows/CVI가 동일한 기능을 포함하지 않는 .dll 파일의 수정 된 사본을 발견하여 발생할 수 있습니다. 이를 방지하려면 :


      Windows 업그레이드 이후 .dll 파일 내용 변경 :

      운영 체제를 업그레이드한 후 문제가 발생한 경우 C:\Windows\ 에있는 참조된 .dll 파일의 복사본 내용이 업그레이드 과정 중 변경되었을 수 있습니다. LabVIEW의 라이브러리 함수 호출 노드를 사용하여 다음과 같은 방법으로 원하는 함수가 .dll 파일에서 제거되었는지 확인할 수 있습니다.

      .dll 파일에서 함수가 제거된 경우 이전 운영 체제에서 .dll 파일의 복사본을 가져와 실행 파일과 함께 배포해야 합니다. .dll 파일과 실행 파일을 설치프로그램에 포함하면 응용 프로그램이 배포된 모든 컴퓨터에 응용 프로그램에서 호출된 함수가 포함된 .dll 파일 버전이 있는지 확인할 수 있습니다.

      픽잇 (Pickit) 비전 시스템 통합 예제

      픽잇 비전과의 연동 프로그램은 IndyDCP 를 통해 명령을 전달합니다. 따라서 IndyDCP 를 이용하여 indy 객체를 생성합니다. 여기서 추가적으로 Pickit 클라이언트 모듈과 JsonProgramComponent 모듈을 임포트 하면 픽잇을 연결하여 사용할 수 있습니다. 이 때, 픽잇, 로봇, 호스트 PC 는 같은 네트워크로 구성하여야 합니다. 모듈 파일과 예제 노트북 파일은 아래 링크를 클릭하여 다운받을 수 있습니다.

      indy_utils/indydcp_client.pyvision_clients/indydcp_client.py 는 Python 모듈 소스 파일이며 Pickit_Program.ipynb 는 픽잇 사용 예제와 이에 대한 상세 내용이 기술된 주피터 노트북 파일입니다. 첨부 된 주피터 노트북을 통해 아래 예제들의 실행이 가능합니다.

      픽잇은 일정 주기마다 로봇으로부터 로봇 자세를 수신합니다. 아래 함수를 실행하면 픽잇 UI 상에서 로봇 연결 표시를 확인하실 수 있으며, 정상적으로 연결 표시가 나타난 후 다음 단계를 진행하시길 바랍니다.

      툴 오프셋 획득

      로봇을 픽잇과 연결한 후에는 프로그램에 사용 할 툴 오프셋과 경유점을 교시하여 파일로 저장해주어야 합니다. 여기서 툴이란 픽잇 연동을 통해 픽 앤 플레이스 작업에 사용될 툴을 지칭합니다.

      먼저, 픽에 사용될 물체를 하나만 상자에 올려둔 후 픽잇 UI 에서 Enable Robot mode 를 실행하고 아래 명령어를 실행합니다. 그러면 현재 물체 위치 좌표를 획득할 수 있습니다.

      그런 다음, 직접 교시 또는 조그를 이용하여 툴이 장착 된 로봇을 픽 위치로 이동시킨 후 아래 명령어를 실행합니다. 이를 통해 픽잇으로부터 인식된 물체 위치 대비 툴의 위치 오프셋을 계산하고 저장하게 됩니다.

      경유점 교시

      다음은 경유점 교시 및 저장 단계입니다. 먼저, 아래 명령어들을 이용하면 로봇의 현재 관절 위치 또는 작업 위치를 출력할 수 있습니다.

      따라서, 픽 앤 플레이스 작업의 각 단계별 위치로 로봇을 움직인 후 아래 명령어를 실행하여 로봇 위치를 획득함과 동시에 파일로 저장합니다. 이 때, 조인트 무브 또는 태스크 무브인지에 따라 두 명령어 중 하나를 택하여 실행할 수 있도록 하며, 구분을 위해 경유점 이름 지정 시 j_ 또는 t_ 를 붙여 저장하는 것을 권장드립니다.

      100. main 함수 매개변수

      이번에는 main 함수 매개 변수를 사용하는 방법을 살펴보아요.
      main 함수는 프로그램 진입점 함수로 프로그램의 개발자가 작성한 코드 중에서 제일 먼저 수행하죠.
      main 함수는 시작하면서 인자와 환경 변수를 받아 사용할 수 있고 종료 결과를 반환할 수 있어요.

      main 함수는 전달한 인자와 환경변수를 선택적으로 사용할 수 있어서 개발자는 다양한 형태의 원형을 갖는 main 함수 중에 한 가지 형태로 정의하여 사용할 수 있어요.

      main 함수의 첫번째 인자는 시작한 곳에서 전달한 인자의 개수예요.
      두번째 인자는 전달한 인자 요소 컬렉션의 주소이며 세번째 인자는 환경 변수 컬렉션의 주소예요.
      인자 요소는 문자열로 되어 있어서 인자 요소 컬렉션을 받기 위해 char ** 형식으로 받을 수 있어요.
      그리고 환경 변수는 “key=value”처럼 키와 값의 쌍을 = 문자로 구분한 문자열로 되어 있어요.
      환경 변수 컬렉션의 주소도 ,char **형태로 받을 수 있어요.

      프로그램 진입점으로 전달한 인자를 아규먼트(argument)라 불러요.
      main 함수의 첫번째 인자인 argc는 argument count의 약자이며 argv는 argument vector의 약자예요.

      다음 코드는 argument로 전달받은 모든 인자를 출력하는 간단한 예제 코드예요.
      ◈ Program.c

      테스트는 콘솔 창을 열어 프로그램 실행 파일이 있는 위치로 이동하여 실행 파일명과 여러 인자를 입력하세요.

      환경 변수를 사용하는 방법에 대해서는 다루지 않을게요.
      관심있으신 분은 getenv 함수와 putenv 함수 사용법을 살펴보세요.


0 개 댓글

답장을 남겨주세요