본문으로 바로가기

Wrapper클래스 활용

category Java언어 2018. 7. 10. 20:18

 

Wrapper클래스는 기본타입을 객체로 포장하는 역활을 합니다.

이게 대체 왜 필요할까요?

 

어떤 method를 호출하고 싶을때 매개변수로 int(정수) 또는 float(실수)의 기본타입을 주고 싶지만

객체만을 인자로 받도록 정의 되어 있을 경우 우리는 Wrapper클래스를 이용하여 이 기본타입을 객체로 포장하여 인자로 줄 수 있습니다.

 

실제로 Wrapper클래스라는 이름의 클래스는 존재하지 않습니다. 기본타입의 데이터를 객체로 만들어주는 기능을하는 클래스를 총칭해서 Wrapper클래스라고 부릅니다. 각 기본타입은 제각각의 Wrapper클래스를 가지고 있습니다. 보통 기본타입명과 같은 이름의 클래스명을 가지지만, int타입과 char타입은 클래스명이 조금 다릅니다.

int : Integer

char : Character

 

자 그럼 코딩을 시작하겠습니다.

 

성적 계산을 하는 프로그램을 작성하는데 모든 변수를 String클래스의 객체로 받아 보겠습니다.

 

변수는 배열을 참조하는 reference변수로 stack영역에 생성됩니다.

 

Scanner클래스의 next메소드로 입력받아 이름,국영수점수, 합계 평균에 해당하는 기본타입의 데이터를 String타입의 객체로 boxing하여 각각의 reference변수로 생성한 객체를 참조 시키겠습니다.

 

실행을 해보겠습니다.

 

NumberFormatException이라고 뜨네요. 뭔말인지 모르겠네요. 숫자 포멧 예외 : 값이없다?

하하 그래서 구글링을 해보았습니다.

You're getting a NumberFormatException when trying to convert the empty string "" into an Integer...

?? 번역기를 돌리겠습니다.

빈 문자열을 Integer로 변환하려고하면 NumberFormatException이 발생합니다.

 

아! 빈문자열이 라네요.

 

보통 기본타입을 변수로 잡고 연산을 할때 

sum = sum+score1 이런식으로 차례차례 더해갑니다.

이때 sum을 0으로 반드시 초기화 해줘야하죠.

그렇지 않으면 쓰레기 값이 들어가 있기 때문에 쓰레기값과 연산을하여 쓰레기 값이 나오기 때문입니다.

 

Q

그런데 heap영역에서 동적으로 메모리를 할당하게 되면 자동으로 0으로 초기화를 시켜줍니다.

그렇기 때문에 따로 초기화를 하지않았죠. 그러면 도대체 뭐가 문제일까요..

아마 정수나 실수는 0으로 초기화가 될테지만 문자열이기 때문에 초기화가 되지않은 것이 아닐까요?

그렇다면 문자열은 NULL로 초기화가 되서 int형으로 outboxing을하면 int타입이 나와야하는거 아닌가?(null과0은 같은것아닌가?)

 

heap영역에서는 0으로 초기화된다는 것이 객체가 가진 인스턴스 필드를 객체생성시 초기화 해준다는 말일까요?

 

위의 두 의문이 생겼지만 어떻든 간에 일단 에러가 난 이유는 아직 아무런 객체도 참조하지않는 참조변수를 매개값으로 전달했기때문입니다.

sum에 해당하는 score[i][3]은 아직 아무것도 참조하지 않고 있기때문에 그냥 reference배열입니다.

 

그렇다면 score[i][3]reference배열을 밖의 for문에서 초기화 시켜보니 해결이 되었네요.

 

 

'Java언어' 카테고리의 다른 글

Thread란?  (1) 2018.08.16
OOP 란?  (0) 2018.08.16
class의 구성  (0) 2018.07.10
Java에서 단일 문자열 입력  (0) 2018.07.10
next() vs nextLine()  (2) 2018.07.06