Java (자바)

[Java] 변수 타입 확인하기 / 자료형 구분하기 / String int

Oscar:) 2022. 10. 5. 19:21

 

코드를 작성하다보면, 많은 데이터를 관리하게 된다.

 

데이터를 생성·삭제하거나, 보내고 받기도 한다.

하나의 데이터를 다른 타입으로 변환시켜서 여러 곳에서 사용하기도 한다.

 

그 과정에서 종종 데이터 타입에 대한 문제를 맞이하기도 한다.

 

 

이번 포스팅에서는, 변수의 타입을 확인하는 방법에 대해 알아보자.

 

 


 

 

가장 빈번하게 타입을 혼동하는 케이스는 문자열(String)과 정수 타입(int)이다.

	String s = "123";
	int i = 123;
		
	// 위에서 생성한 변수 출력.
	System.out.println(s);
	System.out.println(i);

 

문자열 변수 s와, 정수 타입 변수 i를 생성하고 출력해 보았다.

 

출력 결과는 다음과 같다.

 

분명히 다른 타입의 변수인데도,

출력된 데이터만을 볼 때는 다른 점을 찾을 수 없다.

 

위처럼 결과 데이터만을 확인하고 다른 작업을 이어갈 때도,

종종 타입 불일치 에러를 만나곤 했다.

 

 

이제 해당 변수의 타입을 확인하는 방법을 알아보겠다.

 

 


 

변수 초기화로 확인하기

 

가장 기초적인 방법이며, 코드를 작성할 때 에러를 표시해주기 때문에

프로그램 실행 전에 문제를 파악할 수 있다.

 

해당 변수에 값을 담기 전에, 담을 수 있는지 없는지를 확인하기 때문이다.

 

 

위 사진 처럼, String 타입에 대입된 값을 int 타입에 대입하면 에러가 표시된다.

에러 명은 "Type mismatch(=타입 불일치)" 이다.

 

 

정말 기초적인 부분이라서, 타입을 확인하는 방법으로 보기 어려울 수 있다.

 

하지만 어디선가 받아온 데이터를 여기저기 초기화 해보는 것도,

원시적인 방법 중 하나가 될 수 있다고 생각한다.

 

 

그리고, 어차피 타입에 대한 대부분의 문제는 초기화 단계에서 발생하지 않는다.

 

여기저기서 받아온 데이터를 다룰 때, 또는 코드가 깊어졌을 때

혼동이 생기기 마련이다.

 

그럴 때는, 메서드를 사용하여 해당 데이터의 타입을 확인해볼 수 있다.

 

 


 

타입 확인 메서드 사용하기

 

도입부에서 사용했던 예제를 이어서 작성하겠다.

	String s = "123";
	int i = 123;
	
	// 위에서 생성한 변수 출력.
	System.out.println(s);
	System.out.println(i);
		
	// 위에서 생성한 변수 타입 출력.
	System.out.println(s.getClass().getSimpleName());
	System.out.println(((Object)i).getClass().getSimpleName());

 

해당 변수의 타입을 확인할 때는, 다음 메서드를 사용한다.

 

객체.getClass().getSimpleName()

해당 객체의 타입을 반환해주는 메서드다.

 

getClass 라는 말 그대로, 해당 객체의 클래스 정보를 얻어낸다.

문자열 String 의 경우 참조 타입 Class에 포함되므로,
객체로서 인정 받기에 바로 사용 가능하다.

하지만, 기본 타입 자료형은 객체로서 인정 받지 못한다.

그리하여 정수 타입 int를 Object로 먼저 변환하고,
Wrapper Class로써 포장 객체화하여 사용해야 한다.

*앞선 ArrayList 포스팅의 제네릭에 포함되는 기본 타입의 객체화와 같은 맥락이다.

 

 

출력 결과는 다음과 같다.

 

똑같은 123 으로 보이지만, 해당 객체의 타입을 출력해보니

다른 타입이라는 것을 확인할 수 있다.

 

*int 타입은 객체(Object)로 포장되었기에, Integer 로 출력된다.

 

 


 

+ 부호를 사용하여 구분하기

 

출력문에서 + 부호를 사용하면 문자열을 이어 붙일 수 있다.

 

하지만 정수 타입의 경우, 산술연산의 '덧셈'으로 인식한다.

 

 

이 점을 이용하여 String 타입과 int 타입을 구분해보자.

	// 변수 선언 및 초기화.
	String s = "10";
	int i1 = 10;
	int i2 = 10;
		
	// 생성한 변수 출력.
	System.out.println(s);
	System.out.println(i1);
	System.out.println(i2);
		
	System.out.println(); // 줄바꿈.
		
	// + 부호를 이용해 출력 값 확인.
	System.out.println(s + s); // 1번
	System.out.println(i1 + i2); // 2번
	System.out.println(i1 + i2 + s); // 3번
	System.out.println(s + i1 + i2); // 4번

 

주석을 작성하긴 했지만, 간단히 설명하자면

 

문자열 s에 "10"을 담아서 초기화하고,
정수 타입 변수 i1, i2에 10을 담아서 초기화했다.

그리고 3개의 변수를 출력하여 확인하고,

+ 부호를 이용해 연산 적용을 확인해 보았다.

 

 

출력 결과는 다음과 같다.

위 예제의 마지막 코드 4줄을 비교하며 확인해보자.

 

① 문자열 s + s는 "10"을 2개 이어붙인 문자열로써 인식되었다.

 

② 정수 타입 변수 i1 + i2는 10 +10의 연산으로 인식되었다.

 

③ 정수 타입 변수 i1, i2와 문자열 s 를 순서대로 더했을 때는,

10 + 10의 연산이 적용된 후, 문자열 "10" 이 이어서 출력되었다.

 

④ 가장 의외의 결과였다.

문자열 s와 정수 타입 변수 i1, i2 를 순서대로 더했을 때는,

"10"을 3개 이어붙인 문자열로써 인식되었다.

(1020 으로 출력될 줄 알았다;)

 

 

이로써, + 부호의 인식을 이용해 문자열과 정수 타입을 구분할 수 있었다.

 

또, 출력문 내 문자열의 위치에 따라 정수의 연산 적용 여부도 확인할 수 있었다.

 

 

 


 

이렇게, 데이터의 타입을 확인하는 방법을 알아보았다.

 

 

데이터를 저장해 두는 곳을 자주 변경하거나 데이터를 전송하고 받는 과정이

자주 이루어지다 보면, 종종 귀찮을 때가 있다.

 

그리하여 해당 데이터가 숫자임에도 불구하고,

문자열(String)로 통합하여 관리했던 적이 있었다.

 

막상 그렇게 관리되어 왔던 데이터를 사용해야 할 때,

종종 타입에 대한 문제를 맞이하곤 했었다.

 

 

데이터를 관리할 때 꼼꼼하고 체계적으로 신경을 쓰거나,

데이터를 사용할 때 타입을 확실하게 확인하거나.

둘 중 하나는 습관을 들여야겠다.