-
[live-study] 2주차 :: 자바 데이터 타입, 변수 그리고 배열JAVA/라이브 스터디 | whiteship 2020. 12. 26. 13:47
참고도서 : Java의 정석, Java in a Nutshell
0. 변수
변수란?
- 변수(Variable)은 단 하나의 값만 저장할 수 있는 메모리 공간으로써, 저장된 값은 변경될 수 있으므로 "변수"라고 부른다.
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브(Primitive) 타입이란?
- 자바에는 총 8개의 기본형 데이터 타입이 있다.
- 크게 논리, 문자, 정수, 실수로 나눌 수 있다.
- 기본 자료형의 종류와 크기, 범위는 아래와 같다.
분류 타입 디폴트 크기 범위 논리형 boolean false 1byte 8bit false, true 문자형 char \u0000 2byte 16bit \u0000 ~ \uFFFF 정수형 byte 0 1byte 8bit -128 ~ 127 short 0 2byte 16bit -32,768 ~ 32,767 int 0 4byte 32bit -2^31 ~ 2^31-1 long 0 8byte 64bit -2^63 ~ 2^63-1 실수형 float 0.0 4byte 32bit 1.4E-45 ~ 3.4E38 double 0.0 8byte 64bit 4.9E-324 ~ 1.8E308 +) 실수형의 범위는 "양의 범위"만 적은 것으로, 음의 부호 "-"를 붙이면 "음의 범위"가 된다.
+) 일반적으로 정수형을 저장할 때 int형을 사용하지만 숫자가 9자리가 넘어가면 long형을 사용한다.
논리형
- boolean형 하나가 있다.
- true나 false 둘 중 하나의 값을 가질 수 있으며, default는 false이다.
- 대소문자를 구분해 True 또는 False로 사용 할 수 없다.
1boolean flag = true;cs 문자형
- char형 하나가 있다.
- 문자를 저장할 수 있는 타입으로, 하나의 문자만 저장할 수가 있다.
1char ch = 'A';cs 정수형
- byte : 1byte
- short : 2byte
- int : 4byte (default data type)
- long : 8byte
- 정수형 변수를 선언할 때는 범위를 생각해서 4개의 정수형 중 하나를 선택해야 한다. 예를 들어 byte(-128 ~ 127)형의 변수를 선언하고, byte의 범위를 넘어가도록 숫자를 더하면 어떻게 될까. 아래와 같이 127 + 1이 128이 아니라 -128이 되는 것을 볼 수 있다. 에러가 나지 않고 예상하지 못한 값이 나오는 것을 볼 수가 잇는데, 이를 오버플로우(overflow)라고 한다. 해당 타입(byte)가 표현할 수 있는 값의 범위를 넘어갔기 때문에 생기는 현상이다.
실수형
- float : 4byte | 7자리 (정밀도)
- double : 8byte | 15자리 (정밀도)
- 실수형은 오차가 발생 할 수 있으므로 정밀도(precision)가 중요하다. float의 정밀도는 7자리인데 이 말은 곧 7자리의 10진수를 오차없이 저장할 수 있다라는 뜻이다. 만약 그 이상의 정밀도가 필요하다면 float형이 아닌 double형을 써야한다.
2. 프리미티브 타입과 레퍼런스 타입기본형(Primitive)와 참조형(Reference)
- 프리미티브 타입은 앞서 설명한 것처럼 논리형, 문자형, 정수형, 실수형 총 8개의 데이터 타입에 값을 저장할 수 있는 타입이다.
- 레퍼런스 타입은 프리미티브 타입이 실제 값을 저장하고 있는 것과 달리, 어떠한 객체의 주소를 저장하고 있다. (기본형 8개를 제외한 나머지 타입)
레퍼런스 타입
- 레퍼런스(Reference) 타입은 객체의 주소를 저장하므로 어떠한 클래의 이름을 변수의 타입으로 사용한다.
- 아래 코드는 Date 클래스 타입의 참조변수 now를 선언하고 초기화를 한 것이다. 아래와 같이 사용하게 되면 now라는 변수에 새로 생성된 Date 타입의 객체의 주소가 저장된다.
Date now = new Date();
3. 리터럴상수(Constant)란
- 값을 저장할 수 있는 메모리 공간이며, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경이 불가능하다.
- 상수를 선언하는 방법은 변수와 동일하며 '변수타입' 앞에 'final'이라는 키워드를 붙여주면 된다.
- 상수는 선언과 동시에 초기화를 해야하며 그 이후에는 값의 변경이 불가능하다.
- 이름은 대문자로 하는 것이 관례이다.
1final int MAX_VALUE = 30;cs 리터럴(Literal)이란
- 자바의 소스 코드 내에서 직접적으로 표현되는 상수 값을 말한다. (1, 1.0, '1', "str", true ..)
- 프로그래밍에서 "상수(Constant)"는 이미 다른 의미로 사용되고 있는 용어 이므로, 이를 구분 짓기 위해서 리터럴 이라고 표현한다.
- 즉, 아래에서 MAX_VALUE는 상수이고, maxValue는 변수가 되며, 20과 30은 리터럴이 된다.
final int MAX_VALUE = 30;
int maxValue = 20;
- 리터럴에도 변수와 마찬가지로 타입이 존재한다.
분류 리터럴 접미사 논리형 true, false - 정수형 123, 100L L 실수형 3.14 f, d 문자형 'A' - 문자열 "Hello" -
4. 변수 선언 및 초기화하는 방법변수 선언
- 변수는 "변수 타입"과 "변수 이름"으로 구분 지을 수 있다.
- 변수 타입은 말 그대로 변수에 저장될 "타입(type)"을 지정하는 것이다.
- 변수 이름은 그 변수에 붙여줄 이름을 말하는 것이다. 당연히 같은 이름의 변수가 존재해서는 안되며, 이름을 정할때도 규칙이 존재한다.
int age = 40;
boolean flag = false;
변수 명명 규칙
- 자바 예약어는 사용할 수 없다. (예약어 참조)
- 문자의 길이 제한은 없다.
- 첫 문자는 영어 소문자로 시작하며, 단어 여러개를 붙여서 쓰는 경우 각 단어의 첫 문자를 대문자로 한다. (관례, camelCase)
- 영어 대소문자는 구분된다. (value != Value)
- 첫 번째 글자는 문자이거나 $, _ 이어야 하고, 숫자는 맨 앞에 나올 수 없다. (ex. value, $value, _value, maxValue)
초기화(Initialization)
- 변수는 값을 저장할 수 있는 메모리 공간이므로, 쓰레기 값(알 수 없는 값)이 남아있을 수도 있어 적절한 값으로 초기화를 해야한다.S
- 변수는 종류에 따라 초기화를 생략할 수도 있지만, 해주는 것이 좋다.
- 수학에서 "="의 의미는 같다라는 의미지만, 여기서 "="의 의미는 대입 연산자로서 값을 저장하라는 의미로 사용된다. 즉, "=" 연산자를 기준으로 왼쪽에는 변수가 선언되어 있고, 오른쪽에는 그 변수에 넣을 값을 넣어주면 변수에 값을 저장할 수가 있다.
- 아래와 같이 변수를 초기화 해주게 되면, age라는 변수가 int형으로 선언이 되고, 40으로 초기화가 되어 메모리에 저장이 되었다라는 의미가 된다.
int age = 40;
5. 변수의 스코프와 라이프타임변수의 스코프와 라이프타임
- 변수는 중괄호 { } 블록 내에서 선언되고 사용된다. 변수가 사용될 수 있는 이러한 범위를 스코프(Scope)라고 한다.
- 아래와 같이 변수가 if문의 중괄호 내부에서 선언이 되었다면, 그 밖에서는 사용할 수가 없다. 만약 해당 중괄호 밖에서 접근 시 "cannot be resolved to a variable"이라는 에러가 발생한다.
- 그 이유는 { } 이러한 블록 내부에 선언된 변수를 지역변수(Local Variable)이라고 하는데, 이 변수는 선언된 블록을 벗어나기 전까지만 라이프타임이 유지된다.
- 하지만 만약에, 아래와 같이 sum이라는 변수가 클래스 변수(Class Variable)로 선언이 되어 있다면, 에러 없이 원하는 값을 얻을 수 있다.
- 그 이유는 클래스 변수는 클래스 전체에서 접근이 가능하며, static으로 선언된 이 변수는 프로그램이 실행될 때 java 메모리에 할당되며, 프로그램 종료시 해제된다.
- 더 자세한 부분은 이 강의를 참조해도 좋을 것 같다. (변수의 scope와 static)
6. 타입 변환, 캐스팅 그리고 타입 프로모션타입 변환
- 타입 변환이란 말 그대로 어떠한 변수나 리터럴의 타입을 변환하는 것이다.
- 두 가지 종류가 있는데, 하나는 자동 타입 변환(Promotion)이고, 다른 하나는 강제 타입 변환(Casting)이다.
캐스팅 (Casting)
- 캐스팅은 강제 타입 변환으로, 형변환하고 싶은 변수나 리터럴 앞에 변환하고자 하는 타입을 붙여줘서 강제로 변환하는 것이다.
- 아래와 같이 double형의 변수를 int형으로 강제로 변환할 수 있다.
타입 프로모션(Promotion)
- 타입 프로모션은 위와 같이 강제로 변환이 이루어지는 것이 아니라, 컴파일러가 알아서 생략된 형변환을 자동적으로 추가할 수 있다.
- 아래와 같이 double형의 변수에 정수값을 넣었고, 형변환을 생략했지만 문제 없이 실수형태로 출력 되는 것을 볼 수 있다.
- 하지만, 모든 타입을 자동적으로 형변환하는 것은 아니다.
- 아래와 같이 byte의 범위를 벗어나는 값을 저장하려고 하는 경우, 형변환을 하지 않으면 "cannot convert from int to byte"와 같은 에러가 발생한다.
- 그래서, 자동 형변환은 규칙이 있다. 범위가 작은 크기의 타입에서 넓은 크기의 타입으로만 자동형변환이 가능하다.
- long은 8 byte이고 float는 4 byte인데, long에서 float로 형변환이 가능한 이유는 실수형이 정수형보다 표현 할 수 있는 값의 범위가 더 크기 때문이다.
7. 1차 및 2차 배열 선언하기배열이란
- "같은 타입"의 여러 변수를 하나로 묶은 것이다.
배열의 선언
- 배열을 선언하는 방법은 두 가지가 있다. (1차원)
- 첫번째로는 타입명에 [] 를 붙이는 방법이고
12int[] arr;String[] arr2;cs - 두번째로는 변수이름에 []를 붙이는 방법이다. (+ 개인적으로는 이 방법을 선호한다.)
12int arr[];String arr2[];cs 배열의 생성
- 배열을 선언한 후 아무것도 하지 않으면 배열을 사용할 수도 없고 exception이 떨어질 것이다. 그래서 배열을 생성해야지만 실제로 값을 저장할 수 있는 공간을 만들 수가 있다. 배열을 생성할 때에는 키워드 "new"를 사용하여 타입과 길이를 함께 지정해주면 된다.
- int타입의 arr라는 이름을 가지며 값을 5개 저장할 수 있는 배열을 만들고자 한다.
123456//1. 선언과 생성 분리int arr[];arr = new int[5];//2. 선언과 생성 동시 (보통 이렇게 많이 쓴다)int arr[] = new int[5];cs 1차원 배열
- 위의 예시로 든 배열을 우리는 "1차원 배열"이라고 부른다.
int arr[] = new int[5];
배열의 인덱스
- 배열은 여러 변수를 하나로 묶은 것으로, 각각의 값은 자신들만의 저장공간을 갖게 된다. 우리는 이를 배열의 요소(element)라고 부른다. 그리고 각각의 값은 배열이름[인덱스]와 같은 방법으로 접근 할 수 있다.
- 인덱스(index)는 각 배열의 요소들을 구분하기 위한 번호이다. 인덱스의 범위는 0으로 시작하여 배열길이-1까지이다.
- 처음 배열을 생성하면 초기화 된 상태로 각 타입에 맞는 값이 초기 값으로 저장되어 있다. (int배열의 경우 0)
- 변수와 마찬가지로 배열의 값도 변경이 가능하다. 예를 들어 2번째 인덱스의 값을 1로 바꾸고 싶으면 아래와 같이 할 수 있다.
2차원 배열
- 1차원 배열 뿐만 아니라 2차원 이상의 다차원 배열도 선언하고 사용할 수 있다.
2차원 배열의 선언과 생성
- 1차원 배열과 마찬가지로 선언방법에는 타입명에 []를 붙이거나 변수이름에 [] 를 붙이는 방법이 있다. 다만 2차원 배열이기 때문에 대괄호를 두 번 [][] 써주어야한다.
12345678//1. 타입명에 [][]를 붙여준다.int[][] arr;//2. 변수이름에 [][]를 붙여준다.(이 방법을 선호한다)int arr[][];//3. 타입과 변수이름에 [][]를 붙여준다.int[] arr[];cs - 1차원 배열과 마찬가지로 선언 후 생성을 해주어야 배열에 접근이 가능하다. 아래와 같이 하면, 2행 3열의 2차원 배열을 생성 할 수 있다.
int arr[][] = new int[2][3];
0 0 0 0 0 0 - 배열의 인덱스에 접근 하는 방법도 동일하다. arr[0][2]의 숫자를 1로 바꾸고 싶으면 아래와 같이 할 수 있다.
arr[0][2] = 1;
0 0 1 0 0 0
8. 타입 추론, var타입 추론(Type Inference)
- 타입 추론은 말 그대로 데이터 타입을 명시하지 않아도 자바 컴파일러가 타입을 추론할 수 있다라는 의미이다.
- 자바 10 이전에는 익숙한 방식으로 타입을 명시적으로 선언하였었다.
var
- 자바 10에서 추가된 초기화 값이 존재하는 Local Variable 로 선언된다.
- Member variable, Method parameter, return type 등으로 사용할 수 없다.
- 초기화도 반드시 필요하다.
- 아래와 같이 var로 변수를 선언하였다. 타입을 명시하지 않았지만 자바 컴파일러가 초기화된 값을 기준으로 변수의 타입을 추론할 수 있다.
var str2 = "Hello World";
참고자료
'JAVA > 라이브 스터디 | whiteship' 카테고리의 다른 글
[live-study] 6주차 :: 상속 (0) 2021.01.09 [live-study] 5주차 :: 클래스 (0) 2021.01.01 [live-study] 4주차 :: 제어문 (0) 2020.12.31 [live-study] 3주차 :: 연산자 (0) 2020.12.28 [live-study] 1주차 :: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가 (0) 2020.12.26