본문 바로가기
개발자/백엔드 웹 개발자 과정(국비)

2022년 11월 14일 _ 9회차(배열)

by 초응 2022. 11. 14.

#오류

duplicate 오류 : 클래스, 변수, 메소드 중 이름이 중복되어있는 에러이다.

ArrayIndexOutOfBoundsException오류 : 없는 위치를 작성했을 경우 나온다. 배열 생성 코드를 찾아가서 수정한다.'

Syntax으로 시작하는 오류는 문법적 에러이다.


변수 :  하나의 바구니 안에는 하나에 대한 데이터만 들어간다.

배열 : 자료형이 동일한 여러 개의 값을 연속적으로 저장할 수 있도록 하는 기억공간의 집합체(동종의 데이터를 저장할 수 있는 자료구조)

ㄴ 변수 집합체라고 생각하기

 

[1차원 배열 선언 및 생성 초기화 방법]

1. 선언하기  2. 메모리 생성하기  3. 초기화하기

 

일반적인 배열 선언과 초기화 방법:

자료형 변수명 ;  <-변수 선언

변수명 = 값; <- 초기화

 

1. 선언하기 (구청신고)

자료형 []배열명 ; -> []는 지정 연산자이다.

 

2. 메모리 생성하기(건물짓기)

배열명 = new 자료형 [개수]; 

ㄴnew를 동적메모리할당키워드라고 한다.

ㄴ선언했던 동일한 자료형으로 입력해야함 

 

3. 초기화하기(입주)

배열명[인덱스]=값;

 


-배열 인덱스 = 첨자라고 부르기도한다./  0부터 시작한다.

/마지막 번호는 내가 지정한 수-1

- 초기화를 하지 않아도 기본값으로 초기화되어있다. (int :0 , double:0.0, boolean: false)

- 배열과 for문은 같이 사용함. 

지정연산자 : 값을 넣을 수도 있지만 변수도 넣을 수 있음. 

배열부터가 객체 개념이다. 배열은 레퍼런스자료형이다.


 

1. 선언+2. 메모리 생성, 3. 초기화

int arr [] = new int [개수];

arr [0] = 10;

 

1. 선언+ 2. 메모리 생성+3. 초기화

int arr [] = {1,2,3,4,5};

ㄴ 데이터가 코드에 고정된다. 데이터는 유동적이기 때문에 나중에 수정하려면 코드를 다시 작성해야 하므로 비추천.

테스트할 때 사용하면 좋다.

 

package day09;

public class Day09_01 {

	public static void main(String[] args) {
	
		//1. 선언 (구청 신고)
		int arr[];
		
		//2. 메모리 생성(건물짓기)
		arr = new int[3];
		
		//3. 초기화(입주)
		arr[0] = 10;
		arr[1] = 20;
		arr[2] = 30;
		
		System.out.println("arr[0]="+arr[0]);
		System.out.println("arr[1]="+arr[1]);
		System.out.println("arr[2]="+arr[2]);
		System.out.println("arr의 길이="+arr.length);
				
		//1(선언)+2(생성),3(초기화)
		double arr2[] = new double[5];
		arr2[0] =10.1;
		arr2[1] =20.2;
		arr2[2] =30.3;
	
		System.out.println("arr2[0]="+arr2[0]);
		System.out.println("arr2[1]="+arr2[1]);
//		System.out.println("arr2[5]="+arr2[5]);//0부터 시작하기 때문에 5는 없다는 내용의 에러가 나온다
		System.out.println("arr2[4]="+arr2[4]);//초기화를 하지 않아도 기본값들이 각 자료형의 0으로 초기화된다. 
		//boolean은 기본값 false로 초기화 된다.
		
		System.out.println("arr2의 길이="+arr2.length);
		
		/* 1+2+3(비추천) : 데이터가 고정된다. 데이터는 유동적이기 때문에 고정을 하면 코드를 다시 짜야한다.
		 *  이 방식은 테스트 할때 사용하면 좋다.
		 */
		//배열과 for문 같이 생각하기.*/
		int arr3[] = {10,20,30,40,50,60,70,80,90,100};
		
		for(int i= 0;i<arr3.length;i++) {
			System.out.println(arr3[i]);
		}		
	}
}

레퍼런스로서의 특징 1.

1. 배열이 변수이기 때문에 새로운 데이터 대입이 가능하다.

package day09;

public class Day09_02 {

	public static void main(String[] args) {

		int arr [] = {10,20,30,40,50,60,70};
		
		for(int i = 0;i<arr.length;i++) {
			 System.out.print(arr[i]+" ");
		}
		System.out.println();
		
		arr = new int[3];
		// 000이 출력된다. 변수에 담긴 주소값이 새로운값이 저장된 곳으로 주소값으로 바뀌고 위에 있던 기존의 데이터들은 쓰레기가 된다.
		
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
			
			
			/*레퍼런스로서의 특징
			 * 1. 배열이 변수이기 때문에 새로운 데이터 대입이 가능하다.
			*/
		}
	}
}

레퍼런스로서의 특징 2.

2. 배열도 배열끼리의 스왑이 가능하다

(데이터의 개수에 상관없이 스왑 가능하며 속도가 차이가 없다. (빠른 속도로 스왑 가능).

package day09;

public class Day09_03 {

	public static void main(String[] args) {
		int x[] = {10,20,30,40,50};
		
		for(int i = 0;i<x.length;i++) {
			System.out.print(x[i]+" ");
		}
		System.out.println();
		
		int y[] = {100,200,300};
		
		for(int i=0;i<y.length;i++) {
			System.out.print(y[i]+" ");
		}
		
		System.out.println();
		System.out.println("----------------------------");
		
		int temp[]=x;
		x=y;
		y=temp;
		for(int i = 0;i<x.length;i++) {
			System.out.print(x[i]+" ");
		}
		System.out.println();
		
		
		for(int i=0;i<y.length;i++) {
			System.out.print(y[i]+" ");
		}
		
		System.out.println();
		
		
		/*레퍼런스로서의 특징
		 * 1.배열이 변수이기 때문에 새로운 데이터 대입이 가능하다.
		*  2.배열도 배열끼리의 스왑이 가능하다.
		*/
		//데이터의 갯수에 상관없이 스왑 가능.
		//속도가 차이가 없다. 빠른속도로 스왑 가능하다.
	}
}

레퍼런스로서의 특징 3.

3. 주소를 복사하기 때문에 쌍둥이 변수가 생기는데 둘 다 한 데이터를 공유한다.

(한쪽에서 변경 시 쌍둥이 다른 변수에서도 변경된다.)

package day09;

public class Day09_04 {

	public static void main(String[] args) {

		
		int arr [] = {10,20,30,40,50};
		for(int i=0;i<arr.length;i++) {
			
			System.out.print(arr[i]+"  ");
			
		}
		System.out.println();
		
		int arr2[] = arr;
		arr2[2] = 1004;
		for(int i=0;i<arr2.length;i++) {
			
			System.out.print(arr2[i]+"  ");
		}
		
		System.out.println();
		
		for(int i=0;i<arr.length;i++) {
			
			System.out.print(arr[i]+"  ");
		}
		
		
		/*레퍼런스 특징
		 * 1.배열이 변수이기 때문에 새로운 데이터 대입이 가능하다.
		*  2.배열도 배열끼리의 스왑이 가능하다.(요소의 스왑이 아닌 주소에 대한 스왑)
		*  3.주소를 복사하기때문에 쌍둥이 변수가 생기는데 이때 한 데이터를 공유한다. 한쪽에서 변경시 쌍둥이 변수에서도 변경된다.
		*/

	}

}

 

레퍼런스 특징 : heap에 데이터가 저장되고 변수에는 그 데이터의 주소 값이 저장된다.

1. 새로운 데이터 대입이 가능하다.

2. 배열끼리도 스왑이 가능하다.(개수 상관없이 스왑 가능하며 속도 차이 없음)

ㄴ c언어에서는 배열의 길이가 같아야한다. 개수가 많을 수록 속도가 느리다. 

3.주소값을 공유하게 되면 쌍둥이 변수가 생기고 하나의 원본데이터를 바라본다.

한쪽에서 변경 시 쌍둥이 다른 변수에서도 변경된다.


Day 09_05. 사용자로부터 6개의 점수를 입력받아 출력하는 프로그램 작성

package day09;
import java.io.*;
public class Day09_05 {

	public static void main(String[] args) 
	throws IOException{
		
		BufferedReader br =
		new BufferedReader (new InputStreamReader(System.in));
/*
		System.out.print("점수1 입력> ");
		int num1 = Integer.parseInt(br.readLine());
		System.out.print("점수2 입력> ");
		int num2 = Integer.parseInt(br.readLine());
		System.out.print("점수3 입력> ");
		int num3 = Integer.parseInt(br.readLine());
		System.out.print("점수4 입력> ");
		int num4 = Integer.parseInt(br.readLine());
		System.out.print("점수5 입력> ");
		int num5 = Integer.parseInt(br.readLine());
		System.out.print("점수6 입력> ");
		int num6 = Integer.parseInt(br.readLine());
	
		System.out.println();
		
		int num [] = new int[6];
		num[0] = num1;
		num[1] = num2;
		num[2] = num3;
		num[3] = num4;
		num[4] = num5;
		num[5] = num6;
	
			for(int i=0;i<num.length;i++) {
				System.out.print(num[i]+" ");
			}
	*/
		int num[] = new int[6];
		
		for(int i=0;i<num.length;i++) {
			System.out.print("점수"+(i+1)+"=");
			num[i] = Integer.parseInt(br.readLine());
		}
		for(int i=0;i<num.length;i++) {
			System.out.print("점수"+(i+1)+":"+num[i]+" ");
		}
	}
}

Day 09_06. 사용자로부터 4개의 점수를 입력받아 점수와 총점과 평균을 출력하는 프로그램 작성.

package day09;
import java.io.*;
public class Day09_06 {

	public static void main(String[] args) 
	throws IOException{
		
		
		BufferedReader br =
		new BufferedReader(new InputStreamReader(System.in));
		
		int num[] = new int[4];
		int sum =0;
		
		for(int i=0;i<num.length;i++) {
			System.out.print("점수"+(i+1)+":");
			num[i]	= Integer.parseInt(br.readLine());
		}
		System.out.println();
		
		for(int i=0;i<num.length;i++) {
			sum +=num[i];
			System.out.print("점수"+(i+1)+":"+num[i]+" ");
		}
		System.out.println();
		int avg = sum/4;
		
		System.out.println("총합:"+sum);
		System.out.println("평균:"+avg);
	}
}

Day 09_07. 사용자로부터 몇 개의 점수를 입력받을 건지 확인 후 그 개수만큼 점수를 입력받아 점수와 총점 평균 출력하기.

package day09;
import java.io.*;
public class Day09_08 {

	public static void main(String[] args) 
	throws IOException{
	
		BufferedReader br =
		new BufferedReader(new InputStreamReader(System.in));
	
		System.out.print("몇개의 점수를 입력하시겠습니까?");
		int num = Integer.parseInt(br.readLine());
	
		int arr[]=new int[num];//값을 담고있는 변수로도 대입 가능
		
		for(int i=0;i<num;i++){
			System.out.print("점수"+(i+1)+":");
				arr[i] = Integer.parseInt(br.readLine());
		}
		
		int sum = 0;
		for(int i=0;i<num;i++) {
			System.out.print(arr[i]+" ");
			sum+=arr[i];
		}
		System.out.println();
		int avg = sum/num;
		System.out.println("총점:"+sum+"점");
		System.out.println("평균:"+avg+"점");
	}

}