래퍼 클래스
- 자바에서 객체가 아닌 것은 기본형이다.
- 객체가 아니기에 객체 지향 프로그래밍의 장점을 살릴 수 없다.
유용한 메소드를 제공하지 못하고 컬렉션 프레임워크, 제네릭 등을 사용할 수 없다. - 항상 값이 존재해야하기 때문에 null 값을 가질 수 없다.
ex) 기본형인 경우 값을 찾아서 반환해야하는 메소드에서 값을 찾지 못한 경우에도 null이 아닌 무조건 값을 리턴해야하지만 객체인 경우 명확하게 null을 리턴해줄 수 있다.
- 객체가 아니기에 객체 지향 프로그래밍의 장점을 살릴 수 없다.
- 래퍼 클래스(Wrapper class) : 특정 기본형을 감싸서 만드는 클래스
- 래퍼 클래스는 기본형의 객체 버전이다.
- 보통 기본형 앞 글자를 대문자로 바꿔서 래퍼 클래스를 기본으로 제공한다.
- 예외) int - Integer / char - Character
- 제공하는 기본 래퍼 클래스는 모두 불변이며 equals()로 비교해야한다.
- 예외적으로 Integer 클래스 같은 경우에 valueOf()로 값을 지정 시 -128 ~ 127까지의 자주 사용하는 숫자들을 미리 인스턴스에 생성해두고 재사용한다.
그렇기 때문에 valueOf()로 생성한 객체의 값이 같은 경우 같은 인스턴스를 참조하고 있기에 == 동일성 비교 시 참조 값이 서로 같다.
- 예외적으로 Integer 클래스 같은 경우에 valueOf()로 값을 지정 시 -128 ~ 127까지의 자주 사용하는 숫자들을 미리 인스턴스에 생성해두고 재사용한다.
- 래퍼 클래스 생성 - 박싱(Boxing)
- 기본형을 래퍼 클래스로 변경하는 것을 박스에 물건을 넣은 것 같다고 해서 박싱이라고 한다.
- new 생성자에 값을 직접 지정하는 방식은 Deprecated 됐기에 사용하지말고 valueOf()를 사용해야 한다.
- 언박싱(Unboxing)
- intValue()와 같이 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메소드다.
- 박스에 있는 물건을 꺼내는 것 같다고 해서 언박싱이라고 한다.
- 래퍼 클래스 - 오토 박싱
- 래퍼 클래스를 자주 사용하다보니 오토 박싱 / 언박싱 기능을 제공한다.
- 오토 박싱과 오토 언박싱은 컴파일러가 개발자 대신 박싱 - valueOf(), 언박싱 - xxxValue()등의 코드를 추가해주는 기능이다.
- 래퍼 클래스를 자주 사용하다보니 오토 박싱 / 언박싱 기능을 제공한다.
Integer integer1 = Integer.valueOf("10");
int num = Integer.parseInt("10");
- 문자열 변환
- valueOf()는 래퍼 타입을 반환한다.
- parseXxx()는 기본형을 반환한다.
- 기본형 vs 래퍼 클래스
- 기본형은 메모리에서 단순히 그 크기의 공간만큼을 차지한다. (int는 4byte)
- 래퍼 클래스는 인스턴스 내부의 필드, 객체 메타 데이터등을 포함해 더 많은 메모리를 사용한다. (대략 8~16byte)
- 하지만 성능 면에서보면 CPU 연산을 아주 많이 수행하는 특수한 경우가 아닌 일반적인 경우에서는 코드를 유지보수하기 더 쉬운 것을 선택해서 사용하면 된다.
- 유지보수 vs 최적화
- 보통 유지보수와 최적화 중 고려해야하는 상황이라면 유지보수하기 좋은 코드가 더 중요하다.
- 먼저 유지보수 하기 좋은 코드로 개발을 하고 이후 성능 테스트를 통해 정말 필요한 부분만 찾아서 최적화하는 것이 가장 좋다.
Class 클래스
- Class 클래스 : 클래스의 정보(메타 데이터)를 다루는데 사용한다.
- 타입 정보 얻기 - 클래스명, 슈퍼클래스, 접근 제한자, 인터페이스 등의 정보를 조회할 수 있다.
- 리플렉션 - 정의된 메소드, 필드, 생성자를 조회하고 인스턴스를 생성하거나 메소드를 호출할 수 있다.
- 동적 로딩과 생성 - Class.forName()를 사용해 클래스를 동적으로 로드하고 newInstance()로 새로운 인스턴스를 생성할 수 있다.
- 어노테이션 처리 - 클래스에 적용된 어노테이션을 조회하고 처리하는 기능을 제공한다.
- class는 자바 예약어이기에 패키지명, 변수명으로 사용할 수 없다.
- class 대신 clazz라는 이름을 관행으로 사용한다.
- Class 클래스의 주요 기능
- getDeclaredFields() : 클래스의 모든 필드 조회
- getDeclaredMethods() : 클래스의 모든 메소드 조회
- getSuperClass() : 클래스의 부모 클래스 조회
- getInterfaces() : 클래스의 인터페이스들을 조회
//동적 객체 생성
Class helloClass = Class.forName("lang.clazz.Hello");
Hello hello = (Hello) helloClass.getDeclaredConstructor().newInstance();
- Class 클래스를 통해 동적으로 객체 생성이 가능하다.
- getDeclaredConstructor() : 생성자를 선택
- newInstance() : 선택된 생성자를 기반으로 인스턴스 생성
리플렉션 (reflection) : Class를 사용해 클래스 메타 정보를 기반으로 클래스에 정의된 메소드, 필드, 생성자를 조회하고 이를 통해 객체 인스턴스를 생성하거나 메소드를 호출하는 작업.
System 클래스
- System 클래스의 기능
- 표준 입력, 출력, 오류 스트림 - System.in, System.out, System.err
- 시간 측정 - System.currentTimeMillis(), System.nanoTime()
- 환경 변수 - System.getenv(), OS에서 설정한 변수 값을 얻을 수 있다.
- 시스템 속성 - System.getProperties(), 자바에서 설정한 설정한 변수 값을 얻을 수 있다.
- 시스템 종료 - System.exit(), 프로그램이 의도치 않게 종료될 수 있기 때문에 가급적 사용을 지양하는 것이 좋다.
- 배열 고속 복사 - System.arraycopy(), 일반적으로 반복문을 사용해서 배열을 복사하는 것보다 훨씬 빠른 성능을 제공한다.
Math, Random 클래스
- Math 클래스 기능
- 기본 연산
- 지수 및 로그 연산
- 반올림 및 정밀도
- 삼각 함수
- 아주 정밀한 숫자, 반올림 계산이 필요할 때는 BigDecimal 클래스 사용
- 랜덤 값을 구하는 경우에는 Math.random()을 사용해도 되지만 Random 클래스를 사용하면 더욱 다양한 랜덤 값을 구할 수 있다.
- Math.random()도 내부에서는 Random 클래스를 사용한다.
- 랜덤은 내부에서 씨드(Seed) 값을 사용해서 랜덤 값을 구한다.
- 씨드 값이 같으면 항상 같은 결과가 나온다.
- new Random() 생성자를 비워두면 자동으로 씨드 값을 생성 (반복 실행해도 결과가 항상 다르다.)
- new Random(int seed) 생성자에 씨드 값을 전달하는 경우 반복 실행하면 같은 결과가 항상 나온다.
출처: [인프런 김영한 실전 자바 - 중급편]
김영한의 실전 자바 - 중급 1편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을
www.inflearn.com
'Java > [인프런 김영한 실전 자바 - 중급편]' 카테고리의 다른 글
[인프런 김영한 실전 자바 - 중급편] 날짜와 시간 (1) | 2024.07.21 |
---|---|
[인프런 김영한 실전 자바 - 중급편] 열거형 - ENUM (0) | 2024.07.19 |
[인프런 김영한 실전 자바 - 중급편] String 클래스 (3) | 2024.07.18 |
[인프런 김영한 실전 자바 -중급편] 불변 객체 (0) | 2024.07.18 |
[인프런 김영한 실전 자바 - 중급편] Object 클래스 (1) | 2024.07.18 |