[자바의 정석]자바 데이터 타입, 변수 그리고 배열

YJS·2023년 11월 7일
0
post-thumbnail

1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값


자료형: 값의 종류에 따라 저장될 공간의 크기와 저장형식을 정의한 것.

-기본형: 실제 값을 저장. 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)

분류타입
논리형booleantrue와 false 중 하나를 값으로 가짐. 조건식과 논리적 계산에 사용
문자형char문자를 저장하는데 사용. 변수에 하나의 문자만 저장.
정수형byte, short, int, long저장하는데 사용. 주로 int 사용. byte는 이진 데이터 다룰 때 사용. short는 c 언어와의 호환을 위해 추가
실수형float, double실수 저장하는데 사용. 주로 double사용

cf. 문자형인 char는 문자를 내부적으로 정수(유니코드)로 저장. 정수형 또는 실수형과 연산도 가능.

boolean을 제외한 나머지 7개 기본형은 서로 연산과 변환이 가능

종류 /크기1 byte2 byte4 byte8 byte
논리형boolean
문자형char
정수형byteshortintlong
실수형floatdouble

cf. int를 가장 많이 사용하는 이유: 각 타입마다 저장할 수 있는 값의 범위가 다르지만 일반적으로 int는 CPU가 가장 효율적으로 처리할 수 있는 타입. 메모리 절약하려면 byte나 short활용.

cf2. 각 타입의 변수가 저장할 수 있는 값의 범위

정수형의 경우 -2의 n-1승 ~ 2의 n-1승 -1 (n 은 bit 수)

-참조형: 어떤 값이 저장되어 있는 주소를 저장. 8개 제외한 나머지.

참조형 변수 선언할 때에는 변수의 타입으로 클래스의 이름 사용. '클래스이름 변수이름;'


2. 프리미티브 타입과 레퍼런스 타입


기본형(Primitive type):실제 값을 저장

참조형(Reference type): 기본형 제외한 나머지 타입의 객체의 주소를 저장

3. 리터럴


리터럴(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, 100LL
실수형3.14, 3.0e8, 1.4f, 0x1.0p-1f, d
문자형'A', '1' ,'\n'없음
문자열"ABC", "123", "A", "true"없음

정수형과 실수형의 여러 타입은 리터럴에 접미사를 붙여서 구분.

정수형은 long타입에 대소문자 L 사용. 없으면 int타입

실수형은 float에 대소문자 F, double에 대소문자 D. double은 기본형이므로 생략 가능.

4. 변수 선언 및 초기화하는 방법


변수: 값을 저장할 수 있는 메모리상의 공간. 단 하나의 값을 저장할 수 있으므로, 새로운 값을 저장하면 기존의 값은 사라진다.

변수 선언 방법: 변수타입 변수이름;

-변수 타입: 변수에 저장될 값이 어떤 타입인지

-변수이름: 값을 저장할 메모리 공간의 이름

→ 변수 선언을 통해 메모리의 빈 공간에 변수타입에 알맞은 크기의 저장공간 확보 후 변수이름을 통해 이 저장공간을 사용.

변수의 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것. 메모리는 여러 프로그램이 공유하기 때문에 다른 프로그램에 의해 저장된 알 수없는 값(=쓰레기값)이 남아있을 수 있기 때문.

→ e.g. int age = 25; // 변수의 값을 저장할 때는 대입연산자 '=' 활용. 오른쪽 값을 왼쪽에 저장.

cf. 변수의 명명규칙

-대소문자 구분. 길이 제한 없음

-예약어 사용 금지(리저브드 워드, 키워드는 프로그래밍 언어의 구문에 사용되는 단어)

e.g. true, boolean, do

-숫자로 시작 금지

-특수문자 '_'와 '$'만 허용

cf2) 암묵적인 약속

-클래스의 이름의 첫 글자는 대문자로 시작

-여러 단어로 이루어진 이름은 단어의 첫글자를 대문자로 시작

-상수의 이름은 모두 대문자. 여러 단어일 경우 '_' 로 구분

5. 변수의 스코프와 라이프타임


변수의 스코프: 해당 변수를 사용할 수 있는 영역범위

라이프타임: 해당 변수가 메모리에 언제까지 살아있는지

→변수의 경우 scope 에 따라 Instance Variables, Class Variables, Local Variables 로 구분됨

Instance Variables

클래스 안에서 선언되어있고, 어떠한 method나 block안에서 선언되지 않은 변수

static method를 제외한 클래스 전체lifetime 은 클래스를 인스턴스화한 객체가 메모리에서 사라질 때 까지

Class Variables

클래스 안에서 선언되어있고, 어떠한 메서드나 블럭안에서 선언되지 않았으며 static 키워드가 포함되어 선언된 변수

클래스 전체lifetime 은 프로그램 종료시 까지

Local Variables

인스턴스 변수, 클래스 변수가 아닌 모든 변수

변수가 선언된 block 내부lifetime은 control 이 변수가 선언된 block 내부에 있는 동안

6. 타입 변환, 캐스팅 그리고 타입 프로모션


형변환: 서로 다른 타입간의 연산을 수행하기 이전에 타입을 일치시키는 것. 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라고 함.

→ 방법: (타입) 피연산자

()는 캐스트 연산자 혹은 형변환 연산자라고 함.

-기본형에서 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) 타입에 대입하는 경우이다. 그리고 이 경우에는 데이터 손실이나, 변형이 오지 않음으로 캐스팅할 때 처럼 명시적으로 적지 않아도 자동으로 변환이 가능하다.

7. 1차 및 2차 배열 선언하기


배열: 동일한 타입의 데이터를 연속된 공간에 저장하기 위한 자료구조

1차 배열의 선언

배열을 선언하기 위해선 [] 을 사용

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차 배열의 선언

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차원 배열의 배열

  1. arr 참조변수 만들어짐
  2. int[2] 인 배열이 만들어짐
  3. 대입연산자에 의해 arr이 int[2] 주소 참조
  4. int[4] 배열이 만들어짐 ( arr[0]과 arr[1]에 대해 각각 4개짜리 방이 만들어짐)
  5. 대입연산자에 의해 만들어진 4개짜리 방 주소를 arr[0]과 arr[1]이 각각 참조
profile
우당탕탕 개발 일기

0개의 댓글