제2 외국어 영역2007.11.07 09:25

System.out.print() 가 있다..


음... 이것이 무엇인데;; () 안에 값을 넣으면 콘솔창에 값이 찍히는걸까;;


작년 java 교육을 받을 때 강사가 했던 말이 문득 생각이 나는데..


강사 왈 : System.out.print()를 이해하면 객체지향에 대해선 다 이해한거나 다름 없다~ ;;


라는 말을 했다...


뭐 물론..... 그땐  정말 그런줄 알았다.. ㅋ


그렇다고 아니라는 이야기는 아니고..ㅋ


 System.out.print() .. 이놈... 음... 뭐가 닷트(.) 을 한개도 아니고 두개씩 찍었다..


처음 이걸 보면 뭐야 이거... 그냥 이렇게 쓰면;; 찍히니까;; 아무 생각없이 썼을 것이다..



나도 ... 그냥 책에 나와 있으니;; 그냥 썼고... 의식하지 않으면 그냥 넘어갈 수 있는 것이고..


구지 왜 저렇게 되는거라는걸 이해 하지 않아도 된다.. 왜냐면 그냥 쓰면 콘솔창에 찍히고..


다들 아무런 의심없이 그냥 쓰니까.... 그냥... 그냥... 쓰니까..


그래도 알고가면... 괜찮을것 같아서... 잘 알지는 못하지만... 아는데로 적어본다... ㅋㅋ


System 객체는 아마도 ~ 자바 머신이 돌아가고 있는


시스템을 객체화 시켜놓은 클래스 같다라는 생각이 든다..(이건 단순 제생각이에요^^;;ㅋ 믿거나 말거나..ㅋ)


API 에서 System 클래스를 찾아보면..

----------------------------------------------------------------------------------------------------------------

System 클래스에 의해 얻을 수 있는 기능에는 표준 입력, 표준 출력 및 에러 출력 스트림, 외부적으로 정의된 프로퍼티 및 환경

 변수에의 액세스, 파일 및 라이브러리의 로딩 방법, 배열의 일부를 재빠르게 카피하는 유틸리티 메서드가 있습니다.

----------------------------------------------------------------------------------------------------------------

이런문구가 있다... 우리가 오늘 보고자 하는건 많은 기능들중.. 표준출력에 대해서 알아보는거니까..


out 필드에 초점을 맞추려고 한다.. 표준 출력.. 이러면 꼭 메소드 같은데.. out은..


System클래스의 메소드가 아니라 필드(변수)이다...


System.java를 까보면


public final static PrintStream out = nullPrintStream(); 요렇게 System의 상수라는걸 알수 있다..


그러고 out의 타입은 PrintStream ......


(클래스이름.변수이름 이 가능한건 static으로 선언되어 있기때문에.. 클래스 생성할 필요 없이 접근이 가능한건 알고 계시겟죠?)


PrintStream객체는 자바 io에 양대 산맥 InputStream과 OutputStream중 OutputStream의 손자벌 되는 객체이다..


PrintStream의 아부지는 FliterOutputStream이고 FliterOutPutStream의 아무지는 OutputStream 이니까;; 손자 인듯 싶다..


이걸 보아선 PrintStream은.. 출력하는것이다.. (자세한 기능들은 API에서 PrintStream을 쳐보세요..ㅋㅋ)


잠깐 다른길로 빠졌는데..


무튼 out은 PrintStream 타입이므로 (out은 단지 이름일 뿐이고 실질직인 PrintStream을 담는 통이다.. )


out.메서드  이런식으로 하면.. printStream의 메소드가 호출 되는것이다..


String a = "JAVA";


a.toString();  요것이 가능하듯이.. out.print() 가 가능한것이다.. 


다시 말해서 PrintStream이라는 객체를 만들어서 out이라는 곳에 담아 놓것 뿐이다.. 


out.print() 이건 실질적인 PrintStream의 print()의 메소드를 부르는것 뿐이다..


그러고 out에 담겨 잇는 PrintStream의 출력 대상은 FileOutputStream 인데 이 FileOutputStream의 대상파일은


FileDescriptor 이라는 건데 이건..


/*

[운영 체계에서 파일을 사용할 때 각 파일에 대한 정보를 유지하는 기억 장치의 한 영역 또는 그 정보 ]


(네이버 사전참조) 이런 의미가 있다네요.. 요건 OS의 파일기술자와 관련 있는 부분이에요~

*/


이런거랍니다..


주절주절 적은듯 한다..


이제 결론을 내자면...


System.out ==> 요렇게 하면 Sun에서 구현해놓은데로 System객체가 초기화 되면서..


FileDescriptor을 이용 하여 OS의 표준출력으로 출력 타켓을 잡은 PrintStream이 생성이 됩니다.


그러고 나서 print()메소드를 호출하면..


PrintStream이 생성되면서 타켓으로 잡힌 파일(표준출력도 특정한 파일이라고 이해하시면 되요..)에다가


Write를 하게 되는 거죠..


그래서 System.out.print("JAVA"); 이렇게 하면


콘솔창에  JAVA라는 글씨가 찍히게 되는거랍니다..


----------------------------------------------------------------------------------------------------------------

System 초기화 되면서 FileDescriptor를 통해 PrintStream의 타켓을 운영체제 File Descriptor 잡아줌.
그러고 PrintStream에 있는 print 메소드들을 통해서 OS 표준출력에다가 출력 문구들을 쏘아줌.. 
콘솔창에 원하는 문구 출력..ㅋㅋ
----------------------------------------------------------------------------------------------------------------

** PrintStream의 타켓 잡히는 부분..
... 생략..
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
... 생략..

요런식으로 잡힌답니다..

첨에는 쉽게 생각하고 글을 적기 시작했는데;; 결국 FileDescriptor에 막혀서 한시간이 넘게 걸려 버렸네요..

우리 싸부의 도움으로 글을 마무리 지을수 있었어요..ㅋ  (언제나 컨설트 비용은 안주냐면서 ... 구박을 하지만..ㅋㅋ)


별첨~! 도움말.. ㅋㅋ


싸부 이름 --> 허 진 영 ㅋ

허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
사실 모든 입출력(소켓통신을 포함해서)은
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
파일에 쓰는 것과 비슷하지
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
어찌보면 특정 파일에 쓴다라고 보는게 맞을 듯
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
그 파일에 쓰면 해당하는데로 전송되는건데..
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
System.out 은
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
표준 출력이라는 특별한 파일에 쓰기를 하는거야
OS 에서.. 파일에 입출력을 하려고 파이을 열때, 혹은 소켓통신을 위해 소켓을 열때..
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
파일 디스크립터라는 것을 생성하지.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
뭐 그냥 번호 같은 거야.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
몇번째.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
돈 내.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
건당 만원이잖아
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
여태까지 얼마야.
허진영 ( [진영]없는사람 취급해주세요.. ㅋㅋㅋ ) 님의 말 :
ㅋㅋㅋ

Posted by is윤군

댓글을 달아 주세요

  1. 흐켱

    잘읽었습니다.

    2014.08.01 09:59 [ ADDR : EDIT/ DEL : REPLY ]