자바의 데이터타입,변수 그리고 배열을 알아보자!
학습 목표 : 자바의 variable(변수), primitive type 그리고 배열을 이해해보자.
변수 선언 및 초기화 방법
변수란 ?
값을 저장할 수 있는 메모리상의 공간이다.
선언 및 초기화 방법
- 선언 : 변수타입에 맞는 크기의 저장공간을 확보하는 것
-
초기화 : 변수를 사용하기 전에 확보된 저장공간에 값을 처음으로 저장하는 것
//변수명이 a이고 int타입인 변수를 선언 int a; //초기화 a = 20; //동시에 선언과 초기화를 할 수 있다. //변수 b를 선언하고 정수 10이라는 숫자를 담아 초기화 int b = 10;
-
타입이 같은 경우 콤마’,’를 구분자로 여러 변수를 한 줄에 선언할 수도 있다.
int a, b; int c = 0, d = 1;
-
두 변수의 값 교환하기 x, y
단순히 x에 y값을, y에 x값을 저장하면 될 것 같지만 아니다.
int x = 10; int y = 20; int x = y; //int x = 20; int y = x; //int y = 20;
- 위와 같은 방법으로는 원하는 값을 얻을 수 없다. 그렇다면 어떻게 해야할까?
문제점 : x의 값을 y에 바로 저장하면 원래 x의 값(10)이 덮어씌여져서 x의 원래 값을 알 수가 없다.
해결책 : x의 값을 저장할 또 다른 변수 하나를 만들어준다.
int x = 10; int y = 20; int tmp = 0; //원래의 x값을 z변수에 저장 int tmp = x; //y값을 x에 저장 int x = y; //z의 값(x의 원래 값이 담긴)을 y에 저장 int y = tmp;
변수의 타입
1. 기본형 (Primitive type) - 총 8개
계산을 위한 실제 값을 저장한다.
종류
- 논리형 : boolean
- 문자형 : char
- 정수형 : int, short, long, byte
- 실수형 : float, double
크기(값의 범위) 및 기본값
- int타입의 변수는 대략 10자리 수의 값을 저장할 수 있다. 그러므로 7~9자리의 수를 계산할 때는 넉넉하게 long타입(약19자리)으로 변수를 선언하는게 좋다.
- 정수형과 달리 실수형은 타입 선택시 저장 가능한 값의 범위뿐만 아니라 정밀도도 중요한 기준이된다. 그러므로 높은 정밀도가 필요한 경우는 float대신 double을 선택해야한다.
2. 참조형 (Reference type) - 기본형을 제외한 나머지 타입
null 또는 객체의 주소를 저장한다.
[참고] null : 어떤 객체의 주소도 저장되어 있지 않음을 뜻한다.
- classes
- objects
- Arrays
- Strings
- Interfaces
참조변수의 초기화 → 연산자 new를 사용
Person p = new Person();
//Person이라는 객체를 생성해서, 그 주소를 p에 저장함
리터럴이란?
literal
상수 자체의 값을 의미한다.
constant(상수)
값을 한번만 저장할 수 있는 공간이다.
- 한 번 값을 저장하면 변경할 수 없다.
- 변수 타입 앞에 final을 붙여주고 변수명은 대문자로 쓴다.
- 반드시 선언과 동시에 초기화해야한다.
final int MAX_SPEED = 10;
// 10 -> 리터럴
// MAX_SPEED -> 상수
변수의 scope와 life time
변수의 scope(범위)
그 변수에 접근할 수 있는 범위이다.
자바언어는 블록 스코프를 사용한다.즉, 변수가 선언된 블록 내에서만 접근할 수 있다는 것이다.
(블록은 중괄호 { }를 뜻한다.)
변수를 사용할 때, 먼저 자신과 가까운 블록 스코프에서 찾고 없을 경우 상위 블록 스코프에 존재하는지 찾아본다.
변수의 life time
변수가 메모리에서 살아있는 기간
-
참조형 변수
참조형 변수의 life time은 GC(Garbage Collector)와 관련이 있다. 힙 영역에 메모리가 부족할 때 GC가 스캔하고 참조되지않은 객체를 메모리에서 제거한다.
참조형 변수가 더이상 참조되지 않는다면 GC가 제거할 대상이되고 minor GC 또는 major GC가 발생할 때 소멸한다.
-
런타임 스택 영역에 생성된 변수
블록 스코프에 의존적이다. 즉, 블록 내에서 선언된 변수는 블록이 종료될 때 런타임 스택 영역에서 함께 소멸한다.
타입 변환
변수 또는 상수의 타입을 다른 타입으로 변환하는 것이다.
형변환하는 이유는 서로 다른 타입끼리 연산하기 위해서 타입을 일치시켜야하기 때문이다.
- 형변환 방법
- Type Promotion (자동 형변환)
값의 범위가 작은 타입에서 큰 타입으로 형변환 하는경우 → 컴파일러가 자동으로 형변환 해준다.
- Casting (명시적 형변환)
값의 범위가 큰 타입에서 작은 타입으로 형변환 하는경우 → 강제(명시적)로 형변환 해줘야한다.
형변환하고자 하는 것 앞에 괄호와 함께 변환할 타입을 붙여준다.
double d = 35.3; int score = (int)d; //d = 35.3 //score = 35
[참고] d의 값을 읽어서 int로 변환한 값을 score에 저장했을 뿐, d의 값을 형변환 시킨 것이 아니다. 그러므로 변수 d의 값은 형변환 후에도 아무런 변화가 없다.
- boolean을 제외한 primitive type의 7개타입은 서로 형변환이 가능하다.
- 기본형과 참조형은 서로 형변환 할 수 없다.
1차, 2차 배열 선언하기
배열이란?
같은 타입의 여러 변수를 하나의 묶음으로 다루는 참조 타입 자료형이다.
배열의 선언과 생성
//배열을 선언
int[] score;
int score[];
//배열 선언 & 생성
int[] score= new score[5];
배열의 생성과 초기화
//배열 생성과 초기화를 동시에
int[] score = new int[]{100,90,80,70,60};
int[] score = {100,90,80,70,60};
[주의!] 배열의 선언과 생성을 따로 하는 경우에는 ‘new 타입[]’을 생략할 수 없다.
int[] score;
score = {100,90,80,70,60}; //에러발생. new int[]를생략할 수 없다.
2차원 배열의 선언
2차원 배열의 경우 행렬 형태로 자주 표현하고 주로 테이블 형태의 데이터를 담는데 사용된다.
int[][] score;
int score[][];
int[] score[];
2차원 배열의 생성
int score[][] = new int[5][3];
2차원 배열의 초기화
int[][] score = new int[][]{
{100,100,100}
, { 20, 20, 20 }
, { 30, 30, 30 }
, { 40, 40, 40 }
, { 50, 50, 50 }
};
var (타입 추론)
컴파일러가 타입이 정해지지 않은 값을 보고 그 타입을 유추하는 것이다.
대표적으로는 제네릭에서 타입 추론을 볼 수 있다.
ArrayList<Person> list = new ArrayList<Person>();
//이처럼 추정이 가능한 경우 타입을 생략할 수 있다.
ArrayList<Person> list = new ArrayList<>();
ArrayList변수에 담길 데이터 타입이 ArrayList<Person>라는 것을 list변수의 데이터 타입을 바탕으로 추론해 낼 수 있다 .
또는 Javascript에서 모든 변수를 var, let, const 등을 사용해서 선언하는 것도 타입 추론의 예시이다.
[참고]
사이트
https://league-cat.tistory.com/411
https://blog.naver.com/hsm622/222144931396
https://cremazer.github.io/java-Array/
교제
Leave a comment