본문 바로가기

Programming/Java

[Java] 김영한의 자바 중급 1편 #4 - 래퍼 클래스

반응형

 

김영한 선생님의 자바 중급을 듣고 정리한 내용입니다.

 

 

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

 

 

반응형