C++ 구현된 어떠한 알고리즘을 사용하는 경우에 자바에서 C++ dll을 참조하는 인터페이스를 정의해서 동작시킬 수 있다. 이것은 다른 언어에서 돌리는 경우 최적화 방법이라 한다. C#에서도 c++ dll을 동작시키는 방법이 있었듯이 Java에서도 있었다.

 

 JNI(Java Native Interface)를 사용하면 그것이 가능해진다. 본 포스트는 윈도우 환경, Java17로 진행하며 간단한 방법에 대해서 다룰것이다. 스프링 부트리눅스 환경에서 동작시키는 것은 추후에 해봐야하는 일이다. (so파일 생성, gradle , boot 설정 고려)

 

 먼저 C++의 코드를 실행시킬 수 있는 인터페이스가 필요하다. header 파일 형태로 작성되며 그것이 만들어지면 cpp 파일에 구현부 부분을 추가로 작성해주면 된다. 이를 위해서는 자바에서 먼저 어떠한 방식으로 사용할지 정의해야 한다. 

 

1. Java Native Interface 코드 작성

 다음과 같이 작성하는데 Path 환경 변수에 Java 17 jdk 패스를 추가된 상태이다. 아래의 코드는 내가 자바에서 "C++ 코드를 쓸건데 이런 파라미터를 사용할거야~" 라고 명세한 인터페이스 코드라고 보면 된다. 

 

2. C++ dll 생성을 위한 header 파일 생성 

위의 인터페이스 코드는 C++ dll과 연동이 될수 있도록 c++ 형태의 인터페이스 헤더코드 또한 작성되어야 한다. 다르게 말하자면 "내가 c++ dll을 만드는데 이걸 자바에서 쓴다네? 그러면 어떤 형태로 자바에서 쓴대?" 라고 명세한 c++의 header이다. 위의 코드형태를 c++ header 형식으로 자동으로 뽑아낼 수 있다. javac.exe로 가능하다. 

 

java 11버전까지는 javah.exe 라는 파일이 있었으나 java12 버전부터는 사라지고 javac의 -h 옵션으로 가능하게 된다. 해당 코드를 작성한 위치로 가서 javac -h . Main.java 이렇게 입력하면 된다. 

실행결과로 com_test_jni_Main.h라는 파일이 생성된다. 잘보면 자바 패키지 경로와 클래스까지 맞춰져서 생성이 된다. (이 패키지 경로랑 클래스 못맞추면 동작 안되는 경우가 있어요.) 

 

생성된 파일은 다음과 같다. 

 

3. visual studio에서 dll 파일 생성

이제 이 파일을 들고 visual studio에서 작업을 한다. 빈 프로젝트 하나를 만들고 프로젝트 속성에 동적 라이브러리 설정을 한다. 

다음엔 포함 디렉터리 설정에 jdk의 include 위치를 추가한다. 

 

위에서 만든  com_test_jni_Main.h 파일을 visual studio 프로젝트 파일로 넣어주고 해당 파일을 include하여 함수 내부를 정의한다. 

빌드를 해주면 dll 파일이 생성된다. 프로젝트는 반드시 64bit로 빌드해준다. 

 

이제 아까 그 자바코드를 eclipse에서 실행시키면 결과는 다음과 같다. 이 때 주의할 점은 CppJNIProject.dll을 load 해줘야하는데 해당 폴더의 위치를 환경변수에 추가해줘도 되고 파일이 잡히는 위치에다가 놓아서 System.loadLibrary 함수가 참조할 수 있으면 된다. 

 

 

참고

https://velog.io/@oksk4753/JAVA-C-JNI%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%97%B0%EB%8F%99CentOS7-x8664

https://m.blog.naver.com/senshig/221756026727

https://m.blog.naver.com/sssang97/221737572369

'잡지식' 카테고리의 다른 글

IT 직군 관련 포지션, 용어 정리  (0) 2023.07.25
코딩테스트  (0) 2023.07.24

잡코리아 이력서 사이트 모집 공고에 보면 단순히 개발자가 아닌 PL/PM을 모집하는 공고도 있고 도메인도 EAP, ERP, SAP 등의 되게 생소한 용어들이 많이 적혀있다. 그리고 조금 큰 회사라면 경영팀들과 관련된 포지션들과 용어들이 있는데 이런 것들을 한번은 면접에서 물어볼 수 있으니 이것들에 대해서 심플하게 한번 정리하고 가려한다.

 

IT 개발 프로젝트 포지션

PM(Project Manager)

  • 모든 관리 업무를 책임지는 사람
  • 현협, 외부 팀과 인터페이스 및 커뮤니케이션 담당&의견 조율
  • cf) TM(Team Manager) 

PL(Project Leader)

  • PM을 도와 프로젝트의 리딩 담당
  • 개발, 관리 능력(화면설계, 개발일정관리), 고급기술(DB, WAS 등), 구체적인 요구사항을 분석, 화면 설계하며 자신이 관리하는 개발자들이 실제 개발을 진행할 수 있도록 가이드하고 관리

AA(Application Architect)

  • 비즈니스 프로세스 설계를 바탕으로 실제 사용할 수 있는 ERP 등과 같은 IT 솔루션을 설계하는 역할 담당
  • 일반적으로 프레임워크를 바탕으로 설계를 진행하는 경우가 많고, 요약하여 업무 관련 로직 설계
  • 공통 로직, 개발표준, 프레임워크 등 공통업무 설계자
  •  ex.) 인터페이스, 업무와 관련된 모듈/기능 설계, 업무 분석 주도 및 문서화, 필요한 시간과 리소스 산정

TA(Technical Architect)

  • OS, WEB, WAS, DB 설치 등 하드웨어와 네트워크 구축 담당자

DA(Data Architect)

  • 데이터 표준, 구조, 품질, 마이그레션 등 DB 설계자

QA(Quality Assurance)

  • 산출물과 소스코드에 대한 품질을 보증하는 담당자

EA(Enterprise Architect) 또는 BA(Business Architect)

  • 기술적인 관점이 아닌 비즈니스 관점의 프로세스 설계자

SA(Solutions Architect)

  • 프로젝트나 어떠한 비즈니스 요구사항에 따라 개발환경과 같은 솔루션에 대한 설계 담당
  • ex) DevOps 환경 컨설팅을 하고 구축을 지원하는 역할

그 외 포지션들

QC(Quality Control)

  • 제품 관리, 제품을 검사하고 제품에 관한 내용을 보고하는 사람

CS(Customer Service or Customer Satisfaction)

  • 고객 만족에 관련된 포지션으로 고객으로부터의 피드백, 고객만족의 효과 비교분석, 서비스의 만족도를 평가하고 분석 등의 일을 한다. 

MD(MerchanDiser)

  • 상품의 기획 단계부터 시작하여 소비자에게 전달되기까지의 과정을 책임지는 전문가

CM(Category Manager) 

  • 물건을 판매하는 판매자들을 비슷한 카테고리로 묶어 관리 및 운영하는 사람

RA(Regulatory Affair)

  • 국.내외 각종 규제 및 법규사항을 파악하고, 제품의 인.허가를 담당하는 직무

IT 직군 용어

SI(System Integration)

  • 기획, 개발, 구축 촉박한 시간 내에 개발... 기능 완성하는 사람들

SE(System Engineer)

  • 시스템 구축하는 사람들로 이미 구축된 시스템 위에 추가적인 기능들을 개발

SM(System Management)

  • 유지보수 관리, 약간의 개발하는 사람들

도메인쪽 용어

Salesforce

  • 기업이 영업, 마케팅, 고객 서비스 및 기타 부터에서 고객 상호 작용 및 데이터를 관리하고 분석할 수 있는 클라우드 기반 고객관계관리(CRM) 플랫폼이다.
  • 고객 데이터 관리, 영업 자동화, 마케팅 자동화, 고객 서비스 관리, 사용자 정의 및 확장성 등~ 

RPA(Robotic Process Automation) 

  • 조직이 일상적이고 반복적인 작업을 자동화할 수 있게 해주는 기술

MES(Manufacturing Execution System)

  • 제조실행시스템
  • 제품의 주문 단계에서 완성 단계까지 모든 생산 활동의 최적화를 지원하고 실시간으로 정확한 데이터를 이용해 공장 내의 존재하는 모든 작업 활동을 가이드하는 등 착수 및 보고함

ERP(Enterprise Resource Planning)

  • 전사적자원관리시스템 or 전사적통합시스템
  • 생산이나 물류, 재무, 회계, 영업과 구매, 재고 등 경영에 필요한 모든 프로세스들을 통합적으로 관리하는 시스템

POP(Point of Production)

  • 공장의 생산과정에서 기계, 설비, 작업자, 작업 등으로부터 시시각각 발생하는 생산정보를 실시간으로 직접 수집, 처리하여 현장관리자에게 제공하는 시스템

SCADA(Supervisory Control And Data Acquisition)

  • 원격 제어 및 모니터링 시스템

PLC라는 것도 있는데 이것도 자동화설비쪽 용어 

 

EAP(Equipment Application Program)

  • 반도체쪽 분야 프로그램

PG(Payment gateway)

  • 온라인 결제 대행사

B2C(Business to Customer)

  • B2C 영업은 기업 대 소비자(Business to Customer) 영업을 총칭하는 말로, 제품이나 서비스를 직접 사용하는 소비자에게 판매가 이루어지는 방식

B2B(Business to Business) 

  • 기업간의 거래를 위한 영업 방식이다. B2B영업은 기업을 대상으로 기술 기반의 고도화된 제품, 서비스 또는 원자재 등을 판매하는 영업 활동

 

기억나는것들 나중에 추가로 적을 예정...

'잡지식' 카테고리의 다른 글

C++ 코드를 JNI로 Java에서 실행하기  (0) 2023.11.28
코딩테스트  (0) 2023.07.24

오랜만에 코테를 풀어 봤는데 몇가지 습관을 들여야 겠다는 생각을 했다. 

 

아래 문제는 시간 0.15초, 메모리 256MB에 제한이 있는 문제다. 그냥 직관적으로 풀면 쉽게 답이 나오지만 사실은 시간초과로 바로 풀리지는 않는 문제다. 그냥 풀어버리면 시간 초과니 따로 모듈러 연산으로 규칙성을 찾으라는 문제인데 몇가지 키워드를 미리 확인했다면 이런 분류의 문제라는 걸 확인할 수 있는데 그냥 막 풀면 놓치기 쉽다. 그래서 뭔가 생각했어야 했다. 기계적으로... 

 

 

우선 위 문제를 보면 t가 200.000.000 라는 것을 체크 했어야 했다. 이게 시간 복잡도를 가늠할 수 있는 지표니까 대략 1초 1억개의 기본연산 기준이니까 O(n)이 되버리는 순간 이 문제는 시간초과로 못푼다. 그럼 O(1)로 만들어야 하는데 문제 구조상 뭔가 대칭의 형태가 보이고 반복적인 규칙이 있을거 같으니 이런건 직접 노트에다가 다 적어봐야 한다. 풀이 결과를 보면 X(t) = X(t+2W) 형태의 주기성을 가지고 있었고 주기성을 가지고 있다면 for문의 반복 횟수를 확! 줄일 수 있다. 그 외에도 공간복잡도는  w, h가 40000이니까 이걸 배열로 만들면 1.6GB인데 배열을 굳이 안쓸꺼니까 상관없다는 것도 체크하면 된다. 

 

밑의 내용은 요즘 듣는 강의에서 알려주는 내용인데 조금 정리해본다. 

올바른 문제풀이 순서

  • 읽기
    • 시간, 메모리 제한
    • 문제 전체를 꼼꼼히(키워드 체크)
  • 이해하기
    • 제공되는 정보(변수들) 정리(타입조심하기..)
    • 예제 데이터에 대해 이해(데이터가 어떻게 생겼냐?)
  • 파악하기
    • 가능한 최대, 최소 정답에 맞는 데이터를 직접 생성(데이터를 만들어보기)
    • 키워드가 되는 단어들을 체크
  • 추가로 테스트 케이스 좀 더 다양하게 해서 최종적으로 검증하기

 

자바 속도 쬐금이라도 줄이기

 I/O쪽은 어느 언어든지 시간을 많이 먹는 파트이다. 자바에서는 Scanner 연산을 기본적으로 쉽게 쉽게 사용하는데 이게 BufferedReader  보다 시간을 좀 더 많이 먹는편이라 만약에 반복적으로 입력을 받아야 한다면 Scanner 연산 보다는 BufferedReader 클래스로 입력을 받아야 한다. 

 

그리고 JAVA 8이 JAVA 11보다 조금 빠르다. 예를 들면 어떤 문제에서는 JAVA8에서 String의 덧셈 연산을 한 결과는 시간초과 없이 통과되나 JAVA11은 시간초과가 뜬다. 이것을 StringBuilder로 String 덧셈연산을 대체해서 시간을 줄일 수 있는데 진짜 이렇게 까지해서 풀어야 할 문제는 많이 없긴하다.

 

  • BufferedReader 사용
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
int maxX=Integer.parseInt(st.nextToken());
int maxY=Integer.parseInt(st.nextToken());
	
// currPoint
st=new StringTokenizer(br.readLine());
int x=Integer.parseInt(st.nextToken());
int y=Integer.parseInt(st.nextToken());

// try		
st=new StringTokenizer(br.readLine());
int n=Integer.parseInt(st.nextToken());
  • String + 연산 쓰지 말고 StringBuilder 사용하기
StringBuilder sb = new StringBuilder();
sb.append(x);
sb.append(" ");
sb.append(y);
// String + 연산은 매우 느리다. 
System.out.println(sb);

 

참고 >

핵심유형 20개로 한 번에 끝내는 알고리즘 코딩테스트 with Java

'잡지식' 카테고리의 다른 글

C++ 코드를 JNI로 Java에서 실행하기  (0) 2023.11.28
IT 직군 관련 포지션, 용어 정리  (0) 2023.07.25

+ Recent posts