Study/Academy

[Study #05] 배열

PEAZH 2023. 6. 14. 19:18

 

 

01. 배열이란?

  • 같은 타입의 데이터를 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조
  • 객체는 기본적으로 속성과 메서드를 가지고 있지만 객체 중 배열은 유일하게 속성만 가지고 있음

  • 인덱스는 0부터 시작
  • 배열은 같은 타입의 데이터만 저장할 수 있음
  • 한 번 생성된 배열은 길이를 늘이거나 줄일 수 없음
  • 배열은 하나의 이름으로 불려지고 R타입처럼 관리 됨

 

02. 배열 형식

 

[ 기본 형식 ] 데이터 타입[] 변수명 = new 데이터 타입[인덱스 값];

int[] arr01 = new int[10]; //int 타입의 10개 배열 선언
double[] arr02 = new double[5];//double 타입의 5개 배열 선언
String[] arr03 = new String[3];//String 타입의 3개 배열 선언
//char는 문자열이 아닌 한 글자만 저장하는 명령어

System.out.println(arr01);//값 : [I@3d012ddd
//뜻 : [는 배열, I는 int, 3d012ddd는 객체의 주소
//그대로 출력하면 [위치, index, 번지]의 값이 출력

System.out.println(arr01[0]);//값 : 0
//arr01의 0번지에 저장된 값 출력

//변수선언
arr01[0] = 100; //해당 위치에 100을 저장하라는 뜻
arr01[1] = 10;
arr01[2] = 50;

arr03[0] = "홍길동";
arr03[1] = "금길동";
arr03[2] = "이길동";

 

 

[ 활용 ]

public class Array {
    public static void main(String[] args) {

    // 생성
    int[] arr01 = new int[10];

    // 값 입력 (역순으로 채워넣기)
    for (int i = 9; i >= 0 ; i--)
        arr01[i] = 10 - i;

    //출력
    System.out.println(Arrays.toString(arr01));

    //생성과 값 입력을 동시에
    int[] arr02 = new int[] {10, 9, 8, 7, 6};//길이를 마음대로 조절 불가
    int[] arr03 = {5, 4, 3, 2, 1};

    }
}

 

03. 배열의 길이

  • 배열에 저장할 수 있는 전체 항목의 개수를 말함
  • 코드에서 배열의 길이를 얻으려면 배열 객체의 length를 이용하면 됨
    (ex. 배열 변수.length;)

 

[ 기본 ] 

//int[10] 1~10까지 입력하기
int[] arr01 = new int[10]
for (int i = 0; i < arr01.length; i++) {//0~9
	arr01[i] = i + 1;
}

 //배열 전체 출력
System.out.println(Arrays.toString(arr01));//toString -> 배열을 스트링으로 변경
//배열은 인덱스만 바꿔서 원하는 값 입력할 수 있음

int[] intArray = { 10, 20, 30 ];//int타입의 배열 생성
System.out.println(arr03.length);//int 타입으로 길이 출력 : 3

//배열 출력
for (int i = 0; i < arr03.length; i++) {
    System.out.println(arr03[i]);
    //arr03배열값 출력
    //10 20 30

 

04. 배열의 초기값

  • 객체는 객체 생성과 동시에 초기값을 가짐
  • 정수 = 0, 실수 = 0.0, 객체 = null, char = 0 (아스키 코드 특수문자로 화면엔 나오지 않음)
    boolean = false

[ 예시 ] 

int[] test01 = new int[3];
System.out.println(Arrays.toString(test01));//[0, 0, 0]

byte[] test02 = new byte[3];
System.out.println(Arrays.toString(test02));//[0, 0, 0]

long[] test03 = new long[3];
System.out.println(Arrays.toString(test03));//[0, 0, 0]

short[] test04 = new short[3];
System.out.println(Arrays.toString(test04));//[0, 0, 0]

float[] test05 = new float[3];
System.out.println(Arrays.toString(test05));//[0.0, 0.0, 0.0]

char[] test06 = new char[3];
System.out.println(Arrays.toString(test06));//[ , , ]

boolean[] test07 = new boolean[3];
System.out.println(Arrays.toString(test07));//[false, false, false]

String[] test08 = new String[3];
System.out.println(Arrays.toString(test08));//[null, null, null]

Scanner[] test09 = new Scanner[3];//R타입은 다 null로 뜸
System.out.println(Arrays.toString(test09));//[null, null, null]

Object[] test10 = new Object[3];
System.out.println(Arrays.toString(test10));//[null, null, null]

 

 

05. printf 활용

 

 

' printf ' 활용 

%d = 정수     %c = 문자     %f = 실수    %s = 문자열    %b = boolean

%o = 8진수    %x = 16진수    \n = 줄바꿈     \t = tab키

 
//% 쓸 때는 무조건 printf 써야함
String name = "홍길동";
System.out.printf("제이름은 %s입니다.\n", name);

double pi = 3.14;
System.out.printf("파이는 %f입니다.\n", pi);
System.out.printf("파이는 %.2f입니다.\n", pi);
//.2는 소수점 아래 둘째자리까지 보여줘 라는 뜻

int money = 5000;
System.out.printf("제 용돈은 %d원입니다.\n", money);
System.out.printf("제 용돈은 %,d원입니다.\n", money);
//,붙여주면 5,000원으로 출력

System.out.printf("제 용돈은 %10d원입니다.\n", money);
/10칸을 만들고 값을 적는다는 뜻

System.out.printf("제 이름은 %7s입니다.\n", name);
//폭을 만들 수 있음
System.out.printf("제 이름은 %7s입니다.\n", "가나다라");

char ch = 65;
System.out.printf("제 이름은 %c입니다.\n", ch);

System.out.printf("제 이름은 %10d입니다.\n", 1000);//오른쪽정렬
System.out.printf("제 이름은 %-10d입니다.\n", 1000);//왼쪽정렬
System.out.printf("제 이름은 %010d입니다.\n", 1000);//빈 공간을 0으로 채움

 

 

06. 배열 활용 예제

 

[ Q1. 구구단 2단 출력하는 프로그램 작성 ]

// 방법 1)
for (int i = 1; i < 10; i++) {
    System.out.println("2 x " + i + " = " + (2 * i));
}

// 방법 2)
for (int i = 1; i < 10; i++) {
    System.out.printf("2 X %d = %d\n", i, (2 * i));
    // %d == 정수              첫번째 d자리  두번째 d자리

 

[ Q2. 2단부터 9단까지 for문으로 출력 ]

// 방법 1)
for (int i = 2; i < 10; i++) {
    for (int j = 1; j < 10; j++) {
        System.out.printf("%d x %d = %d\n", i, j, i * j);
    }
    System.out.println("");
}

// 방법 2)
for (int i = 2; i < 10; i++) {
    for (int j = 1; j < 10; j++) {
        System.out.printf("%d x %d = %d\n", j, i, i * j);
    }
    System.out.println("");
}

// 방법 3) 옆으로 출력
for (int i = 1; i < 10; i++) {
    for (int j = 2; j < 10; j++) {
        System.out.printf("%d x %d = %d\t", j, i, i * j);
    }                                //n대신 t를 넣음 
    System.out.println("");
}

 

[ Q3. 알파벳 A - Z까지 저장하는 배열 만들기 ]

public class Test03 {
	public static void main(String[] args) {

		char[] cha01 = new char[26];

		for (int i = 65; i <= 90; i++) {
			cha01[i - 65] = (char) i;

		System.out.println(cha01[i-65]);
		}
	}
}

 

[ Q4. 문자 암호화 하기 ]

package jun08;

import java.util.Arrays;
import java.util.Scanner;

public class Test04 {
	public static void main(String[] args) {
    
		Scanner sc = new Scanner(System.in);
		String input;

		System.out.println("암호화 할 문장을 입력하세요.");
		System.out.print("입력 : ");

		input = sc.nextLine();// 입력받을 때까지 기다림
		input = input.toUpperCase();// 입력받은 문장 모두 대문자화
		// input.toLowerCase(); 입력받은 문장 모두 소문자화

		// 문자열을 배열화하기
		// System.out.println(input);
		// String to char

		char[] chInput = input.toCharArray();
		// input에 넣은 것을 하나하나 쪼개서 배열로 만들기 
		// (스트링을 char배열로 만들기)

		System.out.println(Arrays.toString(chInput));//입력한 문장 배열로 출력

		int z = 0;
		for (int i = 0; i < chInput.length; i++) {
			if ( ((char) (chInput[i] + 3)) > 90) {
				z = (chInput[i] + 3) - 26;
				System.out.println( (char) z);
			} else {
				System.out.println((char) (chInput[i] + 3));
			}
		}
		sc.close();
	}
}

 

[ Q5. String 자르기 ]

package jun08;

public class Test05 {
	public static void main(String[] args) {
		
		String word = "Hello";
		//             01234  charAt은 n번째 있는 것을 char화 시키는 것임
		System.out.println(word.length());//word가 가지고 있는 길이 = 5
		
		for (int i = 0; i < word.length(); i++) {
			System.out.print( (char) (word.charAt(i) + 3 ) );//Khoor (3글자 밀기)
		}
		
		// string 2번부터 뒤까지 출력
		System.out.println( word.substring(2));// llo
		// string 0번부터 2번 앞까지 출력
		System.out.println( word.substring(0,2));// He
		
		String name01 = "가나다라마법사";
		System.out.println( name01.substring (4,7) );// 마법사
		
		String name = "가나다라마법사";
		String shortName = name.substring (4,name.length());
		System.out.println( shortName );// 마법사
	}
}

 

[ Q6. 1차원의 점들이 주어졌을 때, 그 중 가장 거리가 짧은 것의 쌍을 출력하는 함수 작성하기 ]

package jun08;

public class Test06 {
	public static void main(String[] args) {
    
		int[] map = {1, 3, 4, 8, 13, 17, 20};
		int fir = 1;// 시작 숫자
		int sec = 3;// 끝 숫자
		int temp = map[1] - map[0];// 두 수의 차이

		for (int i = 0; i < map.length - 1; i++) {
			// System.out.print(map[i] +", "+map[i + 1] + " : ");
			// System.out.println(map[ i + 1 ] - map[i]);//뒷 수 - 앞 수
			//                      i + 1까지 가게 하려고
			
			if( (map[ i + 1 ] - map[i]) < temp ) {
				temp = map[ i + 1 ] - map[i];
				fir = map[i];
				sec = map[i + 1];
			}
		}
        
		System.out.print("두 거리의 차가 가장 작은 숫자는 ");
		System.out.print(fir + ", " + sec);
	}
}

 

 

참고자료
신용권, '혼자 공부하는 자바'