SQL*Loader is the most direct replacement for bcp. If you have an existing process that uses bcp, moving to SQL*Loader is probably the path of least resistance.
You say that you already have the data in memory already. I assume that means that the data is in memory on a client machine not on the database server. Given that starting point, I'd generally prefer a direct path load assuming that whatever database access API you are using provides a direct path API. Incurring the overhead of writing a bunch of data to a file only to have SQL*Loader incur the overhead of reading that data back off disk just to use (assuming you set it up to do so) the direct path API to load the data should make SQL*Loader less efficient. Of course, as a purpose-built tool, it is likely that a SQL*Loader solution can be cobbled together with acceptable performance more quickly than you can write your own code to do so particularly if you're just learning the API.
If you don't have access to a direct path API and you're debating between an application doing a conventional path load using array binds or a SQL*Loader solution doing a direct-path load, the question is much closer. You'd probably need to benchmark the two. Direct-path loading is more efficient than a conventional path load. But writing all the data to disk and reading it all back is going to incur an additional cost. Whether the cost of reading and writing that data to disk outweighs the benefit of a direct-path load will depend on a variety of factors that are specific to your application (data volumes, disk speed, network I/O, etc.).
One additional option to consider may be to write the file to disk, copy the file to the database server, and then use an external table to expose the data to the database. This is generally more efficient than using SQL*Loader from a client machine. Whether it performs better than a direct-path load from an application and whether the additional complexity of writing files, moving them around, and generally moving control from an application to operating system utilities and back to the application outweighs the complexity of writing a bit more code in the application is something that you'd need to answer for yourself.