보안 전공생의 공부

참조 타입 | 배열 본문

Language/JAVA

참조 타입 | 배열

수잉 2021. 1. 17. 23:20

 

출처 : https://kingpodo.tistory.com/54

http://www.tcpschool.com/java/java_datatype_basic

https://velog.io/@gkscodus11/%EC%9E%90%EB%B0%94%EC%9D%98-%EC%B0%B8%EC%A1%B0%ED%83%80%EC%9E%85

http://www.tcpschool.com/java/java_array_oneDimensional

 

프로그램 = 자료구조(데이터) + 알고리즘

☞ 자료구조를 통해 데이터 구상

☞ 알고리즘을 통해 문제 해결

 

따라서 데이터를 얼마나 잘 다루르냐가 좋은 프로그램을 작성할 수 있는 관건 !

 

 

◆ 데이터 타입 분류

 

· 타입(data type) : 해당 데이터가 어떻게 저장되고, 프로그램에서 어떻게 처리되어야 하는지 명시적으로 알려주는 역할

 

출처 : https://kingpodo.tistory.com/54

 

 - 기본타입(primitive type) : 정수, 실수, 논리 리터럴 저장하는 타입

 - 참조타입(Reference type) : 객체의 번지를 참조하는 타입 → 배열, 열거, 클래스, 인터페이스 타입

 

▶기본타입

 

실제 값을 변수 안에 저장

 

1) 정수형 타입

정수형 타입

할당되는 메모리의 크기

데이터의 표현 범위

byte

1바이트

-128 ~ 127

short

2바이트

-215 ~ (215 - 1)

-32,768 ~ 32,767

int

4바이트

-231 ~ (231 - 1)

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

long

8바이트

-263 ~ (263 - 1)

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

정수형 타입

할당되는 메모리의 크기

데이터의 표현 범위

byte

1바이트

-128 ~ 127

short

2바이트

-215 ~ (215 - 1)

-32,768 ~ 32,767

int

4바이트

-231 ~ (231 - 1)

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

long

8바이트

-263 ~ (263 - 1)

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

 

- 정수형 데이터 타입을 결정할 때, 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 함

→ 표현할 수 있는 범위를 벗어난 데이터 저장시 오버플로우/ 언더플로우 발생

( 오버플로우 : 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생

→ 최상위 비트(MSB)를 벗어난 데이터가 인접 비트를 덮어쓰므로 잘못된 결과 얻게 됨)

( 언더플로우 : 해당 타입이 표현할 수 있는 최소 범위보다 작은 수 저장할 때 발생)

타입별로 표현할 수 있는 범위 내인 경우와 범위 밖인 경우 출력프로그램이다.

 

2) 실수형 타입

 

실수형 타입

지수의 길이

가수의 길이

유효 자릿수

float

8 비트

23 비트

소수 부분 6자리까지 오차없이 표현할 수 있음.

double

11 비트

52 비트

소수 부분 15자리까지 오차없이 표현할 수 있음.

 

실수형 타입

할당되는 메모리의 크기

데이터의 표현 범위

리터럴 타입 접미사

float

4바이트

(3.4 X 10-38) ~ (3.4 X 1038)

F 또는 f

double

8바이트

(1.7 X 10-308) ~ (1.7 X 10308)

D 또는 d (생략 가능함)

 

- 실수형 데이터 타입을 결정할 때, 표현 범위뿐만 아니라 유효자릿수도 고려해야 함

- 오차가 발생할 수 밖에 없는 한계를 지님

 

3) 논리형 타입

- 참(true) / 거짓(false) 中 한 가지 값만 가질 수 있는 불리언 타입

논리형 타입

할당되는 메모리의 크기

데이터의 표현 범위

boolean

1바이트

true 또는 false

 

- 기본 값 = false;

 

▶ 참조타입

 

메모리의 주소를 값으로 갖는 변수

 주소를 통해 객체를 참조

출처 : https://m.blog.naver.com/PostView.nhn?blogId=jaeyoon_95

c1과 c2는 같은 값으로 보이지만,

서로 참조하고 있는 객체(힙 영역에서 생성된 객체)가 서로 다르므로 주소가 다르다!

 

 

◆ 메모리 사용

 

java.exe 프로그램 실행하면 JVM(Java Virtual Machine)이 실행됨

JVM은 운영체제에서 할당받은 메모리 영역(Runtime Data Area)을 메소드 영역(Method Area), 스레드 영역(Thread Area), 힙 영역(Heap area), 스택 영역(Stack Area)

 

출처 : http://www.tcpschool.com/java/java_array_memory

 

1) 메소드 영역

- 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 런타입 상수풀, 필드 데이터, 메소드 데이터. 생성자, static 변수 등이 생성되는 영역

- 모든 스레드가 공유하는 영역

( 스레드 : 하나의 프로세스 내에서 실행되는 단위)

- JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 해당 클래스에 해당하는 정보를 메소드 영역에 저장함

 

2) 힙 영역

- 객체와 배열이 생성되는 영역

- JVM영역의 변수나 다른 객체의 필드에서 참조

- 만약 참조하는 변수/필드가 없으면 JVM은 쓰레기 수집기(Garbage Collector)를 실행시켜 힙 영역에서 자동으로 제거

- 낮은 주소에서 높은 주소 방향으로 할당

 

3) 스택 영역

- 지역변수, 파라미터, 리턴 값, 연산에 사용되는 임시 값 등이 생성되는 영역

- 메소드 호출할 때마다 스택 영역 생성됨

- 선언된 블록 내에서만 존재

- push : 데이터 저장 / pop : 데이터 인출

 

 

◆ 배열

 

- 같은 타입의 변수들로 이루어진 유한 집합

- 각각의 값 = 배열요소(element)

- 위치를 가리키는 숫자 = 인덱스(index)

 

▶ 1차원 배열

 

· 선언

- 타입[] 배열이름 ;

- 타입 배열이름 ;

 

· 생성

- 배열이름 = new 타입[배열길이] ;

 

· 선언+생성

- 타입[] 배열이름 = new 타입[배열길이] ;

▶ 다차원 배열

 

· 선언 및 생성

- 타입[][] 배열이름 ;

- 배열이름 = new 타입[배열길이][배열길이] ;

 

· 초기화

- 타입 배열이름[행][열] = { { 1, 2 }, { 3, 4 }, { 5, 6 } } ;

1

2

3

4

5

6

 

▶ 가변배열 : 다양한 길이의 1차원 배열을 가지고 있는 배열, '배열의 배열' 이라고 표현함

 

· 선언 및 생성

- 타입[][] 배열이름 = new 타입[N][];

( N : 1차원 배열의 개수)

( 출처 : https://blockdmask.tistory.com/311 )

ex)

int[][] arr = new int [2][] ;

arr[0]=new int[2] ; arr[1]= new int[4] ;

arr[0][0]

arr[0][1]

 

arr[1][0]

arr[1][1]

arr[1][2]

arr[1][3]

 

※ 배열의 길이보다 적은 수의 배열 요소만 초기화할 경우 → 나머지 배열 요소들은 배열의 타입에 맞게 자동으로 초기화됨

배열의 타입

초깃값

char

'\u0000'

byte, short, int

0

long

0L

float

0.0F

double

0.0 또는 0.0D

boolean

false

배열, 인스턴스 등

null

 

Comments