본문 바로가기

Programming/JAVA

java : System.out.println();

오늘 무심코 syso ctrl+space를 누르다 이 시스템이 대체 뭐하는 시스템인가 궁금해서
닥치는대로 비집고 들어가봤습니다.
사실 위와 같은 경우는 로그를 찍을때 Logger.err.println() 처럼 엄청 자주 쓰이는데
그 로직에 대해서는 이해못하고 단순히 타이핑만 하는 경우가 많았죠...
스스로 반성해봅니다. ㅠㅠ

System
우선 System 은 다들 아시다시피 final class입니다. 상속할 수 없는 최종 레벨의 class이죠.
또한 생성자는 private로 막아놓았기 때문에 생성하여 사용할 수도 없습니다.
안에 필드나 메소드가 무척 많으나... 접해봤던 것은 out 변수 외엔 그닥 없네요. ㅎㅎ
따라서 System 클래스를 정리하자면 상속할 수 없고, 생성할 수도 없는(인스턴스화x) 클래스입니다.
그래서 클래스를 직접 작성하여 접근하는 방식으로 사용하는 것이죠.

out은 변수입니다!
out변수는  public final static PrintStream타입의 객체입니다.
(System 클래스는 PrintStream을 import함으로써 has a 관계를 가지고 있습니다.)
System이 가지고 있는 이 변수는 System을 적어주고.out을 하면 바로 쓸 수 있는 public 객체입니다.
그리고 값을 대입할 수 없는 final 변수이죠.
그리고 static 이것이 중요합니다. 우리가 늘상 편하게 System.out. 을 사용할 수 있는 것은
바로 이러한 static 변수이기 때문입니다. (이를 클래스 변수라고 표현하기도 합니다.)
static 변수의 특징은 객체의 생성 또는 클래스가 메모리에 올라갈 때 함께 올라가기 때문에 언제든지
사용이 가능하다는 것입니다. 따라서 앞서 말했듯이 우리는 늘상 System.out 을 편히 사용할 수 있는 것입니다.

#잠시 Static 변수에 대해 알아보겠습니다.(아주 간략히)
 static변수는 클래스 변수라고도 하며 사용방법은 변수의 선언 앞에 static을 붙이기만 하면 됩니다.
 객체의 생성으로 각각으로 독립적인 저장공간을 갖는 일반 변수들과는 달리(이를 인스턴스 변수라고 합니다.)
 static 변수는 모든 객체가 공통된 변수를 공유하게 됩니다. 클래스가 메모리에 로딩될때 생성되며 이는
 프로그램이 종료될 때까지 유지됩니다. 위의 out 변수는 public 이기도 하니 전역변수로서
 어떤 객체든 접근이 가능하겠습니다.

#잠시 PrintStream에 대해 알아보겠습니다.(아주 간략히)
 이 PrintStream은 println, printf, print와 같은 메소드들을 정의하고 있으며 모두 public입니다. 또한
 default부터(none argument?) 각종 타입의 Object들을 argument로 오버로딩하여 정의하고 있습니다.

println
위의 out 변수는 PrintStream 클래스입니다.
println은 PrintStream의 여러 메소드 중에 하나로서 사용이 가능해지는 것입니다.
음... 사실 out 변수를 보면서 PrintStream을 함께 뒤져보다보니 print, printf, println 메소드에 대해
크게 설명할 것이 없다는 생각이 드는군요.

짧은 생각으로 저렇게 구현해놓은 부분까지는 이해하지 못하였으나(why에 대한 이해부족 ㅠㅠ)
정리하자면 이러합니다.

무심코 치고는 정리하면서 많이 배웠네요. 이클립스의 편리함으로 무심코 지나치는 코딩이 늘어나고 있는데
이해가 아닌 단순한 타이핑. 개발자로서 가장 조심해야할 버릇이겠죠? ㅠㅠ