본문 바로가기
Develop

[Concept] JAVA (데이터 타입, 타입 변환, 배열, for)

by 빈급 2022. 6. 1.

1. JAVA 데이터 타입

 자바의 데이터 타입은 크게 기본 타입과 참조 타입으로 나뉘게 된다.
 이때 기본 타입은 정수 타입, 실수 타입, 논리 타입으로 분류된다. 각 타입은 메모리 사용 크기와 저장되는 값의 허용 범위가 각기 다르다. 

데이터 타입 분류

- 정수 타입은 byte, short, int, long이 있으며 기본형은 int이다. 기본형이 아닌 long을 사용하기 위해서는 숫자 뒤에 접미사 L을 붙여줘야 한다. 

정수 타입 실습

 
-  실수 타입은 float와 double이 있으며 기본형은 double이다. 기본형이 아닌 float을 사용하기 위해서는 숫자 뒤에 접미사 f or F를 붙여줘야 한다. 이때 float과 double을 사용할 때 조심해야 할 점이 있다. float은 소수점 6~9자리까지 저장할 수 있지만 소수점 6자리까지는 숫자를 온전하게 보장하지만 7~9자리는 보장하지 않는다. 반면에 double은 소수점 15~18자리 까지도 온전하게 보장한다. 그렇기 때문에 소수점 7자리 이상은 double을 사용하는 것이 좋다.

실수형 실습

 - 논리 타입은 boolean이 있으며 false(거짓, 0), true(참, 1)와 같이 두 가지의 값만을 가질 수 있다. 기본형은 false이다.
 
- 문자 타입은 char만 있으며 문자를 저장할 수 있다. 문자를 저장하는 방법은 작은 따옴표로 감싼 문자 리터럴을 오른쪽에 적거나 10진수, 유니코드, 16진수로 적는 방법이 있다. 예제는 아래 사진과 같다.

문자형 실습

 
- 참조 타입은 배열, 클래스, 열거, 인터페스가 있다. 참조 타입 변수와 기본 타입 변수의 큰 차이는 값이 저장되는 형태이다. 기본 타입 변수는  값을 직접 갖는 형태이지만 참조 타입의 경우 객체의 주소값을 갖는 형태를 가진다. 대표적인 예는 다음과 같다. (아래에서 더 자세히 다룰 예정)

참조 타입 이미지화

 
 

2. 타입 변환

 타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다. 변환되는 방식에 따라 자동 타입 변환(promotion)과 강제 타입 변환(casting)으로 나뉜다.
 
- 자동 타입 변환(promotion)은 값의 허용 범위가 작은 타입이 큰 타입으로 저장될 경우 JAVA가 자동으로 변환해 주는 것이다. 기본 타입의 허용 범위 순은 byte < short < int < long < float < double이다.
 
 자동 타입 변환은 산술 연산에서도 발생한다. 정수 타입 변수가 산술 연산식에서 피연산자로 사용되는 경우 byte, char, short 타입 변수는 int 타입으로 자동 변환된다. 정수 타입과 실수 타입 변수가 산술 연산식에서 만나게 되면 값의 허용 범위가 큰 실수 타입으로 변환된다. 

산술 연산식에서의 자동 타입 변환 실습

 부호 연산자를 사용한 경우에도 자동 타입 변환이 일어난다. byte b =100; byte result = -b;가 있을 때 -b는 -1*b이기 때문에 int형으로 형변환이 일어나 컴파일 에러가 발생한다.
 
- 강제 타입 변환(casting)은 큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 저장하는 것이다. 이때 온전한 값이 저장되지 않을 수 있다. 예를 들어 실수 타입의 숫자를 정수 타입의 변수에 저장하게 되면 소수점은 제거된 상태로 저장된다.

강제 타입 변환 실습

 

 3. 반복문

 반복문의 종류는 for, while, do-while문이 있다. for문은 반복 횟수를 알고 있을 때 주로 사용하며 while문은 조건에 따라 반복할 때, 반복 횟수가 정해져 있지 않을 때 사용한다. do-while문의 경우 while문과 유사하지만 조건을 나중에 검사하기 때문에 조건이 거짓이더라도 한 번은 실행된다는 점에서 차이점이 있다.

for문, while문 일반 흐름
do-while문 실행 흐름

 

4. 참조 타입

 참조 타입 변수는 스택 영역에 있으며 힙 영역에 생성된 객체의 주소를 가진다. 때문에 참조 타입 변수를 선언할 때는 값을 넣어주거나 null로 지정해주어야 한다.(null을 해주지 않을 경우 힙 영역을 돌아다닐 수 있음, 보안) 또한 선언된 타입에 따라 기본 값을 가진다. null로 지정해 줄 시 NullPointException 예외가 발생하니 해당 참조 변수가 객체를 참조하도록 수정해야 한다.
 참조 타입 변수의 대표적인 String 타입은 문자열 리터럴을 대입할 경우와 new 연산자를 사용해 객체를 생성했을 때 다른 결과를 가져온다.
 
- String 변수에 문자열 리터럴을 대입할 경우, 문자열 객체가 생성되기 전에 heap 영역에 같은 문자열 객체가 있는지 스캔한다. 문자열 객체가 없다면 생성하고 동일한 경우 같은 객체를 공유한다.

String에 문자열 리터럴 대입했을 경우

 
- new 연산자는 객체 생성 연산자로 heap 영역에 새로운 객체를 생성한다.

new 연산자로 String 변수 생성

 이러한 결과는 ==를 이용하여 알 수 있다. ==는 문자열이 같은지를 비교하는 것이 아닌 번지를 비교하는 것이며 equals()가 문자열을 비교하는 메서드이다.

==와 equals를 이용한 결과

5. 배열

 배열은 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여한 자료구조이며 참조 타입이다. 배열의 인덱스는 0부터 시작하는데 그 이유로는 배열이 저장되어 있는 번지로부터 떨어져 있지 않기 때문이다. 또한 new 연산자로 처음 생성되었을 때는 자동적으로 기본값으로 초기화된다.

1배열 생성 시 메모리 구조

 

6. 2차원 배열

2차원 배열의 구현 방법은 1차원 배열이 다시 1차원 배열을 참조하는 구조이다. 때문에 배열의 길이는 다음과 같다.
intArray.length는 0x10000의 배열을 말하는 것이기 때문에 길이는 2이고 intArray[0].length는 0x14의 배열을 말하는 것이기 때문에 길이가 3이다.

2차원 배열 생성 시 메모리 구조

 
 
 
 


 **후기**
 
 대학교에서 자바 강의를 1번 수강하고 개인적으로 2번을 공부한 경험이 있다. 총 3번을 공부했지만 국비 학원에서 알려주는 것처럼 메모리에 저장되는 상태까지는 배운 적이 없었다. 때문에 배웠던 내용이지만 흥미를 가지며 열심히 수업을 듣고 있다. 수업 내용을 모두 기록해 두면 좋겠지만 너무 자잘한 것까지 기록하게 될 거 같아서 수업을 들으면서 새로 알게 된 내용, 당연하게 생각해서 잊고 있었던 로직 등을 기록해 봤다. 공부한 모든 내용은 github에 코드로 기록해 둬야겠다.