이번 글에서는 자바의 참조 자료형을 살펴보려고 한다.
맨 앞에서 자바는 자료형을 크게 2가지로 구분할 수 있다고 했다. 기본형과 참조형이었다.
기본형은 8가지가 있었고 나머지는 모두 참조형이라고 했다.
근데 참조형이 뭘까? 그냥 무슨 뜻일까?
이는 C언어의 포인터와 같다.
다시 말해, 자바에서는 참조변수를 사용할 때 반드시 객체를 생성하여 사용하는데 그 때 객체를 제어하기 위한 변수이다.
(객체는 C언어의 구조체와 비슷한 느낌이지만 그 안에 함수까지 가질 수 있는 녀석이라고 보면 되겠다.)
먼저, C언어에서 포인터는 어떤 특징이 있었는지 대략 생각해보자.
자료형을 얘기하고 있다보니 참조변수도 byte size가 있을 것이다. 그럼 Java에서의 참조변수는 얼마일까?
위에 보면 참조변수는 포인터와 같다고 설명했다.
C언어에서 포인터 변수의 크기는 얼마인가? 8바이트이다.(물론 이전 x86으로 실행했다면 4바이트겠지만)
자바도 마찬가지이다. 자바의 참조변수도 8바이트이다. 이 변수는 주소를 저장하는 변수이기 때문이다.
그리고 이 참조변수는 객체를 참조한다고 했다. 여기서 말하는 객체는 기본적으로 자바에 4000여개 정도가 있다.
가장 대표적인 String부터 시작해 Random, Scanner 등이 있겠다.
이제 어느 정도 기본형과 참조형 자료형이 무엇인지 대략 감은 잡았으리라 생각한다.
아래는 내가 강의를 들을 때 사용했던 실습 예제를 조금 수정해서 가져온 것이다.
public class Ex01Print {
public static void main(String[] args) {
System.out.println(10);
System.out.println(true);
System.out.println("Hello" + "World");
System.out.println(10 + 3.14);
System.out.println(5 + " + " + 3 + " = " + (5 + 3));
int num = 1;
System.out.println(num);
System.out.printf("%d %d\n", 10, 20);
System.out.printf("%.3f %f\n", 10.25, 20.14);
int a = 2100000000;
int b = 2100000000;
System.out.println(a + b);
System.out.println(a);
long g;
g = 2500000000L;
float h;
h = 3.14F;
}
}
가벼운 마음으로 쭉 순서대로 코드를 보다보면 print를 하는데 true를 출력하는 문장이 있다.
사실, 매우 가벼운 내용이라 소개하지 않았었는데 boolean 자료형이다.
자바는 C언어와 다르게 true가 1, false를 0이라고 하지 않고 true는 true, false는 false라고 표기한다.
그래서 C언어에서는 맞는 문법이 자바에서 틀린 대표적인 경우가 있다.
while(1) {
//
}
위와 같은 코드는 C언어에서 무한루프문으로 동작할 수 있는 코드였다.
하지만, 자바에서 이는 틀린 문법이다. 1이 아닌 true를 사용해야 하는 것이다.
다시 예제 코드를 살펴보면 또 낯선 코드가 있다.
print를 하는데 문자열을 더하고 있다. 일반적으로 아는 + 연산자는 산술 연산자일 것이다.
그러나, 문자열을 더할 때는 저 + 연산자는 덧셈 연산을 하는 연산자가 아닌 결합 연산자로 문자열 2개를 더한다.
여기서 문자열 2개를 더한다는 것은 두 문자열을 합친다는 것인데 그냥 단순히 뒤에 문자열을 붙인다고 생각하면 되겠다.
그럼 당연히 출력은 HelloWorld가 나오겠다.
다음 코드인 10 + 3.14는 C언어처럼 자동으로 형변환을 하고 난 뒤 계산한 값을 보여주기 때문에
결과는 모두가 예상하다시피 13.14가 나올 것이다.
그런데 더 알아보기 힘든 코드는 바로 다음 문장이다.
C언어만 해오던 사람에게는 말도 안되는 코드일 것이다.
먼저 맨 앞의 5 + " + "라는 연산만 가져와서 살펴보자.
이 코드는 무슨 뜻일까.. 바로 위에서 말했던 것처럼 자동으로 형변환을 해서 연산을 했다는 것이다.
당연하게도 5가 문자열 5가 되면서 "5 + "라는 결과가 만들어졌을 것이다.
같은 문장에서 맨 뒤 (5 + 3)은 왜 괄호를 해두었을까?
많은 사람들이 연산 우선순위 때문이라고 예측할 것이다.
맞다. 연산자의 우선순위 때문이다. 괄호를 통해 연산자의 우선순위를 정하지 않았다면 이 print문은 어떻게 실행되었을까?
5 + 3 = 53
위와 같은 결과가 출력되었을 것이다.
그리고 다시 예제를 보면 C언어와 익숙한 글자가 있다.
printf이다. 우리가 아는 C언어의 그 printf기능이 맞다. 서식문자를 통해 출력할 수 있다.
여기서 어색함을 다시 한 번 느낀 사람이 있다면 정말 대단하다.
자바에서 실수형의 기본 자료형은 분명 double형이라고 했다.
C언어에서 double형을 출력하려면 우린 %lf서식문자를 사용했어야 했다.
하지만, 자바에서는 %f로 모든 실수형을 출력한다.
그 다음 a, b에 21억을 넣고 두 값을 더한 결과를 출력했다.
결과는 우리가 알 수 없는 값이 나온다. 왜 그럴까?
아까 형변환과 비슷한 맥락으로 볼 수 있겠다.
int + int = ? 여기에 결과는 당연히 int형으로 결과가 나온다.
그런데 int형의 대략적인 범위는 -21억에서 +21억까지라고 저번 글에서 밝힌 적이 있었다.
그럼 당연히 이 값은 int형으로는 출력할 수가 없다.
다음 코드들은 저번 글에서 소개했던 내용들이라 설명은 생략해도 될 것이라 생각한다.
'Language > Java' 카테고리의 다른 글
Java에서의 String 소개 - 1 (0) | 2022.02.09 |
---|---|
Java의 print와 scan (0) | 2022.02.03 |
짧은 객체지향 프로그래밍 소개 (0) | 2022.02.01 |
Java 기본 자료형 - 2 (0) | 2022.01.28 |
Java 기본 자료형 - 1 (0) | 2022.01.27 |