김영한 선생님의 자바 중급을 듣고 정리한 내용입니다.
1. 기본형의 한계
- int, double 같은 기본형(Primitive Type)들은 객체가 아니다.
- 자바는 객체 지향 언어이다.
→ 서로 뭔가 맞지 않다. 자바는 객체 지향 언어인데 int, double 같은 것들은 Primitive Type이기 때문에 객체가 아니다.
따라서 다음의 한계들이 존재한다.
- 객체가 아니다. 따라서 객체 지향 프로그래밍의 장점을 살릴 수 없다.
- null 값을 가질 수 없다. 때로는 데이터가 없음을 나타내기 위해 null을 사용해야할 수 있는데 기본형은 항상 값을 가져야하기 때문에 이런 표현을 할 수 없다.
2. 래퍼 클래스
래퍼 클래스는 뭔가를 감싼 클래스이다.
기본형들도 이 래퍼 클래스를 통해 더 편리하게 사용할 수 있게 된다.
자바는 기본형에 대응하는 래퍼 클래스들을 기본으로 제공한다.
- byte → Byte
- short → Short
- int → Integer
- long → Long
- float → Float
- double → Double
- char → Character
- boolean → Boolean
2.1. 래퍼 클래스 사용법
래퍼 클래스 생성 - 박싱(Boxing)
- 기본형을 래퍼 클래스로 변경하는 것은 마치 박스에 물건을 넣는 것 같다고 하여 박싱이라고 함
- new Integer(10)은 추후 자바에서 제거될 예정이다.
- 대신에 Integer.valueOf(10)을 사용하면 되고, 내부적으로 new Integer(10)을 사용해서 객체를 생성하고 돌려준다.
intValue() - 언박싱(Unboxing)
- 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다.
== 대신 equals()
- 래퍼 클래스는 객체이기 때문에 == 비교를 하면 인스턴스의 참조값을 비교한다.
- 래퍼 클래스는 내부의 값을 비교하도록 **equals()**를 재정의 해두었다. 따라서 값을 비교하려면 equals()를 사용해야 한다.
- 래퍼 클래스는 객체를 그대로 출력해도 내부에 있는 값을 문자로 출력하도록 toString()을 오버라이딩했다.
3. 오토 박싱
- 박싱 : valueOf()
- 언박싱 : xxxValue() → ex. doubleValue(), intValue()
→ 매번 valueOf(), xxxValue() 메서드를 호출해서 기본형을 래퍼 클래스로 변환하거나 래퍼 클래스를 기본형으로 변환하는 작업이 번거로울 수 있다.
→ 따라서 자바 1.5부터는 오토 박싱, 오토 언박싱이라는 것을 지원하게 된다.
3.1. 오토 박싱, 오토 언박싱
오토 박싱 : 컴파일러가 개발자 대신 valueOf() 메서드를 호출하여 기본형을 래퍼 클래스로 변환
오토 언박싱 : 컴파일러가 개발자 대신 xxxValue() 메서드를 호출하여 래퍼 클래스를 기본형으로 변환
4. 래퍼 클래스의 주요 메서드와 성능
- valueOf() : 래퍼 타입을 반환한다. 숫자, 문자열을 모두 지원한다.
- parseInt() : 문자열을 기본형으로 변환한다.
- compareTo() : 내 값과 인수로 넘어온 값을 비교한다. 내 값이 크면 1 , 같으면 0 , 내 값이 작으면 -1을 반환한다.
- Integer.sum() , Integer.min() , Integer.max() : Static 메서드이다. 간단한 덧셈, 작은 값, 큰 값 연산을 수행한다.
5. Class 클래스
Class 클래스는 클래스의 메타데이터들을 다루는데 사용된다.
주요 기능들은 다음과 같다.
- 타입 정보 얻기 : 클래스의 이름, 슈퍼클래스, 인터페이스, 접근 제한자 등 정보 조회
- 리플렉션 : 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 등의 작업을 할 수 있다.
- 동적 로딩과 생성 : Class.forName() 메서드를 사용하여 클래스를 동적으로 로드하고, newInstance() 메서드를 통해 새로운 인스턴스를 생성할 수 있다.
- 애노테이션 처리 : 클래스에 적용된 애노테이션을 조회하고 처리하는 기능을 제공한다.
[1] Class 조회
Class 클래스를 통해 다음의 3가지 방법으로 Class를 조회할 수 있다.
- Class clazz = String.class;
→ 클래스에서 바로 조회
- Class clazz = new String().getClass();
→ 인스턴스로부터 조회
- Class clazz = Class.forName(”java.lang.String”);
→ 문자열로 조회
[2] 모든 필드 출력
getDeclaredFields() 메서드를 통해 클래스의 모든 필드를 조회한다.
[3] 모든 메서드 조회
getDeclaredMethods() 메서드를 통해 클래스의 모든 메서드를 조회한다.
[4] 상위 클래스 정보 출력
getSuperclass() 메서드를 통해 부모 클래스를 조회한다.
[5] 클래스의 인터페이스들을 조회
getInterfaces() 메서드를 통해 클래스의 인터페이스들을 조회한다.
5.1. Class 생성하기
Class 클래스에는 클래스의 모든 정보가 들어있다. 따라서 이 정보를 기반으로 인스턴스를 생성하거나, 메서드를 호출하거나, 필드의 값을 변경할 수 있다.
> Reflection ?
Class를 사용하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해 객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다.
이런 작업을 리플렉션이라고 한다.
추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수도 있음
6. System 클래스
System 클래스는 시스템과 관련된 기본 기능들을 제공한다.
- 표준 입력, 출력, 오류 스트림 : System.in, System.out, System.err
- 시간 측정 : System.currentTimeMillis(), System.nanoTime()
- 환경 변수 : System.getenv()
- 시스템 속성 : System.getProperties()
- 시스템 종료 : System.exit(int status)
- 배열 고속 복사 : System.arraycopy
'Programming > Java' 카테고리의 다른 글
[Java] 김영한의 자바 중급 1편 #6 - 날짜와 시간 라이브러리 (0) | 2024.09.30 |
---|---|
[Java] 김영한의 자바 중급 1편 #5 - ENUM (0) | 2024.09.30 |
[Java] 김영한의 자바 중급 1편 #3 - String 클래스 (0) | 2024.09.10 |
[Java] 김영한의 자바 중급 1편 #2 - 불변 객체 (0) | 2024.09.06 |
[Java] 김영한의 자바 중급 1편 #1 - Object 클래스 (0) | 2024.09.03 |