2주차 과제: 자바 데이터 타입, 변수 그리고 배열

2020. 12. 15. 16:232021/JOB DA STUDY

목표

자바의 Primitive 타입, 변수, 배열의 사용 방법을 익힙니다.


학습할 것

  • 프리미티브 타입의 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언
  • 타입 추론, var

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

자바의 데이터 타입에는 크게 Primitive typeReference type으로 나뉘어 집니다.
이 둘의 가장 큰 차이점은 "메모리 참조 타입"입니다.

 

프리미티브 타입의 경우, 변수 선언시 메모리에 공간이 할당 되는데 직접 데이터를 담습니다.
레퍼런스 타입의 경우, 변수 선언시 다른 곳을 참조하는 주소값을 담습니다.

 

뇌를 자극하는 java프로그래밍 - 한빛 미디어

 

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

깊은 복사와 얕은 복사가 일어나는 이유는 이 두 타입에 의해서이다.

 

Primitive Type
  • byte, char, int, short, float, double, long, boolean 이 8개가 속하며, "실제 값을 할당"
  • 기본값이 존재해 Null이 존재하지 않는다. (기본형 타입에 Null을 넣고 싶은 경우, 래퍼 클래스를 이용)
  • 실제 값을 저장하는 공간으로 Stack 메모리에 저장
  • 컴파일 시점에 크기에서 벗어나는 경우 컴파일 에러가 발생

 

 

 타입

 할당되는 메모리 크기

 기본값

 데이터의 표현 범위

 논리형

 boolean

 1 byte

 false

 true, false

 정수형

 byte

 1 byte

 0

 -128 ~ 127

 short

 2 byte

 0

 -32,768 ~ 32,767

 int
(기본)

 4 byte 

 0

 -2,147,483,648 ~ 2,147,483,647

 long

 8 byte

 0L

 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

 실수형

 float

 4 byte

 0.0F

 (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값

 double
(기본)

 8 byte

 0.0  (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값

 문자형

 char

 2 byte (유니코드)

 '\u0000' 

 0 ~ 65,535

1. 선언과 할당

선언: var a; 할당: a = 10;

 

주소데이터
300 a(@500)

(선언된 a도 메모리 영역 300번에 저장이 된다.)

 

주소데이터
500 10

(a라는 변수명을 통해 값을 저장할 공간(500)을 찾고, 이를 통해 a의 값 10을 찾게 된다.)

 

즉, 변수는 데이터 자체를 할당받는 것이 아니라 메모리 영역에서 데이터가 저장된 주소값을 그 값으로 갖게 된다.

2. 값 변경

a의 값할당: a = 15;

a의 값이 변경되는 경우 새로운 메모리 공간에 변경된 값을 할당하고, a변수의 값이 가리키는 주소값을 새로운 메모리의 주소값으로 변경한다.

** 만약 15가 이미 메모리에 할당되어 있는 경우 해당 메모리의 주소값을 재활용 **

 

주소데이터
300 a(@501)
주소데이터
500 10
501 15

3. 깊은 복사

a의 값 복사:var b=a;

선언: 변수 b의 공간을 확보

할당: b의 값이 가리키는 주소값은 a의 값이 가리키는 주소값을 공유

주소데이터
300 a(@501)
301 b(@501)
주소데이터
500 10
501 15

3. 복사 값 변경

b의 값 변경: b=20;

b에 새로운 값을 할당하면 b의 주소값이 새로운 메모리 공간으로 할당되고, b의 값 또한 새로운 주소값으로 들어간다.

주소데이터
300 a(@501)
301 b(@502)
주소데이터
500 10
501 15
502 20

 

Reference Type

  • Object(array, function, map, set, weakmap, weakset)이 있으며, "값이 저장된 주소값(참조 위치)을 할당"
  • 빈 객체를 의미하는 Null이 존재한다.
  • 값이 저장된 곳의 주소값을 저장하는 공간으로 Heap 메모리에 저장
  • 문법상 에러는 없지만, 실행시켰을때 에러가 나는 Runtime Error 발생 (ex - NullPointException)

 

 타입

예시

 기본값

할당되는 메모리 크기 

 배열(Array)

 int[] arr = new int[5];

 Null

 4 byte (객체의 주소값)

 열거(Enumeration)

 

 Null

 클래스(Class)

 String str = "test";

 Student sujin = new Student();

 Null

 인터페이스(Interface) 

 

 Null

1. 선언과 할당

참조자료형의 경우 참조과정을 한번 더 거친다.

var obj = { a: 1, b: "abc"};

주소데이터
400 obj(@600)

객체는 데이터를 한번에 담을 수 없어 해당 주소값에 여러 공간을 확보해 둔다.

주소데이터
600 @1000~1001

할당받은 주소값 하나에 변수 하나씩 할당한다.

주소데이터
1000 a(@601)
1001 b(@602)

변수 하나가 가르키는 주소값에 변수 값을 할당한다.

주소데이터
601 1
602 'abc'

2. 값 변경

객체 내부의 데이터를 변경해도 객체의 주소값은 바뀌지 않는다.

obj.a=2;

 

주소데이터
400 obj(@600)
600 @1000~@1001
601 1
602 'abc'
603 2
1000 a(@603)
1001 b(@602)

3. 변수 얕은복사

새로운 객체에 obj2에 obj를 할당하면 obj의 주소값 @600을 공유하게 된다.

var obj2=obj;

 

주소데이터
400 obj(@600)
401 obj2(@600)
600 @1000~@1001
601 1
602 'abc'
603 2
1000 a(@603)
1001 b(@602)

4. 복사값 변경

obj2 내부 데이터를 변경하면 같은 주소값을 참조하는 obj까지 영향을 받게 된다.

obj2.a=3;

 

주소데이터
400 obj(@600)
401 obj2(@600)
600 @1000~@1001
601 1
602 'abc'
603 2
604 3
1000 a(@604)
1001 b(@602)

기본형 데이터를 복사했을 때, 복사된 새로운 변수에 의해 주소값이 바뀌므로 원본에는 영향을 받지 않는다.
하지만 참조형 데이터를 복사했을 때, 같은 객체를 가리키고 있기 때문에 주소값은 동일하고 원본이 영향을 받게된다.

 

3. 리터럴(literal)

리터럴이란, 프로그램에서 직접 표현한 값으로 소스코드의 고정된 값을 대표하는 용어이다.

정수, 실수, 문자, 논리, 문자열 리터럴이 존재

 

1. 정수 리터럴

  • int a= 15;는 10진수 리터럴
  • int b=015;는 8진수 리터럴(0으로 시작하면 8진수, 십진수 값으로 13((8*1)+(1*5))을 출력)
  • int c=0x15;는 16진수 리터럴(0x로 시작하면 16진수, 십진수 값으로 21((16*1)+(1*5))을 출력)
  • int d=0b0101;는 2진수 리터럴(0b로 시작하면 2진수, 십진수 값으로 5((4*1)+(2*0)+(1*1))을 출력)

정수형 리터럴은 int형으로 컴파일하며, long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시한다.

2. 실수 리터럴

  • double d=0.1234;
  • float f=0.1234f;

3. 문자(열) 리터럴

** 문자열은 기본타입이 아니다. **

  • String lter="JAVA";
  • lter+25="lter25;
  • char lter2='\uac00';(\u+유니코드값)

참고특수문자의미

\b 백스페이스
\t 탭(띄어쓰기 4번)
\f 폼 피드(form feed)
\r 그 줄의 맨 앞
\" 이중 인용부호(")
\' 단일 인용부호(')
\\ 백슬래시(\출력)

4. 논리타입 리터럴

  • boolean a= 10>0;(true)

boolean 타입의 변수에 치환하거나, 조건문에 이용 (boolean타입으로 0, 1을 거짓, 참으로 사용 X)

5. 널타입 리터럴

  • String str=null;

널 리터럴은 레퍼런스에 대입하여 사용

실수형 리터럴은 double타입으로 컴파일되며, 숫자 뒤에 f(float)나 d(double: 생략 가능)을 명시적으로 붙이기도 한다.

 

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

변수 선언: 데이터타입 변수명; -> int a;

변수 선언 및 초기와: 데이터타입 변수명=값; -> int a=7;

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

  • Scope란, 변수에 대한 접근과 변수가 존재 할 수 있는 영역을 의미한다.

      예) 중괄호{}로 하나의 영역이 생성되었다면, 그 영역에 대한 스코프를 형성

      각각의 다른 메소드에서 동일한 명의 (지역)변수 선언이 가능 -> {}, ()를 벗어나면 소멸됨

  • Life Time이란, 변수가 메모리에서 살아있는 시간을 말한다.

 

1. 인스턴스 변수

클래스의 내부 & 메소드 또는 블록의 외부에서 선언된 변수

Scope:정적 메서드를 제외한 클래스 전체

Life Time:객체가 메모리에 남아있을 때 까지

int x, y;

2. 클래스 변수

클래스의 내부 & 모든 블록의 외부에서 선언되고, static으로 표시된 변수

Scope:클래스 전체

Life Time:프로그램이 끝날때까지 또는 클래스가 메모리에 로드되는 동안

static int x, y;

3. 로컬 변수

인스턴스 및 클래스 변수가 아닌 변수

Scope:선언된 블록안에 있음

Life Time:컨트롤이 선언된 블록을 떠날때 까지

void methodEX(int a, int b)

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

1. 묵시적 타입 변환

대입 연산이나, 산술 연산에서 컴파일러가 '자동'으로 수행해주며, 데이터 손실을 발생하지 않거나 데이터의 손실이 최소화 되는 방향으로 타입 변환이 진행된다. (자바에서는 데이터 손실이 발생하는 대입 연산의 경우에는 허용 X)

byte < short < int < long < float <double < char

타입 프로모션

크기가 더 큰 자료형에 대입하는 경우 자동으로 작은 자료형이 큰 자료형으로 변환된다.

double num1 = 10; num1의 경우 double형의 변수이므로 int형인 10을 대입하면 자동으로 형변환 된다. (double > int) int num2 = 3.14; num2의 경우 int형의 변수인데 double형인 3.14를 대입하면 int형으로는 double형으로 표현할 수 없기 때문에 컴파일 오류가 생긴다. (double > int) double num3 = 7.0f+3.14; num3의 경우 float형의 데이터와 double형의 데이터 산술 연산을 수행하는 경우 데이터 손실이 최소화 되도록 float형이 double형으로 자동 타입 변환한다. (double > float)

2. 명시적 타입 변환

사용자가 타입 캐스트 연산자(='()')를 이용해 강제적으로 수행하는 타입 변환

(변환할 타입) 변환할 데이터

타입캐스트

크기가 큰 자료형을 더 작은 자료형에 대입할 때, 자료형을 '(변환할 타입)'으로 명시해서 강제로 집어넣는 것을 말한다.

int num1=1;, int num2=4;

1. 정수형의 연산 후 double형 변수로 받기

double result = num1 / num2 ;

정수형의 연산이므로 num1/num2의 연산 결과는 0.25지만 int로 반환되므로 0이된다.
0을 double형인 result로 나타내면 0.00으로 반환된다.

2. 정수형의 연산결과를 double형으로 강제 형변환하기

double result = (double)num1 / num2 ;

정수형의 연산결과는 int이지만, double형으로 형 변환 시키므로 그래도 0.25가 반환된다.
double형의 result 변수는 그대로 0.25를 받아 반환하게된다.

6. 1차 및 2차 배열 선언

배열(Array): 동일한 자료형으로 선언된 데이터 공간을 메모리 상에 연속적으로 인덱스를 부여하고, 이를 나열하여 데이터 관리 효율을 높이는 것이다.

1차 배열 선언 방법

1. 선언과 초기화를 동시에

int[] array_ex=new int[5];

2. 선언을 한 후, 나중에 초기화

int[] array_ex; array_ex=new array[5];

배열을 초기화 할때, 할당되는 크기 [5]는 배열에 0부터 4까지 인덱스를 부여한다.

2차 배열 선언 방법

1. 선언과 초기화를 동시에

int[][] array_ex=new int[3][2];

2. 선언을 한 후, 나중에 초기화

int[][] array_ex={{1, 2}, {3, 4}, {5, 6}}

7. 타입 추론, var

'타입 추론'이란 코드 작성 당시 타입이 정해지지 않았지만, 컴파일러가 그 타입을 유추하는 것으로 이는 타입을 명시하지 않아도 됨을 의미한다.

기존의 자바에서는 일반 변수의 경우에는 타입추론을 지원하지 않았으며, generics 와 lambda 식에 대해서만 타입추론을 지원했었다. 하지만 JAVA 10 에서 var 이라는 Local Variable Type - Inference 가 추가되었다.

-java 9 이하

String name = "JJM" ;

-java 10 이상

var name = "JJM";

* 주의 *

1. "var" 와 다이아몬드 연산자 "<>" 를 같이 사용하게 되면 컴파일 에러 발생

var name = new ArrayList<>();

2. IDE(통합 개발 환경: Integrated Development Environment)가 없으면, 어떤 데이터 타입이 들어오는지 확인하기 어렵다.

 

'2021 > JOB DA STUDY' 카테고리의 다른 글

Argument 와 Parameter  (0) 2020.12.21
Map  (0) 2020.12.18
Queue 와 Thread의 관계  (0) 2020.12.16
메모리 구조  (0) 2020.12.15
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가?  (0) 2020.12.15