재밌고 어려운 IT를 이해해보자~!

배열(Array) 본문

코리아IT핀테크과정

배열(Array)

언제나즐거운IT 2023. 11. 23. 15:02

다음 변수 선언이 메모리에 어떤 영향을 미치는지 알아보자.

int stu1=80;
int stu2=15;
int stu3=60;

int ->4바이트 공간을 만들고 만들면 주소가 나온다 하지만 복잡함으로 stu1로 지정.
상위 코드는 메모리에 공간을 3개를 만든다. 총 12바이트
초기화(값 설정이) 되지않은 변수 출력 xxxx
변수가 생성될 수 있는 공간 위치는 랜덤하다. 주소값은 생성될때마다 바뀐다.

배열이란 ?


여러개의 변수를 깔끔하게 정리해서 
한 공간에 저장할수있도록 하는 "자료형"

이점-
1. 보다 더 많은 공간을 활용할 수 있음
2. 데이터를 접근할때 보다 빠르게 접근가능 

 

배열선언 !

int[] stuArr = new int[3];

new 연산자 ★
개발자 전용 메모리 공간(Heap 메모리) 에 
데이터를 생성해주세요!~~~
= 연산자 보다 new 연산자가 먼저다.
int 배열 공간을 만든다. -> 주소가나오고 이름을 stuArr이라고 붙임. -> new연산자 (힙 메모리에 만들어달라는 연산)
-> int3개짜리 공간을 heap메모리에 생성 그 주소를 stuArr공간에 저장.

자바의 메모리 구조

 

즉 int[] stuArr = new int[3]; 이란

Stack 메모리영역에 int 배열 공간을 만들면 주소가 나오고 그이름을 stuArr이라고 지정.

그이후 new 연산자를 통해 heap 메모리영역에 공간을 생성하면 주소가 나온다! 

그 주소를 Stack메모리영역에 있는 stuArr공간에 저장.

 

실제로 stuArr 을 출력하면 주소값이 나온다. 

System.out.println(stuArr); 

출력값:

해쉬값

이 주소값은 heap메모리영역에 생성된 공간 주소이며 해시값이다.

 

해시값이란?

해시(Hash)는 입력 데이터를 고정된 길이의 데이터로 변환된 값을 말한다.  다른 말로는 '해시 값(Hash value), 해시 코드, 체크섬' 이라고도 한다. 이러한 해시는 앞으로 알아볼 '해시 함수'에 의해서 얻게 된다.. 간단하게 말하자면, 데이터의 KEY 값이 해시 함수를 통해서 변환된 간단한 정수이다. 이렇게 정수로 변환된 해시는 배열의 인덱스, 위치, 데이터 값을 저장하거나 검색할 때 활용된다고 한다.

하지만 해시값 ==  주소값은 아니다! 같은 주소를 가지고있어도 다른 해시값을 가질 수 있다. 좀 더 깊은 공부가 필요해 보인다...

 

배열에 요소를 넣는법

stuArr[0] = 80;
stuArr[1] = 15;
stuArr[2] = 50;

 

배열을 출력하는법

 특정배열의 value만 궁금할때
 forEach문 (향상된 for문)


 for(자료형 임의의 변수 : 배열명) {

 }

 

또는 

System.out.println(Arrays.toString(stuArr)); 

으로 배열모양 자체를 문자열로 만들어서 출력 할 수 있다!

 

 

 

 

배열의 최대값, 최대값인덱스

 

다음 배열의 최대값, 최대값인덱스를 찾는 코드를 만들기 위해 디버깅표를 만들어보자.

 

디버깅 표

 

디버깅표를 토대로 코드를 짜보자.

      	// 1. 최대값 찾기 알고리즘 
		// 5개의 서로다른 정수 데이터를 저장한 배열이 존재합니다.
		// 가장 큰 값을 가진 index의 위치와
		// 그 값(가장 큰 값)을 출력해주세요!!!
		
		int[] numArr = new int[5];
		for (int i=0; i<numArr.length; i++) {
			numArr[i] = (int) (Math.random()*100+1);
		}
		System.out.println(Arrays.toString(numArr));
		int maxIndex=0;
	
		// max 현재 에쌍중인 가장 큰 값
		
		// maxIndex -> max가 저장된 index 위치
		
		// O(권장) 비교를 [1] index부터 [4] index까지
		// 비교를 2번째 데이터부터 5번째 데이터까지
		// for 문 !
		for (int i=1; i<numArr.length; i++) {
			if (numArr[maxIndex] <numArr[i]) {
				numArr[maxIndex] = numArr[i];
				maxIndex = i;
			}
		}
		System.out.println("최대값 : " + numArr[maxIndex]);
		System.out.println("최대값인덱스 : " + maxIndex);

 

 

자료구조 : 데이터 관리를 유이하게 해보자
다양한 자료형을 공부함
메모리 관리 용이 >> 배열


알고리즘 : 문제를 좋게 해결하는 과정을 생각해보자
자료형과 관련된 로직을 공부함
효율성,속도가 빨라짐, 성능이 좋아짐


[배열과 관련된 알고리즘(로직)]
1. 최대값(최소값) 찾기 알고리즘
2. 탐색(검색) 알고리즘 : search / 일반 검색, 최적화된 검색 ->이진탐색이 제일빠름
탐색 알고리즘을 사용하려면, 특히 최적화된 검색을 하려면 정렬을 반드시 선행해야만한다.

-> 정렬이 되어있는 상태로 진행해야한다.
3. 정렬 알고리즘 : 빠른 탐색(검색)을 위한 전제조건
4. 중복제거 알고리즘 : 랜덤값으로 배열을 저장한다면 중복이될수있음!- > 중복값이 안나오도록 코딩

 

배열에 랜덤값 저장하고 출력하기

package class03;

import java.util.Random;

public class Test02 {
	public static void main(String[] args) {
		
	//우리가 원하는대로 값 저장하기
    //1. 랜덤값 저장
    //2. 외부에서 값을 입력받는 방법
		
		int[] datas=new int[5];
		Random rand = new Random();// -> Random은 클래스!!!!!도있구나 ..?
		for(int i=0; i<datas.length; i++) {
			datas[i] = rand.nextInt(1000); //Math.rand() 는 0<x<1 사이 랜덤값!
			// rnad.nextInt(1000) 
			// 0~999
		}
		
		System.out.print("[ ");
		for(int data : datas) {
			System.out.print(data + " ");
		}
		System.out.println("]");
		
//		int, double, String 등으느 원시타입이라 바로 갑 저장가능
//		
//		int[](배열),Random(클래스, 객체),.args.clone(). 등은 힙 메모리영역에서 생성하여 사용할수있음 
//		즉 new 연산자를 사용해야만한다!!!

//		=========================================
		
		//Random, Scanner ...등
		// 만들어진 클래스(객체)들이 엄청많음
//		클래스들이 너무 많기때문에
//		서랍에 저장을 예쁘게 정리해놧습니다 ^^
//		패키지(라이브러리)
		
		
		
	}
}

 

 

배열수업 과제

package class03;

import java.util.Random;

public class Test04 {
	public static void main(String[] args) {
		
//		랜덤 정수를 5개 저장할수있는 배열이 있습니다
//		1~6까지 랜덤하게 저장해주세요
//		
//		1) 2가 몇번 나왔는지
//		2) 총합이 몇인지
//		3) 평균이 몇인지 >> 0.00 소수점까지 
//		출력해주세요!!!!!!!!!
		
		int count=0;
		int total=0;
		double avg=0;
		int[] randArr = new int[5];
		Random rand = new Random();
		for (int i=0; i<randArr.length; i++) {
			randArr[i] = rand.nextInt(5)+1;
		}
		
		for (int arr : randArr) {
			System.out.print(arr + " ");
		}
		
		
		for (int i=0; i<randArr.length; i++) {
			if (randArr[i] == 2) {
				count ++;
			}
		}
		
		for (int i=0; i<randArr.length; i++) {
			total += randArr[i];
			avg = total/(randArr.length*1.0);
			}
		
		System.out.println("\n\n2가 나온 횟수 : " + count);
		System.out.println("\n총합 : " + total);		
		System.out.print("\n평균 : ");
		System.out.printf("%.2f", avg);
		
	}
}

결과값

 

탐색 알고리즘 - 일반검색

package class03;

import java.util.Random;

public class Test05 {

	public static void main(String[] args) {
		
		// 일반검색
		// 1~10중에 5개의 정수를 저장
		
		Random rand = new Random();
		int[] datas=new int[5];
		for (int i=0; i<datas.length; i++) {
			datas[i]=rand.nextInt(10) +1;
		}
		for(int data: datas) {
			System.out.print(data + " ");
		}
		System.out.println();
		
		
		int key=2; //우리가 찾을 함수
		
		int keyIndex=-1; // 우리가 찾을 함수가 존재하는 위치.index
		//초기화는 무조건 0으로 해주는것이 아니다. 지금같은 상황은 초기화가 없는게 맞다.
		// 검색시 초기화값은 "대상의 범위가 아닌값"으로 해야합니다!!!!!
		for (int i=0; i<datas.length; i++) {
			if(key == datas[i]) {
				keyIndex=i;
				System.out.println("찾았다!");
				break; // 찾았으면 즉시 종료
			}
		}
		
		//찾는값이 없을 수 있기 때문에 if문으로 조건을 설정해줘야한다.
		if(keyIndex>=0) {
		System.out.println("찾는 값"+key+ "["+keyIndex+"]에 있습니다.");
		} else {
			System.out.println(key+"는 없습니다........");
		}
		
		
	}
	
}

 

'코리아IT핀테크과정' 카테고리의 다른 글

버블정렬 코드 개선  (0) 2023.11.27
이진 탐색(Binary Search)  (2) 2023.11.26
학생부 프로그램 제작  (2) 2023.11.25
형변환, 반복문  (0) 2023.11.22
JAVA, Class, 함수, 디버깅표  (0) 2023.11.22
Comments