-
c++ 와 Swift 사이 값 주고 받기JDTuner/개발기록 2026. 2. 19. 17:49
이 글을 쓰는 시점엔 튜너 기능만에서는 처리한 값을 가져오기만 하면 되는걸 알고 있지만
이 테스트는 나중을 위해서라도 한번 해봐야하는 테스트였다.
바로 앱과 튜너 사이 값을 주고 받기!!
튜너쪽의 어떤 설정값을 앱을 통해 다룰때도 있을거고
실제로 계산이 필요한 경우 튜너쪽으로 값을 전달하고
받아와야할 필요가 있을수도 있어 해봐야했다.
튜너쪽 코드
// .h class JDTunerEngine { public: JDTunerEngine(); ~JDTunerEngine(); int process(int value); }; // .cpp JDTunerEngine::JDTunerEngine() { } JDTunerEngine::~JDTunerEngine() { } int JDTunerEngine::process(int value) { int newValue = value + 1; return newValue; }c++쪽은 의외로 간단했는데 헤더쪽에서 함수를 int값 value를 받도록 정의하고
구현쪽에서 파라미터를 받게 만들고 value값을 처리하고 반환하는 내용으로 수정했다.
문제는 Wrapper 였는데...
Wrapper 코드
@interface JDTunerWrapper : NSObject - (void)test; - (int)test: (int)value; @endWrapper의 헤더쪽은 간단하다.
함수 정의 방식은 (반환형)함수명: (파라미터타입)파라미터명; 이다. 세미콜론을 빼먹지말자.
파라미터가 여러개인 경우는 코드가 좀 다르던데 일단 1개인 경우는 이렇다.
@implementation JDTunerWrapper { // 인터페이스가 아닌 구현부 내부에 선언하여 엔진 부분을 가려 캡슐화 // std::unique_ptr를 쓰면 메모리 관리가 자동으로 되어 안전 std::unique_ptr<JDTunerEngine> engine; } // 초기화 메서드 // instancetype: 이 메서드를 부른 타입과 동일한 타입 - (instancetype)init { self = [super init]; // 인스턴스 초기화 확인 방어코드 if (self) { // 엔진 객체를 생성합니다. engine = std::make_unique<JDTunerEngine>(); } return self; } - (int)test:(int)value { // 엔진 객체 생성 확인 방어코드 if (engine) { return engine->process(value); } return -1; } @end구현부쪽이 많이 변경됐다.
c++ 하면서 프로퍼티 정의는 헤더쪽에서 하는걸 많이 봐서 Wrapper의 헤더 부분에
JDTunerEngine을 정의해줘야 하지 않을까 했는데 아니었다.
Wrapper의 헤더 부분은 Swift쪽에 노출이 필요한 부분만 작성해서 캡슐화를 해야한다.
그리고 메모리 관리의 용이성을 위해서 unique_ptr로 만들어준다.
instancetype은 Swift의 Self와 동일해보인다.
objective-c에서 초기화 방식도 이렇게 알게됐다.
이후 test 함수를 구현해줬다. 엔진이 포인터가 됐으므로 ->를 사용해서 실행한다.
테스트 결과

토요일에도 열심히함 뷰쪽에서 wrapper를 통해 3을 전달하고 튜너쪽에서 +1한 값을 받아와서 콘솔에 4가 출력됐다.
이렇게 뷰 값 전달 -> 튜너 처리 -> 뷰 처리된 값 출력 테스트가 완료됐다.
하지만!!
JUCE에서 IO를 통해 받은 값을 처리할 수 있어
처리하고 싶은 값을 뷰로부터 받지 않아도 된다...
이건 다음 포스트에서...
그래도 의미 있었다
'JDTuner > 개발기록' 카테고리의 다른 글
주파수 검출 구현하기 2. (1) 2026.02.24 주파수 검출 구현하기 1. (0) 2026.02.20 디바이스 삭제와 마이크 입력 확인 (0) 2026.02.20 소리 데이터를 받아보자 (0) 2026.02.19 Objective-C 첫사용 (0) 2026.02.13