본문 바로가기

언어 기초/JAVA

래퍼, Class클래스 [JAVA | 학습을 위한 자료 | 김영한 자바 중급 1편]

 

 

기본형의 한계

 

 



자바 안에 객체가 아닌 것이 있다.

바로  int, double 같은 기본형(Primitive Type)이다.

 

기본형은 객체가 아니기 때문에 다음과 같은 한계가 있다.

  • 객체가 아님**: 기본형 데이터는 객체가 아니기 때문에, 객체 지향 프로그래밍의 장점을 살릴 수 없다. 예를 들어 객 체는 유용한 메서드를 제공할 수 있는데, 기본형은 객체가 아니므로 메서드를 제공할 수 없다.
    -추가로 객체 참조가 필요한 컬렉션 프레임워크를 사용할 수 없다. 그리고 제네릭도 사용할 수 없다.
  • ull 값을 가질 수 없음: 기본형 데이터 타입은 `null` 값을 가질 수 없다. 때로는 데이터가 `없음` 이라는 상태를 나 타내야 할 필요가 있는데, 기본형은 항상 값을 가지기 때문에 이런 표현을 할 수 없다.
 

 

 

 


래퍼 클래스

 

 



자바는 기본형에 대응하는 래퍼 클래스를 기본으로 제공한다.

`Byte` `Short` `Integer` `Long` `Float`

`Double` `Character`Boolean`

그리고 자바가 제공하는 기본 래퍼 클래스는 다음과 같은 특징을 가지고 있다.

  • 불변이다.
  • equals 로 비교해야 한다.

래퍼 클래스 생성 - 박싱(Boxing)
기본형을 래퍼 클래스로 변경하는 것을 마치 박스에 물건을 넣은 것 같다고 해서 박싱(Boxing)이라 한다.

  • new Integer(10)은 직접 사용하면 안된다. 작동은 하지만, 향후 자바에서 제거될 예정이다.
  • 대신에 `Integer.valueOf(10)` 를 사용하면 된다.
    내부에서 `new Integer(10)` 을 사용해서 객체를 생성하고 돌려준다.
  • 추가로 `Integer.valueOf()` 에는 성능 최적화 기능이 있다. 개발자들이 일반적으로 자주 사용하는 -128 ~ 127 범위의 `Integer` 클래스를 미리 생성해준다. 해당 범위의 값을 조회하면 미리 생성된 `Integer` 객체를 반 환한다. 해당 범위의 값이 없으면 `new Integer()` 를 호출한다.
  • 마치 문자열 풀과 비슷하게 자주 사용하는 숫자를 미리 생성해두고 재사용한다.
  • 참고로 이런 최적화 방식은 미래에 더 나은 방식으로 변경될 수 있다.

intValue() - 언박싱(Unboxing)

  • 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다.
  • 박스에 들어있는 물건을 꺼내는 것 같다고 해서 **언박싱(Unboxing)**이라 한다.

비교는 equals() 사용

  • 래퍼 클래스는 객체이기 때문에 `==` 비교를 하면 인스턴스의 참조값을 비교한다.
  • 래퍼 클래스는 내부의 값을 비교하도록 `equals()` 를 재정의 해두었다. 따라서 값을 비교하려면 `equals()` 를 사용해야 한다.
 

 

 

 


주요 메서드

 

 



자바는 기본형에 대응하는 래퍼 클래스를 기본으로 제공한다.

`Byte` `Short` `Integer` `Long` `Float`

`Double` `Character`Boolean`

그리고 자바가 제공하는 기본 래퍼 클래스는 다음과 같은 특징을 가지고 있다.

  • 불변이다.
  • equals 로 비교해야 한다.

래퍼 클래스 생성 - 박싱(Boxing)
기본형을 래퍼 클래스로 변경하는 것을 마치 박스에 물건을 넣은 것 같다고 해서 박싱(Boxing)이라 한다.

  • new Integer(10)은 직접 사용하면 안된다. 작동은 하지만, 향후 자바에서 제거될 예정이다.
  • 대신에 `Integer.valueOf(10)` 를 사용하면 된다.
    내부에서 `new Integer(10)` 을 사용해서 객체를 생성하고 돌려준다.
  • 추가로 `Integer.valueOf()` 에는 성능 최적화 기능이 있다. 개발자들이 일반적으로 자주 사용하는 -128 ~ 127 범위의 `Integer` 클래스를 미리 생성해준다. 해당 범위의 값을 조회하면 미리 생성된 `Integer` 객체를 반 환한다. 해당 범위의 값이 없으면 `new Integer()` 를 호출한다.
  • 마치 문자열 풀과 비슷하게 자주 사용하는 숫자를 미리 생성해두고 재사용한다.
  • 참고로 이런 최적화 방식은 미래에 더 나은 방식으로 변경될 수 있다.

intValue() - 언박싱(Unboxing)

  • 래퍼 클래스에 들어있는 기본형 값을 다시 꺼내는 메서드이다.
  • 박스에 들어있는 물건을 꺼내는 것 같다고 해서 **언박싱(Unboxing)**이라 한다.

비교는 equals() 사용

  • 래퍼 클래스는 객체이기 때문에 `==` 비교를 하면 인스턴스의 참조값을 비교한다.
  • 래퍼 클래스는 내부의 값을 비교하도록 `equals()` 를 재정의 해두었다. 따라서 값을 비교하려면 `equals()` 를 사용해야 한다.

주요 메서드

  • valueOf()` : 래퍼 타입을 반환한다. 숫자, 문자열을 모두 지원한다.
  • parseInt()` : 문자열을 기본형으로 변환한다.
  • compareTo()` :내값과인수로넘어온값을비교한다.내값이크면 `1` ,같으면 `0` ,내값이작으면 `-1` 을 반환 한다.
  • Integer.sum()` , `Integer.min()` , `Integer.max()` : `static` 메서드이다. 간단한 덧셈, 작은 값, 큰 값 연산을 수행한다.

parseInt() vs valueOf()
원하는 타입에 맞는 메서드를 사용하면 된다.

  • valueOf("10") 는 래퍼 타입을 반환한다.
  • parseInt("10") 는 기본형을 반환한다.
    Long.parseLong() 처럼 각 타입에 parseXxx() 가 존재한다.
 

 

 


Class 클래스

 

 

 
 

리플렉션 - reflection

`Class` 를 사용하면 클래스의 메타 정보를 기반으로 클래스에 정의된 메서드, 필드, 생성자 등을 조회하고, 이들을 통해

객체 인스턴스를 생성하거나 메서드를 호출하는 작업을 할 수 있다. 이런 작업을 리플렉션이라 한다. 추가로 애노테이션 정보를 읽어서 특별한 기능을 수행할 수 도 있다. 최신 프레임워크들은 이런 기능을 적극 활용한다.
지금은 `Class` 가 뭔지, 그리고 대략 어떤 기능들을 제공하는지만 알아두면 충분하다. 지금은 리플렉션을 학습하는 것 보다 훨씬 더 중요한 기본기들을 학습해야 한다. 리플렉션은 이후에 별도로 다룬다.

 

 

 


문제와 풀이

 문제 - 로또 번호 자동 생성기

문제 설명

  • 로또 번호를 자동으로 만들어주는 자동 생성기를 만들자 로또 번호는 1~45 사이의 숫자를 6개 뽑아야 한다.
  • 각 숫자는 중복되면 안된다.
  • 실행할 때 마다 결과가 달라야 한다.

실행 결과

로또 번호: 11 19 21 35 29 16