hjhearts
124
2019-09-20 09:50:18
6
504

문득 든 궁금증 java, c, c++ 등등 공통


간단한 프로그래밍 예제등에서 .close()는 굳이쓰지않아도 에러가 발생하지 않는데

왜 사용하는건가요? 

물론 사용을 중단한다는 의미가 보여지는것만으로도

가독성 등에서 더 편리함은 있긴하지만

c언어의 filestream같은경우엔 파일 불러오는 포인터변수를 따로 설정해놓으면 그만일텐데

PHP나 JSP등에선 Connection을 메서드로 만들어서 사용하면 충돌할일이없을텐데

사용하는 특별한 이유가 있을까요....??

이를테면 메모리적으로 좋다던가....

그냥 갑자기 궁금해지네요...???

0
  • 답변 6

  • gradler
    121
    2019-09-20 09:55:56 작성 2019-09-20 09:56:13 수정됨

    사용했으면 닫는게 인지상정이죠

    특히나 싱글 인스턴스 또는 데몬 같은 서비스를 이곳 저곳에서 사용하는 경우 한 쪽에서 사용하고 닫지 않는다면 아마 다른 쪽에서는 계쏙 사용하지 못할겁니다.

  • hjhearts
    124
    2019-09-20 10:00:07

    아하 결국엔 싱글인스턴스 등의 서비스에게 적용되기 때문에 충돌이나 연결에 지장이없는 멀티인스턴스들에게도 관례적으로 사용하는거군요.

    인지상정으로 열었으면 닫고

    마치 상수를 대문자로사용하고 일반변수는 소문자로하는것처럼요 답변감사드립니다 ㅎㅎ

  • 근원으로
    405
    2019-09-20 10:51:17

    파일을 열고 닫지 않는 코드가 쌓이게 되면 불필요한 메모리가 점점 쌓이게 됩니다.

    예를들어 c에서 fopen()등으로 파일을 열게 되면 파일을 실제 장치와 연결하여 읽고 쓸 수 있게 해주는 자료구조가 내부적으로 생기게 되고(라이브러리 단& 커널 단) 이에 대한 유저 측의 접근자로 파일디스크립터(fd)라는 녀석을 반환해주게 됩니다. 그런데 이 녀석을 사용 후 close()해주지 않으면 내부적으로 생성된 자료구조가 해제 되지 않고 계속 남게 됩니다.(프로그램 종료 시에는 해제 됩니다.) 

    이외에 파일 디스크립터가 계속 해제되지 않고 생성되다보면 파일 디스크립터 번호가 고갈되어 더 이상 파일을 열지 못하는 사태도 발생할 수 있죠(물론 그런 케이스는 희박합니다만..)

    마지막으로 위에서 이야기 해주셨지만 a라는 파일을 누군가 먼저 열고 있는 상태에서 닫지 않고 다른 쪽에서 a라는 파일을 열고 쓰려고 할 경우 동시성 문제로 파일에 데이터가 써지지 않거나(OS에서 차단) 써지더라고 기존에 열어둔 코드에서 쓰기를 병행할 경우 데이터가 뒤섞일 가능성이 있습니다. 

    이러한 이유로 반드시 파일을 열고 다 사용했으면 파일을 닫아주는 것이 좋습니다.

  • twinmoon
    1k
    2019-09-20 10:53:11

    .close() 메소드를 제공하는 API면 .close() 를 하지 않으면 반드시 문제가 생깁니다.

    보통은 in, out stream은 꼭 .close() 를 하는게 좋습니다.

    그렇지 않으면 JVM이 해당 파일을 계속 열고 있어서 가비지 콜랙터가 동작을 못하고 메모리는 계속 올라가고 이 파일이 삭제도 안되는 상태가 됩니다.

  • youngyoung
    1k
    2019-09-20 11:28:21

    집에 들어갈려고 문을 열었어요. 그런데 집에서 나갈때 문을 안닫고 나갔어요

    문제 될건 없죠. 집은 그대로 있으니..

    그런데 문이 열려있으니 집에 도둑이 들수도 있고. 다른 문제도 생길수 있겠죠?


    끝!

  • 드리데이
    265
    2019-09-20 12:20:48

    stream close를 하지 않으면 파일에 lock 상태가 유지되어 삭제를 할 수 가 없습니다.


    그렇기 때문에 stream 사용 후 close 하는 것 입니다.


    stream close 안된 상태에서 연달아서 삭제해보세요 .

    console.log에 락걸렸다 나와요 .

  • 로그인을 하시면 답변 을 등록할 수 있습니다.