ddit/Java

220512 java 메모리구조, 배열, JCF

ssong2ku 2022. 5. 12. 21:47
728x90

 

▶메모리의 구조

 

▷메소드영역

 -JVM이 시작될 때, 생성되고 모든 스레드(하나의 프로세스에서 독립적으로 실행되는 작업단위)가 공유하는 영

- 정적필드/ 상수, 메소드 코드, 생성자 코드

 

▷CALL STACK=JVM스택영역

-스택은 메모리구조, 실행하고있는 메소드에대한 정보

-메소드를 호출할 때마다 프레임을 추가하고 메소드가 종료되면 해당 프레임을 제거

-버켓구조=LIFO구조(Last In First Out)

 

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

-생성된 객체는 스택영역의 변수나 다른 객체의 필드에서 참조

 

 

.연산자 = 소속을 나타냄

 

▶배열

-인덱스를 부여하는 형태

=>인덱스는 0부터 차례대로 부여 기억공간의 수-1까지 사용가능!

-연속되지 않은 기억공간은 일괄적인 처리수행 불가능
-여러가지 변형가능
-객체배열, 클래스배열
 main(String[] args) =>클래스배열

 

-선언할 때는 데이터 타입 +[]

[  ]가 없다면 배열이아니라 변수!

배열에 소속될 데이터들은 중괄호 안에 위치하며 쉼표로 구분!

String[] classGroup = {"홍길동","홍길순","강감찬","조현우"};


-가장 잦은 배열오류
Array index out of BoundException에러
=>인덱스값오류
ex) int [] a = new int[10]=>배열은 10개를 가짐
a[10] =50;은 오류 =>a[10]은 11번째 배열을 나타냄


for문은 배열을 쓰는데 최적화

배열을 만드는 방법은 여러가지

public class RefVal {

	public static void main(String[] args) {
		FirstArray f1=new FirstArray();
		f1.sampleArray();
		
	}

}

class FirstArray{
	public void sampleArray() {
		int[]  num=null;
		num =new int[5];//점수
		
		//String[] name ; //객체배열=>뉴가 없어서 배열이 아직 안 만들어짐
		/*name[0]="홍길동";=>뉴가없으면 에러. 데이터가 들어갈 기억장소가 없음
		name[1]="홍길순";
		name[2]="강감찬";
		name[3]="이성계";
		name[4]="조현우";
		=>제일 무식한 방법, 하나씩 값을 초기화
		name = {"홍길동","홍길순","강감찬","이성계","조현우"};
		하지만 직접적으로 데이터를 넣지못할때는 저렇게 해야함
		*/
		//String[]name=null;
		//name = new String[]{"홍길동","홍길순","강감찬","이성계","조현우"};//잘안쓰는 방법이지만 이런방법도있다
		
		String [] name ={"홍길동","홍길순","강감찬","이성계","조현우"};// 가장 많이쓰는방법
		
		
		
		for(int i =0; i<name.length; i++) {
			System.out.print(name[i]+",");
		}
		
	}
}

 


JCF 등등 내용정리!

더보기

JAVA에서 컬렉션이란?

- 데이터의 집합, 그룹을 의미

 

JCF(JAVA Collection Framework)는?

데이터 또는 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스들을 제공.

=>배열이 가진 문제점해결


 

1. JAVA Collection Framework(JCF)

컬렉션 인터페이스는 List, Set, Queue로 크게 3가지가 분류

Map의 경우 컬렉션 인터페이스를 상속받고 있지 않지만 컬렉션으로 분류

 

2. 컬렉션 인터페이스의 특징

인터페이스 명 구현 클래스 특징
List ArrayList
LinkedList
Vector
순서가 있는 데이터의 집합,
데이터의 중복 허용
Set HashSet
TreeSet
순서를 유지하지 않는 데이터의 집합,
데이터의 중복 허용X
Queue LinkedList
PriorityQueue
List와 유사
Map Hashtable
HashMap
TreeMap
키(Key)와 값(Value)의 쌍으로 이루어진 데이터의 집합,
순서는 유지되지 않고
키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용

1) List 인터페이스

순서가 있는 데이터의 집합으로 데이터의 중복을 허용

ArrayList

- 단방향 포인터 구조로 각 데이터에 대한 인덱스를 가지고 있어 조회 기능에 성능 뛰어남.

LinkedList

- 양방향 포인터 구조로 데이터의 삽입, 삭제가 빈번할 경우 데이터의 위치정보만 수정하며 되어 용이.

- 스택, , 양방향 큐 등을 만들기 위한 용도로 사용.

Vector

- 과거에 대용량 처리위해 사용, 내부에서 자동으로 동기화처리가 일어나 비교적 성능이 좋지 않고 무거워 현재는 잘 쓰이지 x.

2) Set 인터페이스

순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용 x.

HashSet

- 가장 빠른 임의 접근속도

- 순서를 예측할 수 x.

TreeSet

- 정렬방법을 지정.

3) Queue 인터페이스

List 인터페이스와 비슷한 특징을 가지고 있으며, FIFO(First In, First Out)의 구조.

PriorityQueue(우선순위 큐)

- 저장한 순서와 관계없이 우선순위가 높은 것부터 꺼내게 된다는 특징.

4) Map 인터페이스

(Key), (Value)의 쌍으로 이루어진 데이터의 집합

순서는 유지되지 않고 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용

Hashtable

- HashMap보다는 느리지만 동기화 지원

- null 불가

HashMap

- 중복과 순서가 허용되지 않으며 null값이 허용.

TreeMap

- 정렬된 순서대로 키(Key)와 값(Value)을 저장하여 검색이 빠름

3. 배열과 컬렉션의 차이

배열은 자료형이 같은 데이터들의 모임으로,

자료형이 같아야 하며 크기가 고정되고 값을 추가하거나 삭제하는데 번거로움이 있음.

컬렉션은 자신이 필요한 인터페이스에 따라 어떤 자료형이라도 담을 수 있고,

자료의 추가/삭제가 자유로우며

데이터 크기가 자료를 담을 만큼 혹은 삭제한 만큼 변화.

 

래퍼 클래스 (Wrapper class) 란?

기본(primitive)데이터 타입을 참조형(reference)타입의 데이터로 사용할 수 있도록 감싸주는(wrap) Java 내장 클래스 (기본 타입에 해당하는 데이터를 객체로 포장)

- 래퍼 클래스는 각각의 타입에 해당하는 데이터를 인수로 전달받아, 해당 값을 가지는 객체로 만듦

- 래퍼 클래스는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없음.

단지, 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있음

 

[래퍼 클래스 사용 이유]

- 프로그램에 따라 기본 타입의 데이터를 객체로 취급해야 하는 경우에 사용(ex : 데이터 파싱 및 형변환 시)

- 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수 x

이때에는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행

 

=배열확장한 컬렉션프레임워크에 데이터가 들어갈수있음

 

728x90