16장 클래스 안에 클래스가 들어갈 수도 있구나
Netesd 클래스
코드를 간단하게 표현하기 위해 클래스 안에 클래스를 작성
- 자바 기반의 UI 처리를 할 때 사용자의 입력이나, 외부의 이벤트에 대한 처리를 하는 곳에서 많이 사용 → 소스의 가독성과 유지보수성을 높임
- 한 곳에서만 사용되는 클래스를 논리적으로 묶어서 처리할 필요가 있을 때 (static)
- 캡슐화가 필요할 때 → 내부 구현을 감추고 싶을 때 (inner class)
- Static nested 클래스
- static으로 선언됨
- 내부(Inner) 클래스: static이 없음
- 내부 클래스
- 익명 클래스
static nested class
public class OuterOfStatic{
static class StaticNested{ // static nested class
private int value=0;
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
}
public class NestedSample{
public satic void main(String[] args){
OuterOfSatatic.StaticNested staticNested = new OuterOfStatic.StaticNested();
staticNested.setValue(3);
// 클래스명.nested클래스명으로 객체 생성
}
}
*OuterOfStatic 클래스를 컴파일하면 별도의 클래스 파일로 생성됨
→ OuterOfStatic.class와 OuterOfStatic$StaticNested.class 두개의 클래스가 생성됨
- 사용 예시
public class University{
static class Student{ ... }
}
public class School{
static class Student{ ... }
}
*겉으로 보기에는 유사하지만 내부적으로 구현이 달라야 할 때 사용
내부 클래스와 익명 클래스
- 내부 클래스 (Inner Class)
public class OuterOfInner{
class Inner{ // static이 없음
private int value=0;
public int getValue(){
return value;
}
public void setValue(int value){
this.value = value;
}
}
}
public class InnerSample{
public satic void main(String[] args){
OuterOfInner outer = new OuterOfInner();
OuterOfInner.Inner inner = outer.new Inner();
inner.setValue(3);
// Inner 클래스의 객체를 생성하기 전 OuterOfInner 클래스의 객체를 먼저 생성 후
// 그 객체를 통해서 Inner 클래스의 객체를 생성
}
}
*하나의 클래스에는 어떤 공통적인 작업을 수행하는 클래스가 필요한데 다른 클래스에서는 그 클래스가 전혀 필요하지 않을 때 내부 클래스를 만들어 사용
- 익명 클래스 (Anonymous Class) : 이름이 없는 클래스
(1) 익명 클래스 사용 전
public interface EventListener{
public void onClick();
}
public class MagicButton{
public MagicButton() { }
private EventListener listener;
public void setListener(EventListener listener){
this.listener=listener;
}
public void onClickProcess(){
if(listener != null){
listener.onClick();
}
}
}
class MagicButtonListener implements EventListener{
public void onClick(){
System.out.println("Magic Button Clicked !!");
}
}
public class AnonymousSample{
public static void main(String args[]){
AnonymousSample sample = new AnonymousSample();
sample.setButtonListner();
}
public void setButtonListener(){
MagicButton button = new MagicButton();
MagicButtionListner listener = new MagicButtonListener(); // EventListener를 구현한 클래스 객체
button.setListener(listener);
button.onClickProcess();
}
}
(2) 익명 클래스
public class AnonymousSample{
public static void main(String args[]){
AnonymousSample sample = new AnonymousSample();
sample.setButtonListner();
}
public void setButtonListener(){
MagicButton button = new MagicButton();
button.setListener(new EventListener(){ // 익명 클래스 선언
public void onClick(){
System.out.println("Magic Button Clicked !!");
}
}); // 메소드 호출 과정 내에 클래스가 있기 때문에 세미콜론 필수
button.onClickProcess();
}
}
*클래스에는 이름이 없지만 onClick()과 같이 메소드가 구현되어 있음
*클래스 이름도 없고 객체 이름도 없기 때문에 다른 클래스나 메소드에서는 참조 불가
* 만약 객체를 해당 클래스 내에서 재사용하려면 객체를 생성한 후 사용 ↓
public void setButtonListenerAnonymousObject(){
MagicButton button = new MagicButton();
EventListener listener = new EventListener(){ // 객체 생성 후 익명 클래스 사용
public void onClick(){
System.out.println("Magic Button Clicked !!");
}
};
button.setListener(listener);
button.onClickProcess();
}
*자바에서는 클래스를 만들고 그 클래스를 호출하면 그 정보는 메모리에 올라감
→ 클래스를 많이 만들면 만들수록 메모리는 많이 필요해지고애플리케이션을 시작할 때 더많은 시간이 소요됨
→ 익명 클래스를 사용하면 간단하게 객체를 생성 가능
*익명 클래스나 내부 클래스는 모두 다른 클래스에서 재사용할 일이 없을 때 생성해야 한다
Nested 클래스의 참조 가능 변수
public class NestedValueReference{
public int publicInt = 1;
protected int protectedInt = 2;
int justInt = 3;
private int privateInt = 4;
static int staticInt = 5;
static class StaticNested{ // static nestec class
public void setValue(){
staticInt = -5;
}
}
class Inner{ // inner class
public void setValue(){
publicInt = -1;
protectedInt = -2;
justInt = -3;
privateInt = -4;
staticInt = -5;
}
}
public void setValue(){
EventListener listener = new EventListener(){ // anonymous class
public void onClick(){
publicInt = -1;
protectedInt = -2;
justInt = -3;
privateInt = -4;
staticInt = -5;
}
};
}
}
*Static Nested 클래스는 부모 클래스의 static 변수만 참조 가능
*내부 클래스와 익명 클래스는 부모 클래스의 어떤 변수라도 참조 가능
*반대의 경우도 가능 → 부모 클래스에서 nested 클래스의 변수 참조 가능(private 이어도)
17장 어노테이션이라는 것도 알아야 한다
어노테이션(Annotation)
클래스나 메소드 등의 선언시에 @을 사용하는 것으로 메타데이터라고도 한다
어노테이션은
- 컴파일러에게 정보를 알려주거나
- 컴파일할 때와 설치(deployment)시의 작업을 지정하거나
- 실행할 때 별도의 처리가 필요할 때
사용하고, 클래스 메소드 변수 등 모든 요소에 선언 가능하다
자바에서 정해져 있는 어노테이션 (JDK 6)
@Override
: 해당 메소드가 부모 클래스에 있는 메소드를 Override했다는 것을 명시적으로 선언
import c.inheritance.Parent;
public class AnnotatinOverride extends Parent{
@Override
public void printName(){
System.out.println("AnnotationOverride");
}
}
*AnnotationOverride 클래스에 printName() 메소드 말고도 많은 메소드가 선언되어 있다면 어떤 메소드가 부모 클래스에 있는 것을 Override했는 지 알아보기 힘들기 때문에 어노테이션으로 선언하면 쉽게 확인 가능
@Deprecated
: 미리 만들어져 있는 클래스나 메소드가 더 이상 사용되지 않는 경우 선언
public class AnnotationDeprecated {
@Deprecated
public void noMoreUse(){ ... }
}
public class AnnotationSample{
public void useDeprecated(){
AnnotationDeprecated child = new AnnotationDeprecated();
child.noMoreUse();
}
}
$ -Xlint:deprecation javac c/annotatin/AnnotationSample.java
c\annotation\AnnotationSample.java:6: warning: [deprecation] noMoreUse() in c.anotation.
*Deprecated된 메소드를 컴파일 할 때 “-Xlint:deprecation”이라는 옵션을 추가해 컴파일하면 noMoreUse()라는 메소드는 deprecated되었으니 조심하라는 경고가 발생
→ “에러”가 아닌 “경고”
@Supress Warnings
: 컴파일 경고를 사용하지 않도록 선언
public class AnnotationSample{
@SupressWarnings("deprecation")
public void useDeprecated(){
AnnotationDeprecated child = new AnnotationDeprecated();
child.noMoreUse();
}
}
*해당 어노테이션을 선언 후 컴파일하면 경고가 나타나지 않음
어노테이션을 선언하기 위한 메타 어노테이션(Meta Annotation)
: 직접 어노테이션을 선언할 때 사용
: java.lang.annotation
@Target
: 어노테이션을 어떤 것에 적용할 지를 선언할 때 사용
@Target(ElementType.METHOD)
@Target({ElementType.METHOD, ElementType.TYPE})
// 괄호 안에 적용 대상을 지정
요소 | 타입대상 |
CONSTRUCTOR | 생성자 선언 시 |
FIELD | enum 상수를 포함한 필드 값 선언 시 |
LOCAL_VARIABLE | 지역 변수 선언 시 |
METHOD | 메소드 선언 시 |
PACKAGE | 패키지 선언 시 |
PARAMETER | 매개 변수 선언 시 |
TYPE | 클래스, 인터페이스, enum 등 선언 시 |
@Retention
: 얼마나 오래 어노테이션 정보가 유지되는 지
@Retention(RetentionPolicy.RUNTIME)
// 괄호 안에 적용 대상을 지정
대상 | |
SOURCE | 어노테이션 정보가 컴파일 시 사라짐 |
CLASS | 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해서 참조 가능하지만 가상 머신에서는 사라짐 |
RUNTIME | 실행시 어노테이션 정보가 가상 머신에 의해서 참조 가능 |
@Documented
: 어노테이션에 대한 정보가 Javadocs(API) 문서에 포함된다는 것을 선언
@Inherited
: 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다는 것을 선언
@Interface
: 어노테이션을 선언할 때 사용
어노테이션 생성 예제
import java.lang.annotation.*;
@Target(ElementType.METHOD) // 이 어노테이션은 메소드에 사용 가능
@Retention(RetentionPolicy.RUNTIME) // 실행 시에 이 어노테이션을 참조
public @interface UserAnnotation{ // @UserAnnotation으로 어노테이션 사용 가능
public int number();
public String text() default "This is first annotation";
// 메소드처럼 어노테이션 안에 선언해 놓으면 어노테이션을 사용할 때 해당 항목에 대한 타입으로 값을 지정 가능
// default 예약어를 사용할 경우, 기본 값 지정 가능
}
// 어노테이션 사용
public clss UserAnnotationSample{
@UserAnnotation(number=0) // number는 default가 없기 때문에 UserAnnotation 선언 시 반드시 값을 지정
public static void main(String args[]){
...
}
@UserAnnotation(number=2, text="second")
public void annotationSample1(){ ... }
*자바의 리플렉션 API를 사용하면 직접 선언하여 사용하는 어노테이션에 대한 정보를 확인 가능
어노테이션 특징
- 어노테이션은 상속이 불가능 → extends 예약어 사용 불가
- 어노테이션 용도
- 제약사항 등을 선언: @Deprecated, @Override, @NotNull
- 용도 표현: @Entity, @TestCase, @WebService
- 행위 표현: @Statefull, @Transaction
- 처리 표현: @Column, @XmlElement
- lombok (롬복)
- https://projectlombok.org/
- @Getter, @Setter
18장 이제 기본 문법은 거의 다 배웠으니 정리해 봅시다
19장 이쯤에서 자바의 역사와 JVM에 대해서 알아보자
JDK (Java Development Kit)
* JDK 1.0 → JDK 1.1
J2SE (Java 2 Standard Edition)
* J2SE 1.2 → J2SE 1.3 → J2SE 1.4 → J2SE 5
Java SE (Java Standard Edition)
* Java SE 6 → Java SE 7 → Java SE 8
JRE (Java Runtime Environment) : 자바를 실행할 수 있는 환경의 집합
Java 특징
- 자바는 “단순하고, 객체지향이며, 친숙”해야 한다 (simple, object-oriented and familiar)
: 다형성, 캡슐화 등 객체지향 언어의 특징들을 지원할 수 있는 구조
: 개발하면서 필요한 여러 기능들은 API를 통해 제공
: 여러 라이브러리를 통해 쉽게 개발할 수 있는 환경 제공
- 자바는 “견고하며, 보안상 안전”하다 (robust and secure)
: 컴파일할 때와 실행할 때 문법적 오류를 체크
: 메모리 관리 모델이 단순
: 분산 환경에서 사용하기 위해 디자인 → 보안 중요
- 자바는 “아키텍처에 중립적이어야 하며 포터블”해야 한다 (architecture-neutral and portable)
: 자바로 작성한 프로그램은 매우 다양한 하드웨어 아키텍처에서 수행 가능
: 아키텍처에 중립적인 바이트 코드를 생성 → 자바의 버전만 동일하다면 동일한 프로그램은 어떤 플랫폼에서도 실행 가능
: 하드웨어와 소프트웨어 아키텍처에 따른 데이터 타입의 호환성에 문제가 발생하지 않음 → JVM
- 자바는 “높은 성능”을 제공해야 한다 (high performance)
: 가비지 컬렉터는 낮은 우선 순위의 쓰레드로 동작하기 때문에 높은 성능 제공
- 자바는 “인터프리트 언어이며, 쓰레드를 제공하고, 동적인 언어”이다 (interpreted, threaded, and dynamic)
: 자바 인터프리터는 자바 바이트 코드를 어떤 장비에서도 수행 가능하도록 제공
: 멀티 쓰레드 환경을 제공하기 때문에 동시에 여러 작업 수행 → 빠른 사용 환경 제공
: 컴파일 시 정적인 점검을 하고 실행 시 동적으로 필요한 프로그램들을 링크
Java 버전별 차이
- JDK 1.0
- JDK 1.1
- AWT(Abstract Window Toolkit)의 이벤트 모델의 확장 및 변경
- 내부 클래스(inner class) 추가
- JavaBeans, JDBC(Java Database Connectivity), RMI(Remote Method Invocation) 등 추가
- JDK 1.2
- strictfp 예약어 추가
- 자바에서 GUI를 제공하기 위한 Swing이 코어 라이브러리에 추가
- JIT(Just-In-TIme)라는 컴파일러가 Sun JVM에 추가
- 자바 플러그인 추가
- CORBA라는 기술과 데이터를 주고받기 위한 IDL 추가
- Collections라는 프레임워크 추가
*JIT : 어떤 메소드의 일부 혹은 전체 코드를 네이티브 코드로 변환하여 JVM에서 번역하지 않도록 함으로써 보다 빠른 성능을 제공하는 기술
- JDK 1.3
- HotSpot JVM 추가
- CORBA와의 호환성을 위해서 RMI 수정
- JavaSound 라이브러리 추가
- JNDI(Java Naming and Directory Interface)가 코어 라이브러리에 추가
- JPDA(Java Platform Debugger Architecture) 추가
- Synthetic 프록시 클래스 추가
*JNDI : 어떤 객체를 쉽게 찾을 수 있도록 도와주는 이름을 지정한 후, 나중에 그 이름으로 객체를 찾아가는 것을 의미
- JDK 1.4
- assert 예약어 추가
- 정규 표현식 추가
- exception chaining을 통해 하위 레벨의 예외의 캡슐화 가능
- IPv6 지원 시작
- NIO(New Input/Output) 이라는 non-blocking 추가
- logging API 추가
- image I/O API 추가
- 통합 XML 파서, JAXP라는 XSLT 프로세서 추가
- JCE, JSSE, JAAS와 같은 통합 보안 및 cryptography extensions 추가
- Java Web Start 추가
- Preferences API (java,.util.prefs) 추가
*정규표현식 : 어떤 문자열에서 특정 조건에 맞는 값이 있는지를 확인하는 데 사용
*NIO : 이전 버전까지의 IO를 처리할 때 사용한 java.io 패키지에서 제공하는 기능의 단점을 보완하기 위한 것으로 성능이 매우 빠름
- Java 5
- generic 추가 → 안전한 컬렉션 데이터 처리
- 어노테이션이라 불리는 메타데이터 기능 추가
- autoboxing과 unboxing 기능 추가
- enum 추가
- varargs 추가 (String … strs)
- 향상된 for 루프 추가
- static import 추가
- concurrent(java.util.concurrent) 패키지 추가
- Scanner 클래스 추가
- Java 6
- 스크립팅 언어가 JVM 위에서 수행 가능
- 각종 코어 기능의 성능 개선
- Compiler API가 추가되어 프로그램에서 자바 컴파일러 실행 가능
- 안정성과 확장성
- Java 7
- 자바의 신[30장 - 31장]
- Java 8
- 람다 표현식 가능
JIT 컴파일러 : 동적 변환
명칭은 컴파일러지만 실행 시에 적용되는 기술
프로그램 실행 방식
- 인터프리트 : 프로그램을 실행할 때마다 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 수행 → 간편하지만 성능이 느림
- 정적 컴파일 : 실행하기 전에 컴퓨터가 알아 들을 수 있는 언어로 변환하는 작업을 미리 수행
- JIT : 인터프리터에 의해서 변환 작업은 지속적으로 수행되지만, 필요한 코드의 정보는 캐시에 담아두었다가 재사용
javac
- javac : java 파일을 바이트 코드로 변환
- JIT 컴파일러 : 바이트 코드를 컴퓨터가 알아 들을 수 있는 언어(기게어)로 변환
JVM과 GC
JVM
- Java Virtural Machine 자바 가상 머신
- 자바 프로그램이 수행되는 프로세스 → 애플리케이션이 수행되면 JVM 위에서 애플리케이션이 동작
- 자바는 JVM이 메모리 관리를 하기 때문에 개발자가 할 필요 없음
GC
- Garbage Collector 가비지 컬렉터
- JVM내에서 메모리 관리를 해줌
- G1을 제외한 나머지 JVM은 영역을 나누어 Heap에 객체들을 관리
- Eden : 객체를 생성하자마자 저장되는 장소
- Young 영역 : Eden + 2개의 Survivor
- Old 영역
- Perm : 클래스나 메소드에 대한 정보가 쌓이는 영역
- Minor GC (Young GC)
(1) Eden 영역에서 객체가 생성
(2) Eden 영역이 꽉 차면 살아있는 객체만 Survivor 영역으로 복사되고, 다시 Eden 영역을 채움
(3) Survivor 영역이 꽉 차게 되면 다른 Survivor 영역으로 객체가 복사되고 Eden 영역에 있는 객체들 중 살아있는 객체들도 다른 Survivor 영역으로 복사 → S0 S1 둘 중 하나는 비어있음 - Magor GC (Full GC)
(1) 오래 살아있는 객체들은 Old 영역으로 이동
(2) 지속적으로 이동하다가 Old 영역이 꽉차면 GC가 발생
20장 가장 많이 쓰는 패키지는 자바랭
java.lang 패키지
: java.lang 패키지에 있는 클래스들을 자바의 패키지 중 유일하게 import를 안해도 사용 가능
언어 관련 기본
타입 | 항목 |
인터페이스 | Cloneable, Comparable, Iterable, Readable |
클래스 | Class, ClassLoader, Compiler, Enum, Object, Package, SecurityManager, StackTraceElement, System, Void |
예외 및 에러 | ArrayIndexOutOfBoundsException, ArrayStoreException, ClassCastException, ClassNotFoundException, CloneNotSupportedException, EnumConstantNotPresentException, IllegalAccessException, IllegalArgumentException, IndexOutOfBoundsException, InstantiationException, NegativeArraySizeException, NoSuchFieldException, NoSuchMethodException, NullPointerException, RuntimeException, SecurityException, TypeNotPresentException, UnsupportedOperationException |
문자열 관련
타입 | 항목 |
인터페이스 | Appendable, CharSequence |
클래스 | String, StringBuffer, StringBuilder |
예외 및 에러 | StringIndexOutOfBoundsException |
기본 자료형 및 숫자 관련
타입 | 항목 |
클래스 | Boolean, Byte, Character, Character.Subset, Character.UnicodeBlock, Double, Float, Integer, Long, Math, Number, Short, StrictMath |
예외 및 에러 | ArithmeticException, NumberFormatException |
쓰레드 관련
타입 | 항목 |
인터페이스 | Runnable, Thread.UncaughtExceptionHandler |
클래스 | InheritableThreadLocal, Thread, ThreadGroup, ThreadLocal, Thread.State |
예외 및 에러 | IllegalMonitorStateException, IllegalThreadStateException, InterruptedException |
예외 관련
타입 | 항목 |
클래스 | Throwable |
예외 및 에러 | Exception |
런타임 관련
타입 | 항목 |
클래스 | Process, ProcessBuilder, Runtime, RuntimePermission |
예외 및 에러 | IllegalStateException |
에러
- OutOfMemoryError(OOME) : 메모리가 부족하여 발생하는 에러
- StackOverflowError: 호출된 메소드의 깊이가 너무 깊을 때 발생하는 에러
기본 자료형 타입의 클래스
- Byte
- Short
- Integer
- Long
- Float
- Double
- Character
- Boolean
*Wrapper Class : Byte, Short, Integer, Long, Float, Double
→ Number라는 abstract 클래스를 확장
→ 겉으로 보기에는 참조 자료형이지만 기본 자료형처럼 사용 가능 (자바 컴파일러에서 자동으로 형변환)
Q>숫자를 처리하는 참조 자료형을 만든 이유
A>
- 매개 변수를 참조 자료형으로만 받는 메소드를 처리하기 위해
- 제네릭과 같이 기본 자료형을 사용하지 않는 기능을 사용하기 위해
- MIN_VALUE나 MAX_VALUE와 같이 클래스에 선언된 상수 값을 사용하기 위해
- 문자열을 숫자로, 숫자를 문자열로 수비게 변환하고, 2/8/10/16진수 변환을 쉽게 처리하기 위해
메소드
- parse타입이름() : 기본 자료형을 리턴, Character 클래스는 제외
- valueOf() : 참조 자료형을 리턴, Character 클래스는 제외
public void numberTypeCheck(){
String value1 = "3";
String value2 = "5";
byte byte1 = Byte.parseByte(value1); // byte로 변환
byte byte2 = Byte.parseByte(value2);
System.out.println(byte1+byte2);
Integer refInt1 = Integer.valueOf(value1); // integer로 변환
Integer refInt2 = Integer.valueOf(value2);
System.out.println(refInt1+refInt2+"7"); // refInt1+refInt2는 숫자처럼 계산
}
// 결과
8
87
*parse타입이름()과 valueOf()는 모두 static 메소드 → 타입의 객체를 생성할 필요 없이 바로 사용 가능
상수
- MIN_VALUE : 최소값, Boolean 클래스 제외
- MAX_VALUE : 최대값, Boolean 클래스 제외
System.out.println(Byte.MIN_VALUE + ", " + Byte.MAX_VALUE);
System.out.println(Integer.toBinaryString(Integer.MIN_VALUE) + ", " + Integer.toBinaryString(INTEGER.MAX_VALUE));
//결과
-128, 127
10000000000000000000000000000000
1111111111111111111111111111111
*toBinaryString() : 2진수로 변환
*toHexString() : 16진수로 변환
System 클래스
: 생성자가 없다
System 클래스의 메소드
(1) 시스템 속성(Property)값 관리
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static String | clearProperty(String key) | key에 지정된 시스템 속성을 제거 |
static Properties | getProperties() | 현재 시스템 속성을 Properties 클래스 형태로 제공 |
static String | getProperty(String key) | key에 지정된 문자열로 된 시스템 속성값(value)를 얻음 |
static String | getProperty(String key, String def) | key에 지정된 문자열로 된 시스템 속성값을 얻고, 만약 없으면 def에 지정된 값을 리턴 |
static void | setProperties(Properties props) | Properties 타입으로 넘겨주는 매개 변수에 있는 값들을 시스템 속성에 넣음 |
static String | setProperty(String key, String value) | key에 지정된 시스템 속성의 값을 value로 대체 |
*java.util.Properties
: Hashtable의 상속을 받은 클래스로 자바 프로그램을 실행하면 Properties 객체가 생성되며, 그 값은 언제 어디서든 같은 JVM내에서는 꺼내서 사용 가능하다
System.out.println(System.getPropert("java.version")); // java-version이라는 키에 잆는 값을 출력
//결과
java.version=1.8.0_92
(2) 시스템 환경(Environment) 값 조회
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static Map<String, String> | getenv() | 현재 시스템 환경에 대한 Map형태의 리턴값을 받는다 |
static String | getenv(String name) | 지정한 name에 해당하는 값을 받는다 |
*read만 가능
System.out.println(System.getenv("JAVA_HOME")); // JAVA_HOME이라는 JDK가 설치되어 있는 경로 출력
//결과
JAVA_HOME=C:\jdk1.8.92
(3) GC 수행
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static void | gc() | 가비지 컬렉터를 실행 |
static void | runFinalization() | GC처리를 기다리는 모든 객체에 대해 finalize() 메소드를 실행 |
*사용하지 말기
자바는 메모리 처리를 개발자가 별도로 수행하지 않고 JVM이 알아서 더 이상 필요 없는 객체를 처리하는 GC작업과 finalization 작업을 실행
(4) JVM 종료
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static void | exit(int status) | 현재 수행중인 JVM을 종료 |
*사용하지 말기
(5) 현재 시간 조회
리턴 타입 | 메소드 이름 및 매개 변수 | 설명 |
static long | currentTimeMillis() | 현재 시간을 밀리초 단위로 리턴 |
static long | nanoTime() | 현재 시간을 나노초 단위로 리턴 |
*밀리초 : 1/1000초, 1000ms = 1s (현재 시간을 확인)
*나노초 : 1/1,000,000,000초 (시간 측정)
System 클래스의 static 변수
선언 및 리턴 타입 | 변수명 | 설명 |
static PrintStream | err | 에러 및 오류를 출력할 때 사용 |
static InputStream | in | 입력값을 처리할 때 사용 |
static PrintStream | out | 출력값을 처리할 때 사용 |
* System.out.println()
- System : 클래스 이름
- out : static으로 선언된 변수 이름 (PrintStream 타입)
- println() : PrintStream 클래스에 선언된 static 메소드
- 모두 static으로 선언되어 있기 때문에 별도의 클래스 객체를 생성할 필요 없이 사용 가능
- 출력과 관련된 메소드는 java.io.PrintStream 클래스에서 찾아야 함(System 클래스가 아니라)
System.out
- PrintStream 클래스의 출력을 위한 메소드
(1) print() : 매개변수에 있는 내용들을 줄바꿈하지 않고 출력
(2) println() : 매개변수에 있는 내용들을 출력하고 줄바꿈
(3) format()
(4) printf()
(5) write() - print(), println()의 매개 변수
print(boolean b) | print(char c) | print(char[] s) | print(doubld d) | print(float f) |
print(int i) | print(long l) | print(Object obj) | print(String s) |
println(boolean b) | println(char c) | println(char[] s) | println(doubld d) | println(float f) |
priprintln(int i) | println(long l) | println(Object obj) | println(String s) | println() |
- null 객체 출력
*null 객체를 toString()으로 출력하면 예외 발생 (NullPointerException)
*valueOf() 메소드를 사용하여 출력하는 것이 훨씬 안전
'STUDY > Java' 카테고리의 다른 글
<자바의 신> 25장 쓰레드는 개발자라면 알아두는 것이 좋아요 (0) | 2023.12.09 |
---|---|
<자바의 신> 21장 실수를 방지하기 위한 제네릭이라는 것도 있어요 (0) | 2023.12.09 |
<자바의 신> 11장 매번 만들기 귀찮은데 누가 만들어 놓은 거 쓸 수 없나요? (0) | 2023.12.09 |
<자바의 신> 6장 제가 조건을 좀 따져요 (0) | 2023.12.09 |
<자바의 신> 1장 프로그래밍이란 무엇인가? (0) | 2023.12.09 |