자료형: 값의 종류에 따라 저장될 공간의 크기와 저장형식을 정의한 것.
-기본형: 실제 값을 저장. 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
분류 | 타입 | |
---|---|---|
논리형 | boolean | true와 false 중 하나를 값으로 가짐. 조건식과 논리적 계산에 사용 |
문자형 | char | 문자를 저장하는데 사용. 변수에 하나의 문자만 저장. |
정수형 | byte, short, int, long | 저장하는데 사용. 주로 int 사용. byte는 이진 데이터 다룰 때 사용. short는 c 언어와의 호환을 위해 추가 |
실수형 | float, double | 실수 저장하는데 사용. 주로 double사용 |
cf. 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장. 정수형 또는 실수형과 연산도 가능.
boolean을 제외한 나머지 7개 기본형은 서로 연산과 변환이 가능
종류 /크기 | 1 byte | 2 byte | 4 byte | 8 byte |
---|---|---|---|---|
논리형 | boolean | |||
문자형 | char | |||
정수형 | byte | short | int | long |
실수형 | float | double |
cf. int를 가장 많이 사용하는 이유: 각 타입마다 저장할 수 있는 값의 범위가 다르지만 일반적으로 int는 CPU가 가장 효율적으로 처리할 수 있는 타입. 메모리 절약하려면 byte나 short활용.
cf2. 각 타입의 변수가 저장할 수 있는 값의 범위
정수형의 경우 -2의 n-1승 ~ 2의 n-1승 -1 (n 은 bit 수)
-참조형: 어떤 값이 저장되어 있는 주소를 저장. 8개 제외한 나머지.
참조형 변수 선언할 때에는 변수의 타입으로 클래스의 이름 사용. '클래스이름 변수이름;'
기본형(Primitive type):실제 값을 저장
참조형(Reference type): 기본형 제외한 나머지 타입의 객체의 주소를 저장
리터럴(literal): 상수의 다른 이름. 프로그래밍에서 상수를 값을 한번 저장하면 변경할 수 없는 공간으로 정의하여 이와 구분하기 위해 상수를 다른 이름인 리터럴로 사용.
cf. 상수(Constant)
: 변수와 마찬가지로 값을 저장하는 공간이지만 한번 값을 저장하면 변경 불가능. 변수 타입 앞에 'final'을 붙임. 상수는 반드시 선언과 동시에 초기화. 상수의 이름은 대문자로 작성.
e.g. final int PI= 3.14;
cf2. 변수, 상수, 리터럴
-변수: 하나의 값을 저장하기 위한 공간
-상수: 값을 한번만 저장할 수 있는 공간
-리터럴: 그 자체로 값을 의미
e.g. int year = 2014; // year: 변수. 2014: 리터럴
final int MAX_VALUE = 100; // MAX_VALUE: 상수. 100: 리터럴
종류 | 리터럴 | 접미사 |
---|---|---|
논리형 | false, true | 없음 |
정수형 | 123, 0b0101, 077, 0xFF, 100L | L |
실수형 | 3.14, 3.0e8, 1.4f, 0x1.0p-1 | f, d |
문자형 | 'A', '1' ,'\n' | 없음 |
문자열 | "ABC", "123", "A", "true" | 없음 |
정수형과 실수형의 여러 타입은 리터럴에 접미사를 붙여서 구분.
정수형은 long타입에 대소문자 L 사용. 없으면 int타입
실수형은 float에 대소문자 F, double에 대소문자 D. double은 기본형이므로 생략 가능.
변수: 값을 저장할 수 있는 메모리상의 공간. 단 하나의 값을 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.
변수 선언 방법: 변수타입 변수이름;
-변수 타입: 변수에 저장될 값이 어떤 타입인지
-변수이름: 값을 저장할 메모리 공간의 이름
→ 변수 선언을 통해 메모리의 빈 공간에 변수타입에 알맞은 크기의 저장공간 확보 후 변수이름을 통해 이 저장공간을 사용.
변수의 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것. 메모리는 여러 프로그램이 공유하기 때문에 다른 프로그램에 의해 저장된 알 수없는 값(=쓰레기값)이 남아있을 수 있기 때문.
→ e.g. int age = 25; // 변수의 값을 저장할 때는 대입연산자 '=' 활용. 오른쪽 값을 왼쪽에 저장.
cf. 변수의 명명규칙
-대소문자 구분. 길이 제한 없음
-예약어 사용 금지(리저브드 워드, 키워드는 프로그래밍 언어의 구문에 사용되는 단어)
e.g. true, boolean, do
-숫자로 시작 금지
-특수문자 '_'와 '$'만 허용
cf2) 암묵적인 약속
-클래스의 이름의 첫 글자는 대문자로 시작
-여러 단어로 이루어진 이름은 단어의 첫글자를 대문자로 시작
-상수의 이름은 모두 대문자. 여러 단어일 경우 '_' 로 구분
변수의 스코프: 해당 변수를 사용할 수 있는 영역범위
라이프타임: 해당 변수가 메모리에 언제까지 살아있는지
→변수의 경우 scope 에 따라 Instance Variables, Class Variables, Local Variables 로 구분됨
클래스 안에서 선언되어있고, 어떠한 method나 block안에서 선언되지 않은 변수
static method를 제외한 클래스 전체lifetime 은 클래스를 인스턴스화한 객체가 메모리에서 사라질 때 까지
클래스 안에서 선언되어있고, 어떠한 메서드나 블럭안에서 선언되지 않았으며 static 키워드가 포함되어 선언된 변수
클래스 전체lifetime 은 프로그램 종료시 까지
인스턴스 변수, 클래스 변수가 아닌 모든 변수
변수가 선언된 block 내부lifetime은 control 이 변수가 선언된 block 내부에 있는 동안
형변환: 서로 다른 타입간의 연산을 수행하기 이전에 타입을 일치시키는 것. 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라고 함.
→ 방법: (타입) 피연산자
()는 캐스트 연산자 혹은 형변환 연산자라고 함.
-기본형에서 boolean 제외한 나머지 타입들은 서로 형변환 가능
-기본형과 참조형간의 형변환은 불가능
-큰 타입에서 작은 타입으로 변환하는 경우에는 값 손실이 발생할 수 있음. 반면 작은 타입에서 큰 타입으로의 변환은 저장 공간의 부족으로 잘려나가는 일이 없으므로 값 손실이 발생하지 않음.
-실수형을 정수형으로 변환하면 실수형의 소수점 이하 값은 버려짐.
e.g. (int) 1.666 = 1
-자동 형변환: 서로 다른 두 타입의 연산에서는 먼저 타입을 일치시킨 후 연산을 수행하므로 연산과정에서 자동적으로 형변환이 이루어짐. 두 타입 중 표현범위가 더 넓은 타입으로 형변환해서 값손실 위험을 줄임. 이처럼 연산과정에서 자동적으로 발생하는 형변환을 산술변환이라함.
byte > short / char > int > long > float > double
→화살표 방향으로의 변환은 자동형변환으로 연산자 사용 안하지만 반대 방향은 형변환 연산자 필요. 실수형과 정수형의 경우 실수형의 표현범위가 더 크기때문에 float 와 double이 같은 크기인 int와 long보다 오른쪽에 위치.
캐스팅: 타입캐스팅이란 크기가 더 큰 자료형을 크기가 더 작은 자료형에 대입하는 것을 의미한다. 예를들어 int(4byte)타입의 데이터를 byte(1byte) 타입에 대입하는 경우가 있을 수 있겠다. 물론, 데이터 크기가 더 크기 때문에 변환과정에서 데이터의 손실이나 변형이 올 수도 있다.
타입 프로모션: 타입캐스팅과 반대로 크기가 더 작은 자료형을 더 큰 자료형에 대입하는 것을 의미한다. 예를들어 byte(1byte)타입의 데이터를 int(4byte) 타입에 대입하는 경우이다. 그리고 이 경우에는 데이터 손실이나, 변형이 오지 않음으로 캐스팅할 때 처럼 명시적으로 적지 않아도 자동으로 변환이 가능하다.
배열: 동일한 타입의 데이터를 연속된 공간에 저장하기 위한 자료구조
배열을 선언하기 위해선 [] 을 사용
int [] arr1;
int arr2 [];
변수명 앞에 [] 혹은 변수명 뒤에 [] 붙여서 선언하고 초기화를 통해 크기 지정
int [] arr = new int[10];
배열에는 값을 할당할 수 있음.
arr[0] = 10;
arr[1] = 20;
선언, 초기화, 할당을 한줄에 가능.
int arr [] = {1,2,3}
int arr [] = new int[3];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
2차 배열도 1차배열과 유사하며 다음과 같이 사용
int [][] arr = new int [2][2];
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][1] = 4;
위 코드는 다음 코드와 동일하다
int arr[][] = {{1,2},{3,4}}
2차원 배열 : 1차원 배열의 배열