'자바'에 해당되는 글 5건

  1. 2012.06.26 제 8회 공감 세미나 후기 (2)
  2. 2010.01.11 함수의 원자성(atomicity) 보장
  3. 2010.01.11 자바에서 쓰레드를 사용하는 방법 (1)
  4. 2010.01.07 자바 - 직렬화 (Serializable) (5)
  5. 2010.01.06 스택과 힙





지난 6월 23일에 제 8회 공감 세미나를 다녀왔습니다.

오늘은 그 내용을 공유하고자 이렇게 글을 씁니다.


진행된 세션은 아래와 같습니다.

  1. Java SE와 EE의 미래
  2. Sencha Touch 클라우드, Sencha.io
  3. 포스트모템으로 살펴보는 위대한 게임 개발팀의 특징
  4. node.js의 의미와 자바의 대안

원래 예정되었던 순서와는 약간 다르게 진행되었는데요,, 뭐 어차피 저는 처음부터 끝까지 다 들을 생각이라서 별 상관은 없었어요~ㅎ


등록

이번 세미나는 강남 교보타워에서 열렸는데요, 늦을 줄 알고 조금 서둘렀더니 엄청 빨리 도착해버렸답니다.^^;; 덕분에 책도 한권 얻었어요~ㅎㅎㅎ



Gamification에 관련된 책인데요,  안그래도 이 분야에 대해 많이 알고 싶어하고 관심을 가져오고 있었는데, 이렇게 좋은 책을 얻게되서 정말 기분이 좋더군요~ㅎ

시작하기 전에

세션이 시작하기 전에 readme라는 사이트를 소개해주더군요. SK 플래닛에서 만들어가고 있는 개발자 정보 공유 사이트라고 합니다.

그리고 여기에 공감 세미나의 발표 동영상을 공유한다고 합니다. 아직은 올라오지 않았는데, 나중에 올라온 것 보시면 도움이 될 것 같네요^^

Session 1. Java SE와 EE의 미래



첫번째 세션은 김병곤님의 자바에 대한 이야기였습니다.
얼마 전에 상하이에서 자바 리더 미팅이 있었다고 하는데요, 그 자리에서 들었던 내용을 공유하고자 이 자리에 서셨답니다. 


먼저 본론에 들어가기 전에 DevOps라는 이야기를 하셨는데요, 이 DevOps는 개발자와 운영자를 합친 팀이라고 합니다. 

신속한 개발을 위해 나온 방법론이라고 하구요, 애자일과 비슷한 맥락의 방법론 같습니다. 개발자와 운영자의 사이가 일반적으로는 좋지 않는데 서로가 하는 일에 대해 잘 모르기때문에 그런 일반적인 상황이 벌어지는 것이고, 그런 근본적인 문제를 해결하기 위해 그리고 더 빠르고 좋은 결과물을 얻기 위해 이러한 방법론이 제기된 것 같습니다.


우리나라에서도 DevOps가 도입되어 있다고 하는데요,, 원래의 취지와는 다르게 회사입장에서 적은 비용으로 많은 일을 할 수 있게끔 개발자에게 운영까지 시키는,,, 뭐 그런 방향으로 변질되었다고 하네요 -0-

파란 개발자 블로그에 이 DevOps에 관련된 포스팅이 있다고 하니 시간이 되시면 한번 읽어보세요~.



그리고 공개 SW 유지 관리 가이드에 관해서도 이야기를 했었는데,, 이 부분은 아직 제가 사회 초년생이라 무슨 말인지도 모르겠더라구요..;; 그리고 사실 이런거에 별로 관심도 없고;;



본론은 오라클이 이끌고 있는 자바의 방향에 대한 내용이었습니다. 

오라클이 선을 인수한 이후로 많은 개발자들이 오라클을 적대시한다고 생각하고 있었는데요, 이 분의 발표를 들으니 오라클이 그렇게 나쁜 곳은 또 아닌 것 같더라구요. 그 동안 Java가 커뮤니티 위주로 발전해 왔는데, 그래서 일관된 방향이 없었다면 오라클은 그런 자바가 일관된 방향으로 나아갈 수 있도록 리더쉽을 발휘할 수 있다고 하네요.


그리고 openJDK에 관련된 이야기도 했었는데요, 맥에서 라이온 이후로는 기본적으로 자바가 설치되어 있지 않다는데,, 원래는 자바가 설치되어 있었나요?(저는 모르겠어요~) 어쨌든 라이온부터는 커맨드 창에서 자바 명령어를 입력하는 순간 다운받는다고 하네요. 

그리고 맥에서는 자바로 개발을 할 때 자바 소스를 볼 수가 없어 상당히 불편하다고 합니다. 

저는 지금 껏 자바 소스를 보거나, 그 소스를 개조해서 사용해야할 일이 없었는데요, 발표자 분은 그런 일이 잦으셨나 봅니다. 



아직 릴리즈되지 않은 JDK 8에서는 Lambda Expression을 사용한다고 하는데요, 이 람다 표현식이 원래는 closure라는 이름으로 사용되어왔다고 합니다. 람다 표현식을 도입하게 되면 코드량을 줄일 수 있기 때문에 도입된다고 하네요.

처음에는 생소해서 사용하기 힘들 것 같은데요, 이 표현식을 익힘으로써 코드량을 확 줄일 수 있다면 충분히 배워볼만 할 것 같네요.

코드량을 줄인다는 것은 그 만큼 한번에 많은 문맥을 파악할 수 있음을 의미하니까 한번 작성한 코드를 파악하는데 드는 시간을 줄일 수 있지 않을까하는 개인적인 생각입니다.ㅎ

참고로 람다 표현식을 도입한다고해서 기존 문법을 못쓰는 것은 아니니 걱정은 안하셔도 됩니다.


또한 JDK 8에서 멀티코어를 위한 iterator가 지원된다고 하네요. 사용법은 기존 Iterator와 비슷한데요, 멀티 코어용 Iterator를 사용하면 반복문을 순회하는데에 한 쓰레드가 하나씩 접근하는게 아니라, 동시에 여러 쓰레드가 병렬적으로 처리할 수 있다고 합니다. 3rd파티 개발자는 그저 해당 Iterator를 사용만 하면 되는 것이죠!

Session2. Sencha.io



두 번째 세션은 안광운님의 Sencha.io에 관한 이야기였는데요, 사실 이 부분에 조금 관심이 있었습니다.

Sencha 이야기를 하기 전에 Ext JS라는 자바 스크립트 프레임웍에 대해 이야기를 꺼내셨습니다. 이는 Sencha touch의 전신으로써 사용이 어렵다고 하네요.


Ext JS와 마찬가지로 Sencha Touch 2.0도 개발 난이도가 높다고 합니다. 저희 회사에서는 Sencha Touch 1.0을 이용해서 앱팡을 개발했는데요, 담당 개발자 분도 웹개발만 하시다가 Sencha를 하니 어렵다고 하시더라구요.

그리고 Sencha Touch가 멀티 플랫폼에 대비하기 위한 모바일 웹앱 프레임웍으로 많이 알려져 있는데, 실제로 예제를 보면 반하실 수도 있습니다. 모바일 웹앱인데도 불구하고 네이티브 앱과 같은 UI효과들을 기본적으로 지원하거든요.ㅎ

그런데 아직까지는 안드로이드에서 성능이 잘 나오지 않는다는 단점이 있습니다. (IOS에서는 꽤나 잘 돌아갑니다.)



Sencha.io는 Sencha touch 2에서만 사용할 수 있는 클라우드 플랫폼입니다. Sencha.io 자체만으로는 의미가 없구요 반드시! Sencha touch2와 함께 사용해야만 합니다. 

다른 플랫폼에서는 사용할 수 없다는 단점이 있기는 하지만 Sencha touch 2를 이용해서 개발할 경우 정말 간단하게 클라우드 방식으로 데이터를 공유할 수 있는 앱을 만들 수 있다는 장점이 있습니다. 



Sencha.io는 크게 4가지의 기능을 지원합니다.


로그인 Login

아마도 쉽게 로그인과 회원가입을 구현할 수 있게 끔 구현이 되어 있는 것 같네요.

데이터 Data

데이터 공유, 백업, 복구 등을 지원한다고 합니다.

메시지 Message

일대일 메시지나 일대다 메시지를 실시간으로 주고 받을 수 있는 기능을 제공한다고 합니다.

배포 Deployment

앱 개발 과정 중에 팀원들이 함께 사용할 수 있는 저장소를 제공하고, 버전관리도 되고, 배포도 바로 할 수 있는 기능을 제공한다고 합니다.



이렇게 좋은 게 아직까지는 무료라고 하는데요, 발표자의 말씀에 따르면 곧 유료화를 진행할 것 같다고 하네요~ㅠ_ㅠ



아래와 같은 구조로 Sencha touch앱이 배포될 수 있다고 하네요.


그림에서 볼 수 있듯이 Sencha touch 2.0앱은 Nginx라는 서버 안에 위치하게 되고, 앱 안에 Sencha.io는 SDK 형태로 포함되게 됩니다. 발표자의 말에 따르면 Nginx는 node.js로 만들어진 서버 엔진이라고 했는데요,, 대충 영문 위키의 내용을 살펴봤는데(정말 대충 앞부분만 봤습니다.), Nginx는 오픈 소스 웹서버이고 HTTP, SMTP, POP3, IMAP 프로토콜용 리버스 프록시 서버라고 하네요. 그리고 동시성에 강점이 있나봅니다. 


그리고 마지막으로 Meteor라는 것도 소개해주셨는데요, sencha.io를 대신할 수 있는 거라고 하셨습니다. sencha.io처럼 데이터 동기화 등의 기능을 제공해 주지만, sencha.io가 Sencha touch 2.0에서만 사용할 수 있는데에 반해서 meteor는 그런 사용상의 제약이 없다고 하네요. 이것도 한번 살펴볼 필요가 있는 것 같습니다.

Session 3. 포스트모템으로 살펴보는 위대한 게임 개발팀의 특징



 세번째 세션은 NC 소프트에서 일하시는 박일님의 세션이었습니다. 기술적인 이야기를 듣고 싶었는데, 사실 이 세션은 기술적인 내용은 아니었습니다. 

포스트 모템은 프로젝트가 끝나고 나서 어떤 점을 잘했고, 어떤 점이 아쉬웠는지에 대해서 정리를 하는 것이라고 합니다. 그렇게 정리를 함으로써 다음 프로젝트의 실수를 줄이고 더 좋은 방향으로 프로젝트가 진행될 수 있도록 하는 것이 목적인 것 같습니다. 


NC 사장님(김택진)이 하신 말씀 중에 다음과 같은 말이 있다고 합니다.

게임은 인류의 뇌에게 주는 선물

게임이 인류의 "뇌"에게 주는 선물이라,, 잘 생각해봐야겠네요. 

저는 그 선물을 더 선물답게, 그리고 더 가치있게 만들 수 있도록 많은 생각을 해봐야겠네요.



이번 세션에서는 발표자분이 쓴 책에 나온 글자를 태그처럼 분류해서 가장 많이 나오는 단어별로 정리를 해줬습니다.

발표 내용을 다 받아적지는 못해서 일부 내용은 빠졌습니다.^^;;


비전

비전은 게임을 만드는 사람들이 게임이 어떤 방향으로 가야할지에 대한 큰 그림(비전)을 공유해야 함을 이야기 합니다. 성공적인 팀에서는 개발자들과 기획자, 디자이너가 서로 공통의 비전을 잘 공유해서 정말 원하던 그림을 만들어 내겠죠.


프로토타입

프로토타입은 기존 요소(리소스)를 이용해서 최대한 빠르게 시연해보고 테스트해볼 수 있는 시제품을 만드는 작업입니다. 이 작업은 정말 최대한 빨리 진행이 되어 게임의 방향을 결정할 수 있어야 합니다. 프로토타입이 빨리 만들어질 수 있다면 많은 시행착오를 줄일 수 있겠죠?

많은 사람들이 하는 실수 중 하나가 프로토타입을 만들었는데 주위 반응이 별로 안좋으면, 여기에 아트를 붙이면 괜찮아지지 않을까?하는 생각이라고 합니다. 프로토타입이 재미가 없으면 아무리 멋진 그림과 효과를 넣어도 재미없다는 거죠.



디렉터

디렉터는 팀을 이끄는 사람인데요, 보통 작은 회사에서는 디렉터가 여러가지 역할을 동시에 수행한다고 합니다. 그런데 사실 디렉터는 팀의 프로젝트가 올바른 길로 향할 수 있도록 잘 지켜보고 방향을 잘 잡아야하는데, 이것저것 다른 일을 하다보면 그 방향 잡는 일에 소홀해질 수 밖에 없다는 이야기죠.



FGT(Focus Group Test)

FGT는 특정 유저를 초청해서 플레이하는 것을 가만히 지켜보면서 문제를 파악하는 방법입니다. 여기에서 중요한 것은 유저가 어떤 행동을 하던지 절대 간섭해서는 안되고 옆에서 가만히 관찰만 해야한다는 것입니다. 

제트 스키를 만든 일본의 한 회사를 예로 들며, FGT는 좋은 방법이기는 하지만 유저의 의견을 받아들이되 해결책은 참고 정도로 하라고 하네요. 원래 초창기의 제트 스키는 앉아서 타는게 아니라 일어서서 타는 방식이었다고 합니다. 그 회사에서는 그런 제트스키가 어떻게 하면 더 좋아질지 유저들에게 의견을 받았고, 유저의 의견을 받들어 딱딱한 발판을 대신해서 푹신푹신한 발판을 만들었다고 합니다. 그런데 얼마 후 경쟁사에서 앉아서 타는 제트스키가 나왔고, 그 회사는 완패했다고 합니다. 그런데 정말 웃긴 것은 완패한 그 회사가 원래는 오토바이를 만들던 회사였다고 합니다.;;



사람

항상 나오는 이야기라고 하는데 개발자는 필요 이상으로 있어야 한다고 합니다. 항상 회사에서는 작은 인력으로 많은 일을 하려고 하기 때문에 개발자는 정신적, 육체적으로 지치게 되고 결국 이직을 하게된다고 하네요. 

너무나 당연한 이야기인 것 같은데, 우리나라에서는 너무나 잘 안지켜지는 부분인 것 같습니다. 

사람이 하는 일인데, 사람이 좋아야 잘 되는 일인데,,,



의사소통

프로젝트를 할 때 의사소통의 중요성에 대해서도 이야기하셨는데요, 같은 프로젝트를 진행하는 팀이 가까이에 위치하는 것 만으로도 많은 도움이 된다고 합니다. 그리고 redmine등의 도구를 잘 사용하는 것도 의사소통에 도움이 된다고 하셨는데, 이런 의사소통 툴은 개인마다 성향이 다르기 때문에 결국에는 이런 툴보다는 문화를 만드려는 의지가 중요하다고 하네요.



맵같은 경우에 개발자가 매번 테스트를 위해 이렇게 저렇게 수정하는 작업은 굉장히 비효율적인 작업이죠. 그래서 이런 경우에 잘 만들어진 툴만 있어도 개발자의 도움없이 여러가지 테스트를 해볼 수 있다고 합니다. 저도 실제로 툴의 필요성을 많이 느끼고 있는데, 실제 프로젝트에서는 인력도 부족하고 시간도 부족해서 툴을 만들 여유가 없는 것 같네요. 그렇지만 분명히 툴은 한번 만들어두면 계속해서 쓰일 수 있기 때문에, 나중을 위해서라도 꼭 하나씩 만들 필요가 있는 것 같습니다.



마지막으로 발표자분의 블로그 주소를 알려주시더군요. http://parkpd.egloos.com/


Session 4. node.js의 의미와 자바의 대안



마지막 세션은 박성철님의 세션이었습니다. 

Google Trands를 보면 Ruby on Rails 다음으로 많이 쓰이는게 node.js라고 나왔다고 하네요.

node.js를 간단히 소개하자면 commonJS를 이용해서 모듈화를 했고, 비동기 I/O를 추상화, 이벤트 기반의 단일 쓰레드 동시성 처리가 강점이라고 합니다. 


일반적인 웹서버는 클라이언트 하나 당 하나의 쓰레드를 생성하는데 node.js에서는 하나의 쓰레드에서 event driven방식으로 여러 유저에 대한 처리를 해줄 수 있다고 합니다. 그렇기 때문에 당연히 동시에 처리할 수 있는 유저가 많겠죠?


node.js는 DB중심의 ajax서버, 네트웍 프록시, 채팅, 알림, 대용량 파일 업로드 등에 사용될 수 있다고 합니다.


이번 세미나가 자바 개발자를 위한 세미나인 만큼 node.js를 기존 자바 환경에서 사용할 수 있는 것에 대해서도 이야기 해주셨구요. 사실 스프링같은 back단에 대해서 모르기 때문에 잘 이해는 안됐지만, 어쩄든 레이어를 나눠서 node.js를 붙이는 방법이 있다고 합니다. 

그리고 Netty라고 node.js같은 기술인데 java를 사용하는 것도 있다고 하구요. 


그런데 Netty보다도 더 좋은게 있다는데 그게 vert.x라고 합니다. vert.x는 현재 javascript, Ruby, Groovy, java를 지원한다고 합니다. 앞으로 더 많은 언어를 지원할 거라고 했는데, 현재까지 사용 가능한 디비는 MongoDB가 유일하다고 하네요;

vert.x는 아직 부족한 부분이 많지만 계속해서 발전하고 있고, 충분히 지켜볼만한 이유는 있다고 합니다.

끝...

간단하게 쓸려고 했는데,, 글을 쓰다보니 길어졌네요.ㅠ_ㅠ
아휴 피곤해;;
이상으로 제 8회 공감세미나 후기를 마칩니다.^^

저작자 표시 비영리 변경 금지
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. KUAHN 2012.06.26 23:15 신고 Address Modify/Delete Reply

    안녕하세요. ^^
    귀한 시간 내주셔서 감사합니다.
    사실 "발표자의 말에 따르면 NginX는 node.js로 만들어진 서버 엔진이라고 했는데요" 라는 말을 드린적이 없는거 같은데
    오해를 드려 죄송합니다.
    node.js로 NginX를 만든것은 아니고요. 프론트단 처리를 NginX에게 맡기고 어플리케이션 기능을 node.js가 처리한다고 보시면 될거 같습니다.

    부족한게 많아 미흡한 부분이 많습니다. 좋은 하루 되세요.^^

멀티 쓰레드(multi-thread) 기반의 프로그래밍을 하게 되면 중요한 것이 바로 원자성의 보장이다.

그렇다면 원자성이 무엇인가?

원자성이란 여러개의 쓰레드가 있을 때 특정 시점에 어떤 메소드를 두개 이상의 쓰레드가 동시에 호출 못한다는 것이다.

간단한 예를 들어보자.
class Job implements Runnable {
   public void run() {
      while(true) {
         go();
         stop();
      }
   }
   public void go() {
      /* 매우 중요한 작업이다 */
   }
   public void stop() {
      /* 그냥 일반적인 작업이다. */
   }
}

위의 Job 클래스를 보면 run()메소드에서 go()와 stop()메소드를 무한 호출하고 있다.
그런데 여기에서 go()메소드가 아주 중요한 메소드라고 하자.

메인 클래스에서 Job객체를 이용해서 여러개의 쓰레드를 만들었고, 각 쓰레드를 수행시켰다고 하면 각 쓰레드는 start()메소드를 언제 호출했든지에 상관없이 멀티 쓰레드 정책에 따라 수행될 것이다.

그런데 잘 생각해보면 1번 쓰레드에서 go()메소드를 수행하는 중에 2번 쓰레드가 go()메소드를 수행할 수도 있다.
그렇게 되면 우리가 예상치 못한 문제가 발생할 수 있는 부분이라고 가정하자. (그런 상황은 여러가지 상황이 있을 수 있다. 특히, 서로 다른 쓰레드의 go()메소드에서 같은 변수의 값을 변화시키는 부분일 경우를 생각해 보면 된다.)

어쨌든 go()메소드가 그렇게 중요한 부분이라서 절대로 함수 호출이 끝나기 전에 또 다시 go()메소드가 호출되는 일이 없어야 한다면, 이런 경우가 바로 원자적으로 수행되어야 하는 부분이다.

그래서 이러한 부분을 원자적으로 (atomic) 수행되는 것을 보장해 주는 것이 바로 synchronized 키워드이다. 그래서 go()메소드의 선언 부분을 다음과 같이 바꿔주면 된다.

public synchronized void go() 



신고
Posted by Code-Moon

댓글을 달아 주세요

자바를 이용해서 프로젝트를 진행하면 사용하는 클래스에 대해서는 거의 모르는 게 없게 된다.

하지만 프로젝트를 할 때에는 잘하다가도 손 놓으면 잊어버리게 되는 것 중 하나가 바로 쓰레드를 사용하는 것이다.

그래서 오늘은 쓰레드를 사용하는 방법에 대해 정리해 보자.

먼저 쓰레드를 사용하기 위해서는 Runnable 인터페이스와 Thread 클래스가 필요하다.

Thread 클래스는 새로운 작업을 맡게되는 일꾼이라고 생각하면 되고, Runnable 인터페이스를 구현하는 객체가 실질적인 일이 되겠다.
또 Runnable 인터페이스를 구현하는 클래스는 run()함수에 쓰레드에서 작업할 일을 넣으면 된다.

그렇다면 간단한 예제를 살펴보도록 하자.

public class Job implements Runnable  {
   public void run() {
      System.out.println("new job");
   }
}

class Main {
   public static void main(String[] args) {
      Runnable job = new Job();
      Thread thread = new Thread(job);
      thread.start();
   }
}


정말 간단한 예제이다. Job이라는 클래스는 Runnable 인터페이스를 구현하는데 run()함수에서는 "new job"이라는 문자열을 한번 출력하게 되어 있다.
Main클래스를 보면 Runnable을 구현한 Job객체를 만들고 이를 Thread 객체의 인자로 넣어 주었다.
그리고 그 쓰레드를 시작하기 위해 thread.start()를 해주었다.
여기서 주의할 것은 Thread객체의 start()메소드를 호출하지 않으면 쓰레드가 절대로 수행되지 않는다는 것이다.
신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon pooha302 2010.03.11 17:18 신고 Address Modify/Delete Reply

    제목에 오타. 수정하면 이 댓글은 지워주삼 ㅋ

자바에서는 객체를 손쉽게 저장하거나 전송할 수 있는데, 이를 가능하게 하는 기술이 바로 직렬화입니다.

원래 객체는 힙 안에 존재하게 되는데 직렬화를 하게 되면 그 모양이 약간 변형되게 됩니다. 이렇게 하게 되면 자바에서 저장 및 전송에 아주 편리하고 유리하다는 장점이 있지만, 동시에 다른 프로그램에서는 이를 분석하기 힘들다는 단점이 있습니다. (물론 직렬화를 통해 어떤식으로 변형이 되는지 그 원리만 잘 알고 있다면 다른 프로그램에서도 얼마든지 읽고 쓰는 것이 가능할 것입니다.)


1.Serializable
직렬화를 하기 위해서는 저장하거나 전송할 객체에 Serializable이라는 인터페이스를 구현해 주어야 합니다. 이 Serializable 인터페이스는 구현할 메소드가 하나도 없기 때문에 그냥 implements Serializable만 써주면 됩니다.

아래의 코드가 Serializable을 구현한 Car클래스입니다.
public class Car implements Serializable {
   /* Car 클래스의 내용 */
}


위와 같이 Serializable을 구현해 줘야 그 객체를 직렬화해서 저장하거나 전송이 가능하지, 구현하지 않을 경우에는 런타임 에러가 발생할 것입니다.

객체가 직렬화되면 그 객체 내부에 있는 모든 객체들도 직렬화되게 됩니다. 그런데 Car객체 내부에 있는 다른 객체가 있다 하더라도 전송이나 저장하기 싫은 변수도 있을 수 있습니다. 이럴 경우에는 transient라는 키워드를 사용하면 됩니다.
예를 들어 Car 클래스에 비밀번호를 담고 있는 password 변수가 있어서 이는 전송하고 싶지 않다고 하겠습니다. 그러면 아래와 같이 코드를 작성할 수 있을 것입니다.

public class Car implements Serializable {
   transient private String password;
   /* Car 클래스의 내용 */
}
위와 같이 코드를 작성하면 직렬화를 하더라도 password의 내용은 직렬화되지 않게 됩니다. 이 transient 키워드는 primitive 변수에도 사용이 가능하고, non-primitive변수에도 사용이 가능합니다.


2.스트림(Stream)
자바에서는 여러종류의 스트림(Stream) 클래스가 있는데 이 스트림 클래스를 이용해서 직렬화된 객체를 파일로 저장하거나 전송하는 등 여러가지 작업을 할 수 있는 것입니다.

다음의 코드는 car객체를 data.dat라는 파일에 넣기 위한 코드입니다.
Car car = new Car();
try {
   FileOutputStream fos = new FileOutputStream("data.dat");
   ObjectOutputStream oos = new ObjectOutputStream(fos);
   oos.writeObject(car);
   oos.close();
} catch(Exception e) {
}

코드를 잘 보면 먼저 FileOutputStream 객체를 생성합니다. 이는 파일에 출력하기 위한 스트림입니다.
그리고 ObjectOutputStream 객체인 oos를 생성하는데 이는 객체를 연결하는 스트림이라 생각하면 되겠습니다.
oos가 객체를 저장할 수 있게 하는데 혼자서는 파일이나 소켓에 넘기는 것이 불가능합니다. 그래서 oos를 생성할 때 fos를 인자로 넣음으로써 객체를 파일에 저장할 수 있도록 하는 것입니다.
그러고나면 oos.writeObject(car)를 하게 되는데 이렇게 하면 실제로 파일에 car객체를 저장하는 것입니다. 저장이 끝나면 oos를 닫아줘야 합니다. oos를 닫아주면 그 아래에 있는 fos는 자동으로 닫히기 때문에 신경쓰지 않아도 됩니다.

이를 그림으로 살펴보면 아래와 같습니다.
사용자 삽입 이미지
위 그림에서 보면 car객체를 data.dat라는 파일에 넣기 위해서 먼저 ObjectOutputStream을 거치고 그 다음에 FileOutputStream을 거쳐서 data.dat파일에 들어간다는 것을 알 수 있습니다.

아래의 코드는 data.dat라는 파일에서 car객체에 값을 읽어보는 코드입니다.
Car newCar = new Car();
try {
   FileInputStream fis = new FileInputStream("data.dat");
   ObjectInputStream oos = new ObjectInputStream(fis);
   ois.readObject(car);
   ois.close();
} catch(Exception e) {
}

코드는 크게 바뀐 부분이 없습니다. Ouput대신에 모두 Input으로 바뀌었고, 객체를 쓸 때에는 writeObject()라는 메소드가 사용되었는데 객체에서 읽어올 때에는 readObject()라는 메소드가 사용됩니다.

이에 대한 그림도 아래에 나와 있습니다.
사용자 삽입 이미지
위의 그림을 잘 보면 data.dat라는 파일에서 newCar라는 객체에 불러오는데, 먼저 FileInputStream에서 ObjectInputStream을 거쳐서 newCar에 불러 온다는 것을 알 수 있습니다.


신고
Posted by Code-Moon

댓글을 달아 주세요

  1. BlogIcon 하늘빠 2010.08.17 16:42 신고 Address Modify/Delete Reply

    좋은 글 잘 보았습니다.
    해설이 넘 명쾌하네요.

    • BlogIcon Code-Moon 2010.08.18 19:37 신고 Address Modify/Delete

      오~ 명쾌하다는 칭찬을 해주시다니^^
      감사합니다.
      글 솜씨가 없어서 다른 분들이 이해를 못하실까봐 내심 걱정했었는데, ^^

  2. 창민 2010.09.17 14:06 신고 Address Modify/Delete Reply

    너무 잘쓰셨네요. 이토록 깔끔한 글이라니.. ㅎㅎ
    블로그에 담아갑니다.

  3. 불꽃란 2013.05.27 14:10 신고 Address Modify/Delete Reply

    좋은 설명 감사합니다
    퍼갈게요 ^^

스택과 힙

프로그래밍/JAVA 2010.01.06 14:43 |

1. 스택(Stack)
스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다.
메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다.


2. 힙(Heap)
힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다.


*만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까?
객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, float, boolean ...)가 아닌 변수에는 객체 자체의 값이 들어가는 것이 아니라 객체에 대한 reference가 들어가게 된다.

즉, 아래 그림과 같은 경우 현재 walk()메소드가 수행되고 있고, walk()메소드에서는 car라는 객체를 사용하게 되는데 이때 car객체는 힙에 생성되어 있고, walk()에서 사용하는 car변수는 힙에 있는 객체의 레퍼런스를 이용하는 것이다.
스택 &

신고
Posted by Code-Moon

댓글을 달아 주세요

티스토리 툴바