HRD_훈련/JAVA

[JAVA] 배열과 Random (5일차)

리드미. 2023. 5. 19. 18:55
728x90
반응형

<오늘의 학습>

1. 배열

2. 이차원 배열

3. 삼차원 배열

4. Random

 

 

1. 배열

자료형이 같은 자료 여러 개를 한 번에 관리할 수 있으며, 자료가 연속으로 나열된 자료 구조이다. 즉, 동일 자료형의 기억장소 집합체를 표현한다.

  1. int a=10; //변수(단독 주택에 비유)
    int b=20;
    int c=30;
  2. int arr[] = new int[3]; //배열(아파트에 비유)
    arr[0]=10;
    arr[1]=20;
    arr[2]=30;

 


1) 배열의 특징

  1. 배열의 장점 : 자료를 일괄 처리할 수 있다.
  2. 배열 순서는 0번부터 시작한다.
  3. 지역변수라도 자동 초기화가 된다.
  4. 배열은 new 연산자를 사용하여 생성한다. ex) int arr[]=new int[3];
  5. new연산자는 heap영역에 메모리를 할당받는다.
  6. cf(일반변수) : stack영역에 변수를 할당한다.
  7. 배열,클래스:new 연산자를 사용하여 heap 영역에 메모리를 할당받기 때문에 레퍼런스 자료형이라고 한다.
        ex) Test01 test01=new Test01[];
               └레퍼런스 변수(클래스 변수)&인스턴스&객체
  8. Garbage Collection(가비지 컬렌션) : 쓰레기 수집기
       - JVM에는 Garbage Collector가 존재한다.
       - 가비지 컬렉터는 더 이상 참조되지 않는 Garbage라고 불리는 불필요한 메모리를 알아서 정리해주는 역할을 한다.

 

  • stack영역 : 정적변수가 할당 됨(일반변수 선언,메서드가 포함됨)
  • heap영역 : 동적변수가 할당 됨(new 객체생성, new 배열생성)
  • 가비지 컬렉션 : JVM의 RunTime Data Area에서 사용하지 않은 heap메모리의 내용을 삭제하는 것.

 

 


2) 배열 선언 형식

  • 자료형[] 배열명;
  • 자료형 배열명[];
     배열명 = new 자료형[요소 갯수]; //위에서 선언 후 요소 갯수 넣기
    ex) int arr[];
           arr=new int[3];

  • 자료형[] 배열명 = new 자료형[요소갯수]; //선언과 동시에 생성
    ex) int arr[]=new int[3];

  • 자료형 배열명[]={초기값,초기값,,,}; //선언과 동시에 초기값을 준다
    ex) int a[]={10,20,30};

 

 


 예제) 배열 선언 및 값 초기화

		int a[]={10,20,30};
		for(int i=0;i<a.length;i++){
			System.out.printf("a[%d]:%d\n",i,a[i]);
		}
a[0]:10
a[1]:20
a[2]:30

 

 


 예제) 배열의 자동 초기화

	int max=1000;
	int hi=3;
	static int a;

	public static void main(String[] args) {
		//main()메서드가 static되어 있기 때문에 main()안에서는 static이 붙은 전역변수만 사용 가능함
		//main()안에서 객체 생성하면 static으로 선언하지 않아도 사용이 가능함

		int max=100;
		Practice p=new Practice();

		System.out.println(p.max);	//전역 변수 1000
		System.out.println(max);	//지역 변수 100
        
		System.out.println(a);	//0 출력. 전역 변수 a는 자동 초기화된다.
		int b; //지역 변수 b는 자동초기화가 되지 않는다.
		System.out.println(b); //오류. 지역 변수는 자동초기화가 되지 않는다.

		int c[]=new int[3];
		System.out.println(c[0]);	//0 출력. 배열은 자동으로 초기화된다.
		
	}//main_end
1000
100
0
0
  1. 전역변수:메서드 밖에서 선언된 변수로 자동으로 값이 초기화된다.
  2. 지역변수:자동으로 값이 초기화되지 않는다.
  3. 배열:지역변수일지라도 자동으로 초기화가 된다.
     

 


 예제) 배열끼리의 값 할당

		int a[]={10,20,30};
		int b[];//선언
		b=a;//a값을 b에 할당
		
		for(int i=0;i<a.length;i++){
			System.out.printf("a[%d]:%d, b[%d]:%d\n",i,a[i],i,b[i]);
		}
a[0]:10, b[0]:10
a[1]:20, b[1]:20
a[2]:30, b[2]:30

 

 

 

2. 이차원 배열

  • 행렬을 이용하여 평면을 구현하기 위한 배열
  • 이차원 이상으로 구현한 배열을 다차원 배열이라고 한다.
		int a[][]={{10,20},{30,40,50}};
		System.out.println("배열 a의 행 갯수:"+a.length);
		System.out.println("a[0] 열 갯수:"+a[0].length);
		System.out.println("a[1] 열 갯수:"+a[1].length);
배열 a의 행 갯수:2
a[0] 열 갯수:2
a[1] 열 갯수:3

 

 


 예제) 이차원 배열 출력

		int row,column;
		for(row=0;row<a.length;row++){
			for(column=0;column<a[row].length;column++){
				System.out.print(a[row][column]+" ");
			}//inner_for_end
			System.out.println();//줄바꿈
		}//for_end
10 20 
30 40 50

 

▷ 위 예제에서 행렬 표시

		for(row=0;row<a.length;row++){
			for(column=0;column<a[row].length;column++){
				System.out.printf("a[%d][%d]:%d\n",row,column,a[row][column]);
			}//inner_for_end
			System.out.println();//줄바꿈
		}//out_for_end
a[0][0]:10
a[0][1]:20

a[1][0]:30
a[1][1]:40
a[1][2]:50
a[0] 10 20  
a[1] 30 40 50

 

 


 예제) 이차원 배열 내용 출력

		double ki[][]={{162.5,175.5},{163.7,188.8}};

		for(int i=0;i<ki.length;i++){
			for(int j=0;j<ki[i].length;j++){
				System.out.print(ki[i][j]+"\t");
			}//inner_for_end
			System.out.println();
		}//out_for_end
162.5	175.5	
163.7	188.8

 

 

 

3. 삼차원 배열

 예제) 삼차원 배열 출력

		/*삼차원 배열 출력
		abc
		def

		ghi 
		jkl
		 */
		
		char c[][][]={
				{{'a','b','c'},{'d','e','f'}},
				{{'g','h','i'},{'j','k','l'}}
		};
        
		//출력
		for(int i=0;i<c.length;i++){
			for(int j=0;j<c[i].length;j++){
				for(int k=0;k<c[i][j].length;k++){
					System.out.print(c[i][j][k]);;

				}
				System.out.println();
			}
			System.out.println();
		}
abc
def

ghi
jkl

 

위 예제에서 선언할 때 값을 넣지 않고 'a'부터 'l'까지 초기 값을 넣어서 출력

		char arr[][][]=new char[2][2][3];
        
		//abc/def/ghi/jkl 초기값 넣기
		char ch='a';
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[i].length;j++){
				for(int k=0;k<arr[i][j].length;k++){
					arr[i][j][k]=ch;
					ch++;
				}
			}
		}
        
		//출력
		for(int i=0;i<arr.length;i++){
			for(int j=0;j<arr[i].length;j++){
				for(int k=0;k<arr[i][j].length;k++){
					System.out.print(arr[i][j][k]);;

				}
				System.out.println();
			}
			System.out.println();
		}
abc
def

ghi
jkl

 

 

 

4. Random

  • Math 참고 사이트 : https://docs.oracle.com/javase/1.5.0/docs/api/
  • 0 < Math.random() < 1
  • Math.random()*갯수+나올 수 있는 가장 작은 수
  • Math.random()*(큰 수-작은 수+1) +1 : 1부터 값이 시작될 때 큰 수와 작은 수 값을 이용할 수도 있다.
  • Math.random() 은 double형으로 출력되기 때문에 정수형으로 받고 싶다면 정수형으로 강제 형변환을 해주어야 한다.

 

 


 예제) 주사위 값을 랜덤으로 5번 출력

		/*
		int a=(int)(Math.random()*가지수+나올 수 있는 가장 작은 수);

		주사위가 나올 수 있는 총 숫자:6개
		int a=(int)(Math.random()*6+1); // 1~6까지의 랜덤 숫자가 a에 저장된다.
		 */

		//주사위 5번 돌리기
		for(int i=0;i<5;i++){
			int random_num=(int)(Math.random()*6+1);
			System.out.println(random_num);
		}
5
1
5
3
1

 

 


 예제) 로또 번호를 랜덤으로 출력

		/*랜덤 로또 번호(1~45) 출력*/
		int lotto[]=new int[6];//선언&생성

		for(int i=0;i<lotto.length;i++){
			lotto[i]=(int)(Math.random()*45+1);
			for(int j=0;j<i;j++){
				if(lotto[i]==lotto[j]){//이미 나온 값이 들어가면 무효화. 다시 랜덤 출력
					i--;
					break;//inner_for_out
				}//if_end
			}//inner_for_end
		}//out_for_end

		//출력
		System.out.print("로또 번호:");
		for(int i=0;i<lotto.length;i++)
			System.out.print(lotto[i]+" ");
로또 번호:38 5 13 23 6 20

 

 

 

 

 


2023년 5월 18일 목요일

<5일차 수업 후기>

예전에 C언어를 배울 때, rand() 함수를 이용해서 랜덤 값을 받아왔던 적이 있었다. C언어에서는 srand 함수와 time 함수를 이용하지 않으면 랜덤 값이 매번 똑같이 출력됐는데 JAVA에서는 다른 함수를 추가로 사용하지 않아도 값이 계속 바뀌어서 신기했다.

이번주 주말에는 로또 번호를 입력하고, 로또 번호를 뽑아서 당첨됐는지 출력하는 코드를 만들어보고 싶다.

728x90
반응형