본문 바로가기
뒷북 정리 (국비 교육)/java

[Java] step08. Array

by 규글 2022. 4. 17.

step08. Array

- 01

		// int type 5 개를 저장하고 있는 배열
		int[] nums= {10, 20, 30, 40, 50};
		// double type 5 개를 저장하고 있는 배열
		double[] nums2= {10.1, 10.2, 10.3, 10.4, 10.5};
		// boolean type 5 개를 저장하고 있는 배열
		boolean[] truth= {true, false, false, true, true};
		
		// String type (참조 데이터 type) 5 개를 저장하고 있는 배열
		String[] names= {"김구라","해골","원숭이","주뎅이","덩어리"};
		
		// 배열의 각각의 방 참조 하기 
		int result1=nums[0]; // 10
		double result2=nums2[1]; // 10.2
		boolean result3=truth[2]; // false
		String result4=names[3]; // "주뎅이"
		
		// 배열 객체의 method와 field 사용해 보기
		int[] cloned=nums.clone();
		int size=nums.length;

 array 배열이라고 하고, javascript에서의 그 array이지만 그것과는 많이 다르다. javascript에서는 대괄호 [ ] 로 만들었지만 java에서는 중괄호 { } 로 array를 만든다. array는 reference data type인데, 대괄호는 data type에 바로 붙여서 만든다. array에 점을 찍어서 참조할 수 있고, 방은 0번부터 시작한다. 그리고 array의 방의 개수가 정해지면 바꿀 수 없어서 늘리거나 줄이는 것이 불가능하다. (방의 크기 고정) 가변 배열은 나중에 배워야 한다.

 

- 02

		// 0 으로 초기화된 방 3개짜리 int[] 객체 만들어서 참조값을 지역 변수 nums 에 담기 
		int[] nums= { 0, 0, 0};
		nums[0]=10;
		nums[1]=20;
		nums[2]=30;
		// 0 으로 초기화된 방 3개짜리 int[] 객체 만들어서 참조값을 지역 변수 nums2 에 담기 
		int[] nums2=new int[3];
		nums2[0]=100;
		nums2[1]=200;
		nums2[2]=300;
		// nums2[3]=400; // ???  없는 방번호를 참조 하면 Exception 이 발생한다.

 array를 만드는 두 가지 방법이 있다. 첫 번째는 중괄호 { }로 array 객체를 만들면서 각 자리에 값을 미리 넣어주는 방법이다. 두 번째는 new를 통해 array 객체를 만들면서 방의 개수를 정해주는 방법이다. 이전에 class를 배웠을 때 Car class가 있었는데, 'Car car1=new Car( );' 처럼 객체를 만들었다. Car type 객체를 만들면서 new를 사용해서 Car class에 있는 constructor(생성자)를 호출하는 방식이었다면, 여기에서는 int[ ] type array 객체를 만들면서 new를 사용해서 int[N] 으로 array의 방의 개수를 정해주는 방식이라고 생각하면 될 것 같다.

 

 만약에 없는 방 번호를 참조하게 되면 위와 같이 console 창에서 exception message를 볼 수 있다. 해당 exception의 이름에서도 알 수 있듯, array의 index가 bound된 것보다 벗어났을 경우임을 유추할 수 있다.

- 03

		// String type 을 담을수 있는 방 3개짜리 빈 배열객체를 만들어서 참조값을 지역변수
		// names 에 담기 
		String[] names= {null, null, null};
		// 각각의 방에 순서대로 String type 담기 
		names[0]="김구라";
		names[1]="해골";
		names[2]="원숭이";
		
		String[] names2=new String[3];
		names2[0]="주뎅이";
		names2[1]="덩어리";
		names2[2]="개다리";

 int[ ] type array 객체의 초기 값을 0으로 줬듯, String[ ] type array 객체를 만들 때 null을 사용했다. 물론 꼭 null로 초기화할 필요는 없긴 하다.

 

- 04

		/*
		 *  1. Bike 객체를 담을수 있는 방 3개짜리 배열객체를 생성해서 참조값을 
		 *     bikes 라는 지역 변수에 담아 보세요.
		 *  2. 배열의 각각의 방(0,1,2번) 에 Bike 객체를 생성해서 담아 보세요.
		 *  3. 반복문 for 를 이용해서 배열의 각각의 방에 있는 Bike 객체의 
		 *     ride() 메소드를 호출해 보세요.
		 */
         
		Bike[] bikes=new Bike[3];
		// bikes[0]=new Bike();
		// bikes[1]=new Bike();
		// bikes[2]=new Bike();
		for(int i=0; i<bikes.length; i++) {
			bikes[i] = new Bike();
			// i번째 방에 있는 Bike 객체의 참조값 불러오기
			Bike tmp=bikes[i];
			// Bike 객체의 메소드 호출하기 
			tmp.ride();
		}

 array를 하나 만들고, 해당 array에 for loop를 통해서 값을 넣는 예시이다. 반복문 for loop의 구성은 javascript에서와 같다. 이때 for loop 안에서 local variable들이 만들어지고 사라지는 것을 반복하는데, 이런 변수를 temporary variable(임시 변수) 라고 한다. 주로 tmp라고 만들어 쓴다고 했다.

 

 

 debugging 과정에 breaking point를 주고 살펴보면 loop가 돌 때마다 i와 tmp가 지워지고 다시 만들어지는 모습을 확인할 수 있다. 이들은 loop가 끝나 for를 벗어나게 되면 사라진다. 나머지 variable들은 main method가 종료되면 전부 사라지게 된다.

 

 

- 05 ~ - 10

앞으로 나올 것들음 모두 예시이다.

		// 1. Rect 객체를 담을수 있는 방 3개짜리 배열객체를 생성해서 참조값을
		// rects 라는 이름의 지역 변수에 담아 보세요.
		Rect[] rects=new Rect[3];
        
		// 2. 배열에 Rect 객체 3개를 순서대로 담아 보세요.
		rects[0]=new Rect(10, 20);
		rects[1]=new Rect(10, 30);
		rects[2]=new Rect(10, 40);
        
		// 3. 반복문 for 문을 이용해서 각각 4각형의 면적을 콘솔창에 출력해 보세요.
		for(int i=0; i<rects.length; i++) {
			// 배열의 i번째 방에 있는 Rect 객체의 참조값을 불러온다.
			Rect tmp=rects[i];
			int area=tmp.getArea();
			System.out.println(area);
		}

 

		/*
		 *  1. Scanner 객체를 이용해서 문자열을 5번 입력 받는다.
		 *     입력 받은 문자열은 차례대로 배열에 저장 되어야 한다.
		 *     모두다 입력 받은후 for 문을 이용해서 배열에 저장된 
		 *     모든 문자열을 콘솔창에 순서대로 출력하는 코드를 작성해 보세요.
		 */
         
		// Scanner 객체를 생성해서 참조값을 지역 변수에 담기
		Scanner scan=new Scanner(System.in);
        
		// 문자열(String) 5개를 담을수 있는 배열 객체 생성해서 참조값을 지역변수에 담기
		String[] msgs=new String[5];
		
		// 5번 문자열을 입력 받기 위해 for 문을 구성한다. 
		for(int i=0; i<5; i++) {
			System.out.println("문자열 입력:");
			String str=scan.nextLine();
            
			// 입력받은 문자열의 참조값을 배열에 순서대로 저장하기
			msgs[i]=str;
		}
		
		for(int i=0; i<msgs.length; i++) {
			// i번째 방에 있는 String  객체의 참조값을 불러온다.
			String tmp=msgs[i];
            
			// 콘솔에 출력한다.
			System.out.println(tmp);
		}

 

		/*
		 * 2. Random 객체를 이용해서 로또 번호를 6개 렌덤하게 얻어내서
		 *    배열에 저장한다.
		 *    모두다 저장이 되면 for 문을 이용해서 배열에 저장된 모든 로또 번호를
		 *    콘솔창에 순서대로 출력하는 코드를 작성해 보세요.
		 */
         
		Random ran=new Random();
        
		// 로또 번호를 저장할수 있는 방 6개짜리 배열 객체 생성하기 
		int[] nums=new int[6];
        
		// 반복문 돌면서 로또번호 6개를 얻어낸다.
		for(int i=0; i<6; i++) {
			int rottoNum=ran.nextInt(45)+1;
            
			// 순서대로 저장하기 
			nums[i]=rottoNum;
		}
		
		for(int i=0;i<nums.length; i++) {
			int tmp=nums[i];
			System.out.println(tmp);
		}

 

/*   
 *   hint 
 *   
 *   String[] items={"cherry", "apple", "banana", "melon", "7"};
 *  
 *   1. cherry, apple, banana, melon, 7
 *      5개의 문자열 중에서 1개가 랜덤하게 출력되게 해 보세요.
 *   
 *   2. 5개의 문자열 중에서 3개가 한줄에 한번에 랜덤하게 출력되게 해 보세요.
 *      예)  cherry | apple | cherry
 *           7 | apple | melon
 *           7 | 7 | 7
 *      
 */
 
 		// 랜덤하게 출력할 문자열을 미리 배열에 담아 놓는다. 
		String[] items={"cherry", "apple", "banana", "melon", "7"};
        
		// 랜덤한 숫자를 얻어내기 위한 객체
		Random ran=new Random();
        
		// 0~4 사이의 렌덤한 정수 얻어내기
		int ranNum=ran.nextInt(5);
		
		System.out.println(items[ranNum]);

 

		/*  cherry, apple, banana, melon, 7 
		 * 
		 * 	5개의 문자열 중에서 3개가 한줄에 한번에 랜덤하게 출력되게 해 보세요.
		 *    예)  cherry | apple | cherry
		 *         7 | apple | melon
		 *         7 | 7 | 7
		 *      
		 */
		
		// 랜덤하게 출력할 문자열을 미리 배열에 담아 놓는다. 
		String[] items={"cherry", "apple", "banana", "melon", "7"};
        
		// 랜덤한 숫자를 얻어내기 위한 객체
		Random ran=new Random();
        
		// 랜덤하게 얻어낸 3개의 정수를 저장할 배열
		int[] nums=new int[3];
        
		// 0~4 사이의 랜덤한 정수 3개 얻어내기
		for(int i=0;i<3;i++) {
			// 랜덤한 정수를 얻어내서 
			int ranNum=ran.nextInt(5);
			nums[i]=ranNum; //배열에 저장한다 
		}
        
		// 랜덤한 정수 3개 참조
		int one=nums[0];
		int two=nums[1];
		int three=nums[2];
        
		// 출력할 문자열 구성하기
		String line=items[one]+" | "+items[two]+" | "+items[three];
        
		// 출력하기 
		System.out.println(line);

 

		/*  cherry, apple, banana, melon, 7 
		 * 
		 * 	5개의 문자열 중에서 3개가 한줄에 한번에 랜덤하게 출력되게 해 보세요.
		 *    예)  cherry | apple | cherry
		 *         7 | apple | melon
		 *         7 | 7 | 7
		 *  
		 *  cherry | cherry | cherry   
		 *  10점 입니다.
		 *  
		 *  apple | apple | apple
		 *  20점 입니다.
		 *  
		 *  .
		 *  .
		 *  7 | 7 | 7 
		 *  1000점 입니다.
		 *  
		 *  apple | cherry | apple
		 *  0점 입니다.
		 *  
		 *  hint
		 *  
		 *  int[] points = {10, 20, 30, 40, 1000};
		 *  
		 *  if(nums[0] == nums[1] && nums[1] == nums[2]){
		 *  
		 *  }
		 */
         
		// 랜덤하게 출력할 문자열을 미리 배열에 담아 놓는다. 
		String[] items={"cherry", "apple", "banana", "melon", "7"};
		// 랜덤한 숫자를 얻어내기 위한 객체
		Random ran=new Random();
		// 랜덤하게 얻어낸 3개의 정수를 저장할 배열
		int[] nums=new int[3];
		// 0~4 사이의 랜덤한 정수 3개 얻어내기
		for(int i=0;i<3;i++) {
			// 랜덤한 정수를 얻어내서 
			int ranNum=ran.nextInt(5);
			nums[i]=ranNum; // 배열에 저장한다 
		}
		// 랜덤한 정수 3개 참조
		int one=nums[0];
		int two=nums[1];
		int three=nums[2];
        
		//출력할 문자열 구성하기
		String line=items[one]+" | "+items[two]+" | "+items[three];
        
		//출력하기 
		System.out.println(line);
        
		// 부여할 점수를 미리 배열에 담아 놓는다. 
		int[] points= {10, 20, 30, 40, 1000};
        
		// nums 배열에 있는 3개의 숫자가 모두 같은지 비교해 본다.
		if(nums[0]==nums[1] && nums[1]==nums[2]) {// 3개가 모두 같은 경우
			// 점수를 부여해야 한다 . 몇점이지?
			// nums  배열에 있는 숫자 3개가 다 같으므로 아무거나 하나를 읽어와서
			// 점수를 얻어낸다
			int point=points[nums[0]];
			System.out.println(point+"점 입니다.");
		}else {// 하나라도 다른 경우
			// 0 점
			System.out.println("0점 입니다.");
		}

 

- 11 ~ - 13

 이전 기수에서 같이 만들어본 예시라고 했다. 잠시 짚고 넘어가고 싶은 것은 while break이다. 반복문에는 for loop 말고도 while loop가 있다. while loop는 해당 조건이 true면 계속해서 반복작업을 하게 되고, 해당 조건을 만족하지 못한 경우에 loop를 탈출하게 된다. 하지만 모든 내용이 true면 무한히 갇혀있을 수도 있는데, 이럴 때 loop를 탈출하기 위해서 필요한 것이 바로 break이다. break는 해당 과정을 중단하고 탈출할 수 있게 하는 예약어이다.

	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		// 외형상 무한 루프
		while(true) {
			System.out.print("종료(q) 계속(Enter):");
			String str=scan.nextLine();
			if(str.equals("q")) {// 무한 루프 탈출 조건
				break; // while  문 탈출
			}
			// 이전 예제에서 작업한 내용을 static 메소드에 이동 시키고 해당 메소드 호출하기 
			MainClass11.doGame();
		}
		System.out.println("main 메소드가 종료 됩니다.");
	}
	
	public static void doGame() {
		// 랜덤하게 출력할 문자열을 미리 배열에 담아 놓는다. 
		String[] items={"cherry", "apple", "banana", "melon", "7"};
        
		// 랜덤한 숫자를 얻어내기 위한 객체
		Random ran=new Random();
        
		// 랜덤하게 얻어낸 3개의 정수를 저장할 배열
		int[] nums=new int[3];
        
		// 0~4 사이의 랜덤한 정수 3개 얻어내기
		for(int i=0;i<3;i++) {
			// 랜덤한 정수를 얻어내서 
			int ranNum=ran.nextInt(5);
			nums[i]=ranNum; //배열에 저장한다 
		}
		// 랜덤한 정수 3개 참조
		int one=nums[0];
		int two=nums[1];
		int three=nums[2];
        
		// 출력할 문자열 구성하기
		String line=items[one]+" | "+items[two]+" | "+items[three];
        
		// 출력하기 
		System.out.println(line);
        
		// 부여할 점수를 미리 배열에 담아 놓는다. 
		int[] points= {10, 20, 30, 40, 1000};
        
		// nums 배열에 있는 3개의 숫자가 모두 같은지 비교해 본다.
		if(nums[0]==nums[1] && nums[1]==nums[2]) {//3개가 모두 같은 경우
			//점수를 부여해야 한다 . 몇점이지?
			//nums  배열에 있는 숫자 3개가 다 같으므로 아무거나 하나를 읽어와서
			//점수를 얻어낸다
			int point=points[nums[0]];
			System.out.println(point+"점 입니다.");
		}else {// 하나라도 다른 경우
			// 0 점
			System.out.println("0점 입니다.");
		}		
	}

 

	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);
		// 외형상 무한 루프
		while(true) {
			System.out.print("종료(q) 계속(Enter):");
			String str=scan.nextLine();
			if(str.equals("q")) {// 무한 루프 탈출 조건
				break; // while  문 탈출
			}
			// 이전 예제에서 작업한 내용을 static 메소드에 이동 시키고 해당 메소드 호출하기 
			MainClass12.doGame();
		}
		System.out.println("main 메소드가 종료 됩니다.");
	}
	
	public static void doGame() {
		// 랜덤하게 출력할 문자열을 미리 배열에 담아 놓는다. 
		String[] items={"cherry", "apple", "banana", "melon", "7"};
        
		// 랜덤한 숫자를 얻어내기 위한 객체
		Random ran=new Random();
        
		// 랜덤하게 얻어낸 3개의 정수를 저장할 배열
		int[] nums=new int[3];
        
		//0~4 사이의 랜덤한 정수 3개 얻어내기
		for(int i=0;i<3;i++) {
			// 랜덤한 정수를 얻어내서 
			int ranNum=ran.nextInt(5);
			nums[i]=ranNum; //배열에 저장한다 
		}
		
		for(int i=0;i<nums.length; i++) {
			try {
				// 실행의 흐름(스레드)을  1초 잡아 놓기  
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			// .print() 메소드를 이용해서 개행 기호를 출력하지 않는다. 
			System.out.print("|\t"+items[nums[i]]+"\t|");
		}
		
		// 개행 두번 하기
		System.out.println();
		System.out.println();
		
		// 부여할 점수를 미리 배열에 담아 놓는다. 
		int[] points= {10, 20, 30, 40, 1000};
        
		// nums 배열에 있는 3개의 숫자가 모두 같은지 비교해 본다.
		if(nums[0]==nums[1] && nums[1]==nums[2]) {//3개가 모두 같은 경우
			//점수를 부여해야 한다 . 몇점이지?
			//nums  배열에 있는 숫자 3개가 다 같으므로 아무거나 하나를 읽어와서
			//점수를 얻어낸다
			int point=points[nums[0]];
			System.out.println(point+"점 입니다.");
		}else {// 하나라도 다른 경우
			// 0 점
			System.out.println("0점 입니다.");
		}		
	}

 

/*
 *  [ 컴퓨터와 가위 바위 보 하기 ]
 *  
 *   가위(s) 바위(r) 보(p) :s
 *   
 *   나 : 가위  vs 컴: 보
 *   win(draw or lose)~
 *  
 */
 
 	public static void main(String[] args) {
		// 가위 바위 보 문자열을 일단 배열에 담아보자
		String[] items= {"가위", "바위", "보"};
        
		// 사용자 입력을 받아야 하니 Scanner  객체를 생성한다.
		Scanner scan=new Scanner(System.in);
        
		// 컴퓨터가 랜덤하게 가위,바위,보를 정해야 하니 Random 객체를 생성한다.
		Random ran=new Random();
		
		// 1. 사용자 입력을 받는다. 
		System.out.println("가위(s) 바위(r) 보(p) 입력:");
		String clientInput=scan.nextLine();
		
		// 2. "s" 는 0, "r" 은 1, "p" 는 2 로 바꿔 보기로 하자
		int me=0;
		if(clientInput.equals("s")) {
			me=0;
		}else if(clientInput.equals("r")) {
			me=1;
		}else if(clientInput.equals("p")) {
			me=2;
		}
		
		// 3. Computer 도 랜덤하게 하나의 숫자를 부여 받는다 (0,1,2  중에 하나)
		int com=ran.nextInt(3);
        
		// win, draw, lose 문자열을 담을 변수를 미리 만들어 준다.
		String result=null;
        
		// 4. 승패를 판단해야 한다. 
		if( (me==0 && com==2) || (me==1 && com==0) || (me==2 && com==1)) {//내가 이기는 경우는 무엇일까?
			result="win!";
		}else if(me == com) {// 요거는 비기는 경우 
			result="draw";
		}else {// 나머지는 따져 보지 않아도 내가 진경우 일듯...
			result="lose ㅜㅜ";
		}
		System.out.println("나:"+items[me]+" vs 컴:"+items[com]);
		System.out.println(result);
	}

 

'뒷북 정리 (국비 교육) > java' 카테고리의 다른 글

[Java] step10. Abstract Class  (0) 2022.04.19
[Java] step09. Extends  (0) 2022.04.19
[Java] step07. Wrapper Class  (0) 2022.04.17
[Java] step06. Constructor  (0) 2022.04.17
[Java] step05. Method  (0) 2022.04.13

댓글