쪽지발송 성공
Click here
재능넷 이용방법
재능넷 이용방법 동영상편
가입인사 이벤트
판매 수수료 안내
안전거래 TIP
재능인 인증서 발급안내

🌲 지식인의 숲 🌲

🌳 디자인
🌳 음악/영상
🌳 문서작성
🌳 번역/외국어
🌳 프로그램개발
🌳 마케팅/비즈니스
🌳 생활서비스
🌳 철학
🌳 과학
🌳 수학
🌳 역사
구매 만족 후기
추천 재능



         
232, 씨쏘네임







 
48, 페이지짓는사람


227, 사진빨김작가



           
0, 마케팅위너




  
92, on.design



136, 삼월


54, haken45
해당 지식과 관련있는 인기재능

개인용도의 프로그램이나 소규모 프로그램을 합리적인 가격으로 제작해드립니다.개발 아이디어가 있으시다면 부담 갖지 마시고 문의해주세요. ...

안녕하세요!!!고객님이 상상하시는 작업물 그 이상을 작업해 드리려 노력합니다.저는 작업물을 완성하여 고객님에게 보내드리는 것으로 거래 완료...

30년간 직장 생활을 하고 정년 퇴직을 하였습니다.퇴직 후 재능넷 수행 내용은 쇼핑몰/학원/판매점 등 관리 프로그램 및 데이터 ...

자바 IO와 NIO: 파일 처리 최적화

2025-01-20 13:36:41

재능넷
조회수 261 댓글수 0

자바 IO와 NIO: 파일 처리 최적화의 세계로 떠나볼까요? 🚀

콘텐츠 대표 이미지 - 자바 IO와 NIO: 파일 처리 최적화

 

 

안녕하세요, 여러분! 오늘은 자바 개발자들의 필수 지식인 IO와 NIO에 대해 깊이 파헤쳐볼 거예요. 😎 이 주제가 좀 어렵게 느껴질 수도 있지만, 걱정 마세요! 우리 함께 쉽고 재미있게 알아볼 거니까요. 마치 카톡으로 수다 떨듯이 편하게 따라와 주세요~ ㅋㅋㅋ

그런데 말이죠, 우리가 이런 기술적인 내용을 배우는 이유가 뭘까요? 바로 더 나은 개발자가 되기 위해서죠! 여러분, 혹시 재능넷이라는 사이트 아세요? 이곳에서는 다양한 재능을 거래할 수 있는데, 프로그래밍 실력도 그 중 하나랍니다. IO와 NIO를 마스터하면 여러분의 자바 실력이 한층 업그레이드될 거예요. 그럼 시작해볼까요? 🏃‍♂️💨

💡 알쏭달쏭 Tip: IO와 NIO는 자바에서 파일을 다루는 두 가지 주요 방식이에요. IO는 좀 더 전통적인 방식이고, NIO는 새롭고 효율적인 방식이죠. 둘 다 알아두면 여러 상황에서 유연하게 대처할 수 있어요!

1. IO? NIO? 이게 다 뭐야? 🤔

자, 먼저 IO와 NIO가 뭔지 간단히 알아볼까요?

  • IO (Input/Output): 자바의 전통적인 입출력 방식이에요. 파일을 읽고 쓰는 기본적인 작업을 할 때 사용해요.
  • NIO (New Input/Output): Java 1.4부터 도입된 새로운 입출력 방식이에요. 더 빠르고 효율적인 데이터 처리가 가능해요.

이 두 가지 방식은 마치 옛날 휴대폰과 최신 스마트폰의 차이 같아요. 둘 다 전화를 걸 수 있지만, 스마트폰은 더 많은 기능을 더 빠르게 수행할 수 있죠. 그렇다고 옛날 휴대폰이 완전 쓸모없는 건 아니에요. 상황에 따라 더 적합할 수도 있거든요! 😉

IO와 NIO 비교 IO NIO 진화

자, 이제 IO와 NIO의 기본 개념을 알았으니, 각각의 특징을 좀 더 자세히 살펴볼까요? 🧐

1.1 IO의 특징

IO는 우리가 처음 자바를 배울 때 접하는 입출력 방식이에요. 간단하고 직관적이라 초보자도 쉽게 이해할 수 있죠. 하지만 대용량 데이터를 처리할 때는 좀 느릴 수 있어요.

  • 스트림 기반: 데이터를 연속된 흐름으로 처리해요.
  • 블로킹 방식: 한 작업이 끝날 때까지 다른 작업을 못해요. (마치 은행 창구에서 줄 서서 기다리는 것처럼요 😅)
  • 단방향 통신: 입력과 출력을 따로 처리해요.

🎈 재미있는 비유: IO는 마치 빨대로 주스를 마시는 것과 같아요. 한 번에 쭉~ 빨아들이죠. 간단하지만, 큰 컵의 주스를 다 마시려면 시간이 좀 걸릴 수 있어요!

1.2 NIO의 특징

NIO는 IO의 단점을 보완하기 위해 등장했어요. 좀 더 복잡하지만, 대용량 데이터 처리에 효율적이죠.

  • 버퍼 기반: 데이터를 일정 크기로 묶어서 처리해요.
  • 논블로킹 방식: 여러 작업을 동시에 처리할 수 있어요. (마치 패스트푸드점에서 주문 받고 대기번호 주는 것처럼요 🍔)
  • 양방향 통신: 하나의 채널로 입력과 출력을 모두 처리할 수 있어요.

🎭 NIO의 별명: "Non-blocking I/O"라고도 불러요. 왜 Non-blocking이냐고요? 다른 작업을 막지(block) 않고 계속 진행할 수 있기 때문이죠!

자, 여기까지 IO와 NIO의 기본적인 특징을 알아봤어요. 어때요? 생각보다 어렵지 않죠? 😊 이제 각각의 방식으로 실제로 어떻게 파일을 다루는지 자세히 알아볼까요?

2. IO로 파일 다루기: 옛날 방식도 여전히 쓸모 있어요! 📚

IO를 사용해서 파일을 다루는 방법은 정말 다양해요. 가장 기본적인 방법부터 조금 더 발전된 방법까지 차근차근 알아볼게요. 준비되셨나요? 출발~! 🚗💨

2.1 FileInputStream과 FileOutputStream: 가장 기본적인 방법

이 두 클래스는 바이트 단위로 파일을 읽고 쓰는 가장 기본적인 방법이에요. 마치 빨대로 주스를 한 모금씩 마시는 것처럼요! 😋

먼저, 파일을 읽는 방법부터 볼까요?


FileInputStream fis = null;
try {
    fis = new FileInputStream("example.txt");
    int data;
    while ((data = fis.read()) != -1) {
        System.out.print((char) data);
    }
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 코드는 "example.txt" 파일을 한 바이트씩 읽어서 화면에 출력해요. 파일의 끝에 도달하면 -1을 반환하므로, 그때 읽기를 멈추죠.

이번엔 파일에 쓰는 방법을 볼게요!


FileOutputStream fos = null;
try {
    fos = new FileOutputStream("output.txt");
    String message = "안녕하세요, IO 세계에 오신 것을 환영합니다!";
    byte[] bytes = message.getBytes();
    fos.write(bytes);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (fos != null) {
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 코드는 "output.txt" 파일에 메시지를 쓰는 예제예요. 문자열을 바이트 배열로 변환한 후 파일에 씁니다.

⚠️ 주의할 점: FileInputStream과 FileOutputStream을 사용할 때는 반드시 close() 메소드를 호출해야 해요. 그렇지 않으면 리소스 누수가 발생할 수 있어요. 마치 수도꼭지를 잠그지 않으면 물이 계속 새는 것과 같죠!

2.2 BufferedReader와 BufferedWriter: 좀 더 효율적인 방법

이 클래스들은 버퍼를 사용해서 입출력을 더 효율적으로 만들어요. 마치 큰 그릇에 주스를 담아 한 번에 마시는 것과 같죠! 🥤

BufferedReader로 파일 읽기:


try (BufferedReader br = new BufferedReader(new FileReader("example.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 "example.txt" 파일을 한 줄씩 읽어서 출력해요. try-with-resources 문을 사용해서 자동으로 리소스를 닫아주니 편리하죠?

BufferedWriter로 파일 쓰기:


try (BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
    bw.write("안녕하세요, 버퍼드 세계에 오신 것을 환영합니다!");
    bw.newLine();
    bw.write("여기는 훨씬 더 효율적이에요.");
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 "output.txt" 파일에 두 줄의 텍스트를 씁니다. newLine() 메소드로 새 줄을 추가할 수 있어요.

💡 Tip: BufferedReader와 BufferedWriter는 내부적으로 버퍼를 사용하기 때문에 FileInputStream/FileOutputStream보다 훨씬 효율적이에요. 특히 대용량 파일을 다룰 때 성능 차이가 크게 나타나죠!

2.3 Scanner: 편리한 파일 읽기

Scanner 클래스는 파일 읽기를 더욱 편리하게 만들어줘요. 특히 파일의 내용을 특정 형식으로 파싱해야 할 때 유용하죠.


try (Scanner scanner = new Scanner(new File("data.txt"))) {
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        System.out.println(line);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

이 코드는 "data.txt" 파일의 내용을 한 줄씩 읽어 출력해요. Scanner는 파일뿐만 아니라 다양한 입력 소스를 처리할 수 있어 매우 유용해요.

🎭 재미있는 사실: Scanner 클래스는 마치 만능 칼처럼 다양한 기능을 가지고 있어요. 문자열을 쉽게 파싱할 수 있고, 정규표현식도 사용할 수 있죠. 개발자들의 든든한 친구랍니다! 😊

2.4 PrintWriter: 편리한 파일 쓰기

PrintWriter는 다양한 데이터 타입을 쉽게 파일에 쓸 수 있게 해줘요. printf() 메소드를 사용하면 형식화된 출력도 가능하죠.


try (PrintWriter writer = new PrintWriter(new FileWriter("output.txt"))) {
    writer.println("안녕하세요, PrintWriter 세계에 오신 것을 환영합니다!");
    writer.printf("오늘 날짜는 %tF 입니다.%n", new Date());
    writer.printf("현재 시간은 %tT 입니다.%n", new Date());
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 "output.txt" 파일에 환영 메시지와 현재 날짜, 시간을 기록해요. printf() 메소드를 사용해서 날짜와 시간을 원하는 형식으로 출력할 수 있죠.

💡 꿀팁: PrintWriter는 자동으로 버퍼링을 지원해요. 하지만 중요한 데이터를 쓴 후에는 flush() 메소드를 호출해서 버퍼의 내용을 즉시 파일에 쓰는 것이 좋아요. 마치 화장실 물을 내리는 것처럼요! 😅

2.5 RandomAccessFile: 파일의 특정 위치에 접근하기

RandomAccessFile 클래스는 파일의 특정 위치에 직접 접근해서 읽거나 쓸 수 있게 해줘요. 마치 책의 원하는 페이지를 바로 펼치는 것과 같죠!


try (RandomAccessFile file = new RandomAccessFile("random.txt", "rw")) {
    file.writeUTF("안녕하세요!");
    file.seek(0);  // 파일 포인터를 처음으로 이동
    System.out.println(file.readUTF());
    
    file.seek(file.length());  // 파일의 끝으로 이동
    file.writeUTF(" 반갑습니다!");
    
    file.seek(0);  // 다시 처음으로 이동
    System.out.println(file.readUTF());
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 "random.txt" 파일에 문자열을 쓰고, 파일 포인터를 이동시켜가며 읽고 쓰는 작업을 수행해요. seek() 메소드로 원하는 위치로 이동할 수 있죠.

🎢 흥미로운 점: RandomAccessFile은 마치 타임머신처럼 파일 내에서 자유롭게 이동할 수 있어요. 큰 파일에서 특정 정보만 빠르게 읽거나 수정할 때 매우 유용하답니다!

자, 여기까지 IO를 사용한 파일 처리 방법들을 알아봤어요. 어떤가요? 생각보다 다양한 방법이 있죠? 😊 각각의 방법은 상황에 따라 장단점이 있어요. 예를 들어, FileInputStream은 간단하지만 대용량 파일을 다룰 때는 느릴 수 있고, BufferedReader는 효율적이지만 메모리를 더 사용하죠. RandomAccessFile은 유연하지만 사용법이 조금 복잡할 수 있어요.

그럼 이제 NIO로 넘어가볼까요? NIO는 IO와는 또 다른 매력이 있답니다! 😉

3. NIO로 파일 다루기: 새로운 시대의 파일 처리! 🚀

자, 이제 NIO의 세계로 들어가볼 시간이에요! NIO는 "New I/O"의 약자로, Java 1.4부터 도입된 새로운 입출력 API예요. IO보다 좀 더 복잡하지만, 대용량 데이터를 처리할 때 훨씬 효율적이랍니다. 마치 고속도로를 달리는 것처럼 빠르고 효율적이죠! 🏎️💨

3.1 Path와 Files: NIO의 기본

NIO에서는 Path 인터페이스와 Files 클래스가 파일 처리의 중심이 돼요. Path는 파일이나 디렉토리의 경로를 나타내고, Files는 파일 조작을 위한 정적 메소드를 제공해요.


Path path = Paths.get("example.txt");
try {
    // 파일 읽기
    List<string> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
    lines.forEach(System.out::println);

    // 파일 쓰기
    List<string> newLines = Arrays.asList("안녕하세요", "NIO 세계에 오신 것을 환영합니다!");
    Files.write(Paths.get("output.txt"), newLines, StandardCharsets.UTF_8);
} catch (IOException e) {
    e.printStackTrace();
}
</string></string>

이 코드는 "example.txt" 파일을 읽고, "output.txt" 파일에 새로운 내용을 쓰는 예제예요. Files 클래스의 정적 메소드를 사용하면 정말 간단하게 파일을 읽고 쓸 수 있죠!

💡 Tip: Files 클래스는 정말 다양한 메소드를 제공해요. 파일 복사, 이동, 삭제, 속성 변경 등 거의 모든 파일 관련 작업을 할 수 있답니다. 마치 스위스 아미 나이프 같아요! 🔪

3.2 ByteBuffer: NIO의 핵심

ByteBuffer는 NIO의 핵심 컴포넌트예요. 데이터를 임시로 저장하고 효율적으로 전송하는 데 사용돼요. 마치 택배 상자처럼 데이터를 담아 전송하는 거죠! 📦


Path path = Paths.get("example.txt");
try (FileChannel channel = FileChannel.open(path, StandardOpenOption.READ)) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    int bytesRead = channel.read(buffer);
    while (bytesRead != -1) {
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.print((char) buffer.get());
        }
        buffer.clear();
        bytesRead = channel.read(buffer);
    }
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 ByteBuffer를 사용해 파일을 읽는 예제예요. FileChannel을 통해 파일을 읽고, ByteBuffer에 데이터를 담아 처리하죠.

🎭 재미있는 사실: ByteBuffer는 마치 요요처럼 작동해요. flip() 메소드로 쓰기 모드에서 읽기 모드로, clear() 메소드로 다시 쓰기 모드로 전환할 수 있어요. 요요 챔피언이 된 것 같은 기분이죠! 🪀

3.3 Channel: 데이터의 고속도로

Channel은 NIO에서 데이터를 전송하는 통로예요. IO의 스트림과 비슷하지만, 양방향 통신이 가능하고 비동기 처리를 지원해요. 마치 양방향 고속도로 같죠! 🛣️


Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");

try (FileChannel sourceChannel = FileChannel.open(source, StandardOpenOption.READ);
     FileChannel targetChannel = FileChannel.open(target, StandardOpenOption.CREATE, StandardOpenOption.WRITE)) {
    
    sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);
} catch (IOException e) {
    e.printStackTrace();
}

이 코드는 FileChannel을 사용해 한 파일의 내용을 다른 파일로 복사하는 예제예요. transferTo() 메소드를 사용하면 정말 효율적으로 파일을 복사할 수 있어요!

💡 꿀팁: Channel은 다양한 종류가 있어요. FileChannel, SocketChannel, DatagramChannel 등 상황에 맞는 채널을 선택해서 사용하면 돼요. 마치 다양한 종류의 도로를 선택하는 것처럼요! 🚗🚲🚶‍♂️

3.4 Selector: 효율적인 다중 채널 관리

Selector는 여러 채널을 동시에 모니터링하고 관리할 수 있게 해주는 컴포넌트예요. 특히 네트워크 프로그래밍에서 많이 사용되죠. 마치 교통 관제 센터 같아요! 🚦


Selector selector = Selector.open();
ServerSocketChannel serverSocket = ServerSocketChannel.open();
serverSocket.bind(new InetSocketAddress("localhost", 5454));
serverSocket.configureBlocking(false);
serverSocket.register(selector, SelectionKey.OP_ACCEPT);

while (true) {
    selector.select();
    Set<selectionkey> selectedKeys = selector.selectedKeys();
    Iterator<selectionkey> iter = selectedKeys.iterator();
    while (iter.hasNext()) {
        SelectionKey key = iter.next();
        if (key.isAcceptable()) {
            // 새로운 연결 수락
        } else if (key.isReadable()) {
            // 데이터 읽기
        }
        iter.remove();
    }
}
</selectionkey></selectionkey>

이 코드는 Selector를 사용해 여러 채널을 관리하는 예제예요. 서버 소켓 채널을 생성하고 Selector에 등록한 후, 이벤트가 발생할 때마다 적절한 처리를 수행하죠.

🎢 흥미로운 점: Selector를 사용하면 하나의 스레드로 여러 채널을 효율적으로 관리할 수 있 어요. 마치 멀티태스킹의 달인이 된 것 같은 기분이죠! 😎

3.5 AsynchronousFileChannel: 비동기적 파일 처리

AsynchronousFileChannel은 NIO.2에서 도입된 비동기 파일 처리 클래스예요. 파일 작업을 백그라운드에서 수행할 수 있어 애플리케이션의 응답성을 높일 수 있죠. 마치 심부름꾼을 고용한 것처럼 편리해요! 🏃‍♂️💨


Path path = Paths.get("example.txt");
try (AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ)) {
    ByteBuffer buffer = ByteBuffer.allocate(1024);
    Future<integer> operation = fileChannel.read(buffer, 0);
    
    while (!operation.isDone()) {
        // 다른 작업 수행
    }
    
    buffer.flip();
    byte[] data = new byte[buffer.limit()];
    buffer.get(data);
    System.out.println(new String(data));
} catch (IOException e) {
    e.printStackTrace();
}
</integer>

이 코드는 AsynchronousFileChannel을 사용해 파일을 비동기적으로 읽는 예제예요. read 메소드가 Future 객체를 반환하고, 이를 통해 작업의 완료 여부를 확인할 수 있어요.

💡 Tip: AsynchronousFileChannel은 콜백을 사용할 수도 있어요. CompletionHandler 인터페이스를 구현하면 작업이 완료되었을 때 자동으로 호출될 메소드를 정의할 수 있답니다. 마치 알람을 설정해놓은 것처럼 편리하죠! ⏰

4. IO vs NIO: 어떤 것을 선택해야 할까요? 🤔

자, 이제 IO와 NIO에 대해 꽤 많이 알게 되었어요. 그럼 실제로 코딩할 때는 어떤 것을 선택해야 할까요? 정답은 "상황에 따라 다르다"예요. 각각의 장단점을 잘 이해하고 적절히 선택하는 것이 중요해요.

4.1 IO를 선택해야 할 때

  • 간단한 파일 읽기/쓰기 작업을 할 때
  • 스트림 기반의 순차적인 데이터 처리가 필요할 때
  • 소량의 데이터를 다룰 때
  • 블로킹 방식의 처리가 문제가 되지 않을 때

4.2 NIO를 선택해야 할 때

  • 대용량 데이터를 처리해야 할 때
  • 다중 채널을 동시에 관리해야 할 때 (예: 채팅 서버)
  • 비동기 처리가 필요할 때
  • 버퍼를 직접 제어해야 할 때

💖 개발자의 마음: "IO냐 NIO냐, 그것이 문제로다!" 라고 고민하지 마세요. 둘 다 알아두면 어떤 상황에서든 대처할 수 있어요. 마치 양손잡이 검객처럼 말이죠! ⚔️

5. 실전 팁: 파일 처리 최적화하기 🚀

자, 이제 IO와 NIO의 기본을 알았으니 실전에서 사용할 때 도움이 될 만한 팁들을 알아볼까요?

5.1 버퍼 크기 최적화

버퍼 크기는 성능에 큰 영향을 미쳐요. 너무 작으면 잦은 읽기/쓰기로 성능이 저하되고, 너무 크면 메모리를 낭비하게 돼요.


// 일반적으로 4KB ~ 8KB 정도가 적당해요
ByteBuffer buffer = ByteBuffer.allocate(8192);

💡 Tip: 버퍼 크기는 실험을 통해 최적값을 찾는 것이 좋아요. 마치 요리사가 음식의 간을 맞추는 것처럼 말이에요! 👨‍🍳

5.2 메모리 매핑 파일 사용하기

대용량 파일을 다룰 때는 메모리 매핑 파일을 사용하면 효율적이에요. 파일의 내용을 메모리에 직접 매핑해서 빠르게 접근할 수 있죠.


try (RandomAccessFile file = new RandomAccessFile("bigfile.dat", "rw");
     FileChannel channel = file.getChannel()) {
    MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, channel.size());
    // 버퍼를 통해 파일 내용에 직접 접근
    buffer.put((byte) 97);
} catch (IOException e) {
    e.printStackTrace();
}

관련 키워드

  • Java IO
  • Java NIO
  • FileInputStream
  • FileOutputStream
  • BufferedReader
  • BufferedWriter
  • ByteBuffer
  • Channel
  • Selector
  • AsynchronousFileChannel

지적 재산권 보호

지적 재산권 보호 고지

  1. 저작권 및 소유권: 본 컨텐츠는 재능넷의 독점 AI 기술로 생성되었으며, 대한민국 저작권법 및 국제 저작권 협약에 의해 보호됩니다.
  2. AI 생성 컨텐츠의 법적 지위: 본 AI 생성 컨텐츠는 재능넷의 지적 창작물로 인정되며, 관련 법규에 따라 저작권 보호를 받습니다.
  3. 사용 제한: 재능넷의 명시적 서면 동의 없이 본 컨텐츠를 복제, 수정, 배포, 또는 상업적으로 활용하는 행위는 엄격히 금지됩니다.
  4. 데이터 수집 금지: 본 컨텐츠에 대한 무단 스크래핑, 크롤링, 및 자동화된 데이터 수집은 법적 제재의 대상이 됩니다.
  5. AI 학습 제한: 재능넷의 AI 생성 컨텐츠를 타 AI 모델 학습에 무단 사용하는 행위는 금지되며, 이는 지적 재산권 침해로 간주됩니다.

재능넷은 최신 AI 기술과 법률에 기반하여 자사의 지적 재산권을 적극적으로 보호하며,
무단 사용 및 침해 행위에 대해 법적 대응을 할 권리를 보유합니다.

© 2025 재능넷 | All rights reserved.

댓글 작성
0/2000

댓글 0개

해당 지식과 관련있는 인기재능

프로그래밍 15년이상 개발자입니다.(이학사, 공학 석사) ※ 판매자와 상담 후에 구매해주세요. 학습을 위한 코드, 게임, 엑셀 자동화, 업...

AS규정기본적으로 A/S 는 평생 가능합니다. *. 구매자의 요청으로 수정 및 보완이 필요한 경우 일정 금액의 수고비를 상호 협의하에 요청 할수 있...

#### 결재 먼저 하지 마시고 쪽지 먼저 주세요. ######## 결재 먼저 하지 마시고 쪽지 먼저 주세요. ####안녕하세요. C/C++/MFC/C#/Python 프...

* 프로그램에 대한 분석과 설계 구현.(OA,FA 등)* 업무 프로세스에 의한 구현.(C/C++, C#​) * 기존의 C/C++, C#, MFC, VB로 이루어진 프로그...

📚 생성된 총 지식 13,481 개

  • (주)재능넷 | 대표 : 강정수 | 경기도 수원시 영통구 봉영로 1612, 7층 710-09 호 (영통동) | 사업자등록번호 : 131-86-65451
    통신판매업신고 : 2018-수원영통-0307 | 직업정보제공사업 신고번호 : 중부청 2013-4호 | jaenung@jaenung.net

    (주)재능넷의 사전 서면 동의 없이 재능넷사이트의 일체의 정보, 콘텐츠 및 UI등을 상업적 목적으로 전재, 전송, 스크래핑 등 무단 사용할 수 없습니다.
    (주)재능넷은 통신판매중개자로서 재능넷의 거래당사자가 아니며, 판매자가 등록한 상품정보 및 거래에 대해 재능넷은 일체 책임을 지지 않습니다.

    Copyright © 2025 재능넷 Inc. All rights reserved.
ICT Innovation 대상
미래창조과학부장관 표창
서울특별시
공유기업 지정
한국데이터베이스진흥원
콘텐츠 제공서비스 품질인증
대한민국 중소 중견기업
혁신대상 중소기업청장상
인터넷에코어워드
일자리창출 분야 대상
웹어워드코리아
인터넷 서비스분야 우수상
정보통신산업진흥원장
정부유공 표창장
미래창조과학부
ICT지원사업 선정
기술혁신
벤처기업 확인
기술개발
기업부설 연구소 인정
마이크로소프트
BizsPark 스타트업
대한민국 미래경영대상
재능마켓 부문 수상
대한민국 중소기업인 대회
중소기업중앙회장 표창
국회 중소벤처기업위원회
위원장 표창