이안의 평일코딩

JAVA의 정석 14일차 - 배열용도2 본문

Back-end/Java

JAVA의 정석 14일차 - 배열용도2

이안92 2020. 7. 2. 11:49
반응형

2020.07.02(목)

 

1. 배열

 -> 같은 타입을 여러개 묶어서 관리

 -> 배열생성 -> 연속적인 메모리 구조 (인덱스)

 -> 일차원 배열 [], [][], [][][]

                    ==

                    1) 문자열 배열

                       String[] arr ====== String arr[]

                                === 배열명 

                    2) 정수 배열

                       int[] arr ====== int arr[]

                    3) 논리 배열

                       boolean[] arr ===== boolean arr[]

 -> 선언 방식

      문자열 10개

      ========

      String[] arr;

      ========

      정수 10개

      ========

      int[] arr;

 -> 초기값

      1) String[] arr;

         arr = new String[10];

      2) int[] arr     ==> 선언과 동시에 초기값

         *** int[] arr = new int[10]

         arr = new int[10];

 

         int[] arr = {10, 20, 30, 40, 50} ==> 등록된 갯수 (5개 배정)

 

         ===> 선언시에 메모리 저장 갯수를 등록 => 고정적이다

 

 -> 인덱스 사용

     예)

         int[] arr = {10, 20, 30, 40, 50}

          arr

         ===

          배열의 첫번째 주소

          100

         ===

                     index번호는 0부터 시작

      index  arr[0]  arr[1]  arr[2]  arr[3]  arr[4]

              =======================

                10      20      30      40      50

              |====|=====|====|====|====

          100      104     108    112    116

int, String 100 -> 104 (4byte씩)

arr[0] ==> 일반변수와 동일 역할 수행

arr[0]=100 => 값 변경이 가능 하다

 

 -> 출력 => 번호 (0부터 시작~) -> 연속적으로 인덱스번호

    -> for, while문을 이용해서 출력

       === 횟수가 지정된 상태

 

       = for

         1) 일반 for문 =====> 인덱스를 이용한다(제어)

              ==> 값을 변경, 값을 삭제

              ==> Back-End

         2) 향상된 for문 (for-each) ===> 실제 저장된 값(출력용)

             (실제 저장된 데이터형 : 배열명) for(int i:arr)

              ==> 값 변경이 불가능

              ==> Front-End

 

 1) 정수 5개 저장 => 평균

    (1) 정수 5개 저장하는 메모리 공간을 설정 (연속적으로 사용)

     int[] arr={30, 50, 70, 90, 10};

     int total = arr[0]+arr[1]+arr[2]+arr[3]+arr[4];

     double avg = total/5.0;

     System.out.println("저장된 정수의 평균:"+avg);

 

    (2) for 반복문 활용

    int[] arr={30, 50, 70, 90, 10};

    int total=0;

    for(int i=0; i<5; i++) { //i라는 변수는 자동 삭제

       total+=arr[i]; //arr[0]+arr[1]+arr[2]+arr[3]+arr[4];

    }

    System.out.println("저장된 정수의 평균:"+total/5.0);

 

    (3) for-each 출력

    int[] arr={30, 50, 70, 90, 10};

    total=0; // 0값으로 초기화

    for(int i:arr) {

       total+=i;

    }

    System.out.println("저장된 정수의 평균:"+total/5.0);

 

 2) 선언 연습

//10개의 문자를 가지는 배열 c를 생성하는 코드를 한 줄로 쓰라
		char[] c = new char[10];
		
//0에서 5까지 정수 값으로 초기화된 정수 배열 n을 선언하라
		int[] n = {0, 1, 2, 3, 4, 5};
		
//일~토로 초기화된 배열 day를 선언하라
		char[] day = {'일', '월', '화', '수', '목', '금', '토'};
		
//4개의 논리 값을 가진 배열 bool을 선언하고 true, false, false, true로 선언하라
		boolean[] bool = {true, false, false, true};

 

 3) 정수를 10개 저장하는 배열을 만들고 1에서 10까지 범위를 정수를 랜덤하게 생성하여 배열에 저장하라.

    그리고 배열에 든 숫자들과 평균을 출력하라.

int[] arr = new int[10]; // 10개의 메모리 공간 생성
for(int i=0; i<10; i++) {
arr[i]=(int)(Math.random()*10)+1; // 필요한 값 설정
}
		
int total=0;
for(int i:arr) {
	total+=i;
}
System.out.println("평균"+total/10.0);

 

 4) String[] course = {"Java", "C++", "HTML5", "컴퓨터구조", "안드로이드"};
     int jumsu[] = {95, 88, 76, 62, 55};
과목 이름을 입력받아 점수를 출력하는 프로그램 작성. "그만"을 입력받으면 종료.
* 문자열을 비교하기 위해서는 String 클래스의 equals()메소드를 이용해야 한다.

import java.util.*;
public class 연습 {
	public static void main(String[] args) {
		String[] course = {"Java", "C++", "HTML5", "컴퓨터구조", "안드로이드"};
		int jumsu[] = {95, 88, 76, 62, 55};
		
		Scanner scan = new Scanner(System.in);
		boolean bCheck = false;
		
		while(true) {
        	bCheck=false;
			System.out.print("과목 이름>>");
			String subject = scan.nextLine();
			if(subject.equals("그만")) {
				break;
			}
		for(int i=0; i<course.length; i++) {
			if(subject.equals(course[i])) {
				bCheck=true;
				System.out.println(jumsu[i]);
			}
		}
		if(bCheck==false){
			System.out.println("없는 과목입니다.");
		}
	}
 }
}

 

2. String : 문자열을 저장할 수 있는 공간

   일반변수의 역할

   클래스의 역할 => 기능(메소드)

 

   주요 기능

   = 문자열 비교 : equals()

   = 포함 문자 : contains()

   = 문자열중에 한개 문자 : charAt()

   = 저장된 문자의 갯수 : length()

   = 문자 자르기 : substring()

   = 찾는 문자의 위치 : indexOf(), lastIndexOf()

   = 모든 데이터형을 문자열로 변환 : valueOf()

   = 공백문자 제거 : trim() -> 좌우만 제거

      " Hello Java " => "Hello Java"

   = 문자열 => char[] => toCharArray()

   = startsWith(), endsWith() => 검색기

 

   ===============================

   Wrapper Class

   =========

   기본형 데이터 (정수, 실수, 문자, 논리)

   int => Integer => "2"=> 2 => parseInt("2") =>  2

   "10" + "100" => 110

   ============== 10100

   double = Double Boolean, Float, Byte...

   

 1) substring : 필요한 문자만 추출 => 형태소 분석(명사, 부사, 형용사)

    substring(int start)

    substring(int start, int end)

    "Hello Java" => String => char[]

            ====

    0123456789

       ==

    substring(6)

    substring(int start시작점, int end끝점+1)

String msg="0123456789";
System.out.println(msg.substring(5)); // => 56789
System.out.println(msg.substring(3,6)); // => 345
String msg="100-010";
System.out.println(msg.substring(0,3)); // (012) 마지막제외 => 100
System.out.println(msg.substring(4,7)); // (456) 마지막제외 => 010
System.out.println(msg.substring(4)); // 010 하나만 넣으면 시작점에서 끝까지 출력

 

 2) indexOf(), lastIndexOf() -> 문자의 위치 찾기 -> 정수

   //문자 자르기 => substring 자를위치 +1 주의

String msg="abcde.fghijkl.java";
System.out.println(msg.indexOf(".")); //5
System.out.println(msg.lastIndexOf(".")); //13
System.out.println("확장자:"+msg.substring(msg.lastIndexOf(".")+1)); //확장자:java

 

 3) split() : => String[]

    문자를 구분해서 자르는 역할

String msg = "밑반찬,메인반찬,국/탕,찌개,디저트,면/만두,밥,죽/떡,퓨전,김치/젓갈,장류양념,소스/잼,양식,샐러드,스프,빵,과자,차/음료,"+"술,기타";
String[] arr = msg.split(","); // 일반문자열 => 배열로 변경
// 문자일때만 사용이 가능 msg.sp => regex
// ?였으면 //? 로 split해야함. 구분문자 사용시 // 붙여야함.
for(String s : arr) {
System.out.println(s);
}

/* 
* /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
* [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}
* 맛있[가-힣]+
* 짜[가-힣]+
*/

 

 4) valueOf() => 모든 데이터형을 문자열(String)로 변환

    valueOf(10) => "10"

    valueOf(true) => "true"

    char[] c = {'H', 'e', 'l'. 'l', 'o'};

    valueOf(c) ==> "Hello"

char[] c = {'H', 'e', 'l', 'l', 'o'};
String msg = String.valueOf(c); // char[] ==> String
System.out.println(msg);
String ss = "Hello Java!!";
char[] cc = ss.toCharArray(); // String ==> char[]

int a = 10;
int b = 20;
System.out.println(String.valueOf(a)+String.valueOf(b));
// 1020 => "10"+"20" => 1020

 

3. 이차원배열

   =======

   [][]

 

   * 형식

     1) 데이터형[][] 배열명; => 권장 사항

     2) 데이터형 배열명[][];

     3) 데이터형[] 배열명[]

          => 행/열

         데이터형[행][열]

 

[3][4]

arr[0][0] arr[0][1] arr[0][2] arr[0][3]
arr[1][0] arr[1][1] arr[1][2] arr[0][3]
arr[2][0] arr[2][1] arr[2][2] arr[0][3]

 

  * 초기화

  예) int[][] arr = {{1,2,3},{4,5,6},{7,8,9}}; =>3행, 3열

  0 1 2
0 1
arr[0][0]
2
arr[0][1]
3
arr[0][2]
1 4
arr[1][0]
5
arr[1][1]
6
arr[1][2]
2 7
arr[2][0]
8
arr[2][1]
9
arr[2][2]

 => 2중 for : 퍼즐게임, 지뢰찾기, 빙고게임

 

초기값 1~25

int[][] arr = new int[5][5]; //전체 => 0으로 초기화

int k=1; //1~25
// 초기값
for(int i=0; i<5; i++) { //행
	for(int j=0; j<5; j++) { //열
    	arr[i][j]=k; // [0][0] ~~ [0][4]
        k++;
    }
}

// 출력
for(int i=0; i<5; i++) {
	for(int j=0; j<5; j++) {
    	System.out.printf("arr[%d][%d]=%d\t",i,j,arr[i][j]);
    }
        System.out.println();
}

 

 1) 모래시계 출력

 /*    
 *    ======================
 *       1               13
 *    ======================
 *       2    6      10  14
 *    ======================
 *       3    7   9  11  15
 *    ======================
 *       4    8      12  16
 *    ======================
 *       5               17
 *    ======================
 */
 public class 모래시계1 {
	public static void main(String[] args) { 
    
    // 5행 5열 배열
		int[][] arr=new int[5][5];
        
    // 입력
        int k=1;
		for(int i=0;i<3;i++) {
			for(int j=i;j<=4-i;j++) {
				arr[j][i]=k;
				k++;
			}
		}
		
		for(int i=3;i<=4;i++) {
			for(int j=4-i;j<=i;j++) {
				arr[j][i]=k;
				k++;
			}
		}
		
	// 출력 
		for(int i=0;i<5;i++) {
			for(int j=0;j<5;j++) {
				if(arr[i][j]==0)
					System.out.print("\t");
				else
					System.out.print(arr[i][j]+"\t");
			}
			System.out.println("\n");
		}
        
	}
}

 

2) 모래시계 출력2

/*
 *    ======================
 *       1   2   3  4   5
 *    ======================
 *           6   7  8
 *    ======================
 *               9
 *    ======================
 *          10  11  12
 *    ======================
 *      13  14  15  16   17
 *    ======================
 *          j_s   j_e
 *    i=0    0     4
 *    i=1    1     3
 *    i=2    2     2
 *    
 *       i와 j_s  ==> j_s=i
 *       i와 j_e  ==> i+j_e=4 ==> j_e=4-i
 *       for(int i=0;i<3;i++)
 *       {
 *           for(int j=i;j<=4-i;j++)
 *           {
 *           }
 *       }
 *    ===============
 *          j_s   j_e
 *    i=3    1     3
 *    i=4    0     4
 *    
 *    i와 j_s   ==> i+j_s=4  ==> j_s=4-i
 *    i와 j_e   ==> i=j_e    ==> j_e=i
 */ 

 public class 모래시계2 {
	public static void main(String[] args) { 
    
    // 5행 5열 배열
		int[][] arr=new int[5][5];
        
    // 입력
        int k=1;
		for(int i=0;i<3;i++) {
			for(int j=i;j<=4-i;j++) {
				arr[i][j]=k; //i와 j만 바꿔주면 1번과 같음
				k++;
			}
		}
		
		for(int i=3;i<=4;i++) {
			for(int j=4-i;j<=i;j++) {
				arr[i][j]=k; //i와 j만 바꿔주면 1번과 같음
				k++;
			}
		}
		
	// 출력 
		for(int i=0;i<5;i++) {
			for(int j=0;j<5;j++) {
				if(arr[i][j]==0)
					System.out.print("\t");
				else
					System.out.print(arr[i][j]+"\t");
			}
			System.out.println("\n");
		}
        
	}
}

 

 3) 마름모

/*
 *    j 0   1   2   3    4
 * i  ======================
 * 0           1
 *    ======================
 * 1       2   3   4
 *    ======================
 * 2   5   6   7   8    9        
 *    ======================
 * 3       10  11  12
 *    ======================
 * 4           13
 *    ======================
 *           시작  끝   => for(int j=2-i; j<=i+2; j++)
 *    i=0      2   2
 *    i=1      1   3
 *    i=2      0   4
 *      => i+j=2  ==> j=2-i   i+2=j  => j=i+2
 *    i=3      1   3    for(int j=i-2; j<=6-i; j++)
 *    i=4      2   2
 *    
 *        j+2=i ==> j=i-2    i+j=6 ==> j=6-i
 */
 
public class 마름모 {
	public static void main(String[] args) {

		int[][] arr=new int[5][5];
        
		int k=1;
		for(int i=0;i<3;i++) {
			for(int j=2-i;j<=i+2;j++) {
				arr[i][j]=k;
				k++;
			}
		}
		
		for(int i=3;i<=4;i++) {
			for(int j=i-2;j<=6-i;j++) {
				arr[i][j]=k;
				k++;
			}
		}
		
		// 출력 
		for(int i=0;i<5;i++) {
			for(int j=0;j<5;j++) {
				if(arr[i][j]==0)
					System.out.print("\t");
				else
					System.out.print(arr[i][j]+"\t");
			}
			System.out.println("\n");
		}
	}
}

 

4. 자바배열정리

   프로그램

   = 데이터 저장

      변수 ==> 배열, 클래스

   = 명령문

     ====> 명령문 묶기 ==> 메소드

   =======================

     객체 지향 프로그램 (Web)

   

  ================================

   데이터 저장

    한개 ===> 변수/상수

    여러개 ==> 배열

   데이터 처리(사용자의 요청)

    제어문, 연산자

   결과값 제시 ==> 도스, 윈도우, 브라우저, 핸드폰

                         ==== 테스트

  ================================ 클래스

 

  ==> 테스트, 사용자가 입력값이 잘못되면 => 쉽게 종료 (견고한 프로그램)

           => 1) if

                2) 예외처리

 

 

 * 활용) 달력만들기

 

// 년 월 => 입력값
import java.util.*;

public class 달력만들기 {
	public static void main(String[] args) {
    
	int year=0,month=0;
	Scanner scan = new Scanner(System.in);
    
// 입력
	System.out.print("년도 입력:");
	year=scan.nextInt();
		
	System.out.print("월 입력:");
	month=scan.nextInt();
		
// 출력
	String[] strWeek = {"일", "월", "화", "수", "목", "금", "토"};
	System.out.println(year+"년도 "+month+"월");
	for(String week:strWeek) {
		System.out.print(week+"\t");
		}
    
// 요일 구하기
// 전년도(year-1)까지의 총날 수 1년~2019.12.31
	int total = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400;

// 전달 까지의 합 2020.1.1 ~ 2020.6.30 (+1)
	int[] lastDay = {31,28,31,30,31,30,31,31,30,31,30,31};
    
/*
* if(month==2)
*	total+=31
* if(month==3)
*	total+=31+28
*/
	
	if((year%4==0 && year%100!=0)||(year%400==0)) // 윤년 -> 2월 29일
		lastDay[1] = 29;
	else
		lastDay[1] = 28;
	for(int i=0; i<month-1; i++) {
		total+=lastDay[i];
    	}
    
// 1일자의 요일
	total++;
	int week = total%7;

// 달력 출력
	System.out.println();
	for(int i=1; i<=lastDay[month-1]; i++) { // 1월이 index 0이기 때문에 -1
		if(i==1) {
			for(int j=0; j<week; j++) {
				System.out.print("\t");
			}
    	}
		System.out.printf("%2d\t",i); //%2d로 글자 정렬
		week++;
		if(week>6) {
		  week=0;
		  System.out.println();
		}
	}
 }
}
반응형
Comments