JAVA SPRING/java

JAVA_010) 참조자료형( 배열, 문자열 저장 )

오동순이 2023. 4. 26. 23:47

배열 ? 동일한 자료형을 묶어 저장하는 참조 자료형

생성할 때 크기를 지정해야 하고 한번 크기를 지정하면 절대 변경할 수 없는 특징이 있다.

 

배열 선언

자료형[ ] 변수명 자료형 변수명[ ]
int[ ] a;
double[ ] b;
String[ ] c;
int a[ ] ;
double b[ ];
String c[ ];

ex) int[ ] a;  // int 자료형만 저장가능

public class Array_Ex01 {
    public static void main(String[] args) {
        //배열의 선언방법
        int a[];
        double b[];
        String c[];
        
        // 실제 객체를 생성하기 위해서 new
        // new int[3];
        // new String[5];
        // new double[]; // 객체의 크기를 지정하지 않으면 오류 발생

        // 배열 자료형 변수에 객체 대입하기
        int[] aa = new int[3];
        aa[0] = 3;
        aa[1] = 4;
        aa[2] = 5;

        System.out.println(aa[0]);
        System.out.println(aa[2]);
        // System.out.println(aa[-1]); // ArrayIndexOutOfBoundsException 발생

        // 참조 변수와 배열 객체의 값 초기화하기
        int aaa;   // 기본 자료형
        int[] bbb; // 참조 자료형
        // System.out.println(aaa); // 오류 발생
        // System.out.println(bbb); // 오류 발생

        // 모든 변수는 초기화 이후에만 출력 가능!!!!
        int aaaa = 0;
        int[] bbbb = null;
        System.out.println(aaaa); // 0
        System.out.println(bbbb); // null
    }

}

 

1차원 배열의 원소 값 대입의 3가지 방법

public class Array_Ex02 {
    public static void main(String[] args) {
        // 배열의 값 대입 방법 1
        int[] array1 = new int[3]; // 배열의 선언방식 1
        array1[0] = 3;
        array1[1] = 4;
        array1[2] = 5;
        System.out.println("array1 : "+ array1[0] + " " + array1[1]+ " " + array1[2]);

        int[] array2; // 배열의 선언방식 2
        array2 = new int[3];
        array2[0] = 3;
        array2[1] = 4;
        array2[2] = 5;
        System.out.println("array2 : "+ array2[0] + " " + array2[1]+ " " + array2[2]);

        // 배열의 값 대입 방법 2
        int[] array3 = new int[]{3,4,5};  // 강제초기화 생략
        System.out.println("array3 : "+array3[0] + " " + array3[1]+ " " + array3[2]);

        int[] array4;
        array4 = new int[]{3,4,5}; // 배열의 선언과 객체 대입을 분리
        System.out.println("array4 : "+array4[0] + " " + array4[1]+ " " + array4[2]);

        // 배열의 값 대입 방법 3
        int[] array5 = {3,4,5}; // 강제초기화 생략
        System.out.println("array5 : "+array5[0] + " " + array5[1]+ " " + array5[2]);

        // int[] array6;
        // array6 = {3,4,5}; // 배열선언하고, 객체 대입은 분리 불가


    }
}

 

* 힙 메모리에서의 강제 초깃값

기본/참조 자료형 기본값
기본 불리언 (boolean) false
정수(byte, short/char, int, long) 0
실수(float, double) 0.0
참조 클래스, 배열 ... null

 

스택 메모리의 초깃값과 참조 자료형의 강제 초깃값

import java.util.Arrays;

public class Array_Ex03 {
    public static void main(String[] args) {
        
        int value1;
        // System.out.println(value1); 오류

        int[] value2;
        // System.out.println(value2); 오류
        // 강제 초기화되지 않아서 오류 발생

        int value3 = 0;
        System.out.println(value3); // 0으로 초기화
        int[] value4 = null;
        System.out.println(value4);
        System.out.println();

        // 기본 자료형 배열
        boolean[] array1 = new boolean[3]; // false로 초기화 
        // boolean의 초기값은 false; // Boolean의 초기값은 null;
        for(int i=0; i<3; i++) {
            System.out.print(array1[i] + " ");
        }
        System.out.println();


        int[] array2 = new int[3];      // 0으로 초기화
        for(int i=0; i<3; i++) {
            System.out.print(array2[i] + " ");
        }
        System.out.println();

        double[] array3 = new double[3];      // 0.0 으로 초기화
        for(int i=0; i<3; i++) {
            System.out.print(array3[i] + " ");
        }
        System.out.println();

        // 참조 자료형 배열
        String[] array4 = new String[3];    // null 으로 초기화
        for(int i=0; i<3; i++) {
            System.out.print(array4[i] + " ");
        }
        System.out.println();
        System.out.println();
        
        // 배열을 한번에 출력
        System.out.println(Arrays.toString(array1));
        System.out.println(Arrays.toString(array2));
        System.out.println(Arrays.toString(array3));
        System.out.println(Arrays.toString(array4));
        System.out.println();

        //기본 자료형과 참조 자료형의 측징비교
        // 기본 자료형의 대입 연산 - 데이터 복사해서 변경 - 원본데이터 영향X
        int value10 = 3;
        int value11 = value10;
        value11 = 7;
        System.out.println(value10);
        System.out.println(value11);
        System.out.println();

        // 참조 자료형의 대입 연산 - 실제 데이터 위치값 복사 - 원본데이터 변경
        int[] array11 = new int[] {33,44,55};
        int[] array12 = array11;
        array12[0] = 77;
        System.out.println(array11[0]);
        System.out.println(array12[0]);
        System.out.println();

    }
}

 

1차원 배열의 원소 값 출력

import java.util.Arrays;

public class Array_Ex04 {
    public static void main(String[] args) {
        // 배열의 길이 .length
        int[] a = new int[] {1,2,3,4,5};
        System.out.println(a.length); // 5
        
        int[] array = new int[] {3,4,5,6,7};

        System.out.println("배열의 길이 : "+array.length); // 배열의 길이
        
        // 배열의 인덱스 값을 넣어 원소 값 1개씩 출력
        System.out.print(array[0] + " ");
        System.out.print(array[1] + " ");
        System.out.print(array[2] + " ");
        System.out.print(array[3] + " ");
        System.out.print(array[4] + " ");
        System.out.println();

        System.out.print("array[i] : ");
        for(int i=0; i<array.length; i++) {
            System.out.print(array[i]+ " ");
        }
        System.out.println();
        
        // for - each 문 for(원소자료형 변수명 : 집합 객체)
        System.out.print("array[K] : ");
        for(int k : array) {
            System.out.print(k + " ");
        }
        System.out.println();

        System.out.println(Arrays.toString(array)); // Arrays 클래스의 toString() 메서드
    }
}

 

2차원 정방 행렬 배열

 

int[ ][ ] a ;

 

인덱스 번호 0 1 2 3
0 a[0][0] a[0][1] a[0][2] a[0][3]
1 a[1][0] a[1][1] a[1][2] a[1][3]
2 a[2][0] a[2][1] a[2][2] a[2][3]

2차원 정방 행렬의 구조와 위치별 인덱스 번호[표]

 

 

2차원 배열의 3가지 선언 방법과 다양한 배열 선언

public class Array_Ex05 {
    public static void main(String[] args) {
        // 2차원 배열 선언방식

        // // 자료형[] 변수명
        // int[][] a;
        // double[][] b;
        // String[][] c;
        
        // // 자료형 변수명[][]
        // int aa[][];
        // double bb[][];
        // String cc[][];
        
        // // 자료형[] 변수명[]
        // int[] aaa[];
        // double[] bbb[];
        // String[] ccc[];

        // 배열의 선언 방법 1
        int[][] array1 = new int[3][4];
        int[][] array2;
        array2 = new int[3][4];

        // 배열의 선언 방법 2
        int array3[][] = new int[3][4];
        int array4[][];
        array4 = new int[3][4];

        // 배열의 선언 방법 3
        int[] array5[] = new int[3][4];
        int[] array6[];
        array6 = new int[3][4];

        // 다양한 배열 선언
        boolean[][] array7 = new boolean[3][4];
        int[][] array8 = new int[2][4];
        double[][] array9 = new double[3][5];
        String[][] array10 = new String[2][6]; // 참조 자료형 배열

    }
}

 

2차원 비정방 행렬 배열의 3가지 원소 값 대입 방법

public class Array_Ex07 {
    public static void main(String[] args) {
        // 2차원 비정방 행렬 배열의 3가지 원소 값 대입방법

        // 비정방 행렬의 선언 및 값 대입 방법 1
        int[][] array1 = new int[2][];
        array1[0] = new int[2];
        array1[0][0] = 1;
        array1[0][1] = 2;
        array1[1] = new int[3];
        array1[1][0] = 3;
        array1[1][1] = 4;
        array1[1][2] = 5;

        System.out.println("array1");
        System.out.println(array1[0][0] + " " + array1[0][1]);
        System.out.println(array1[1][0]+ " " + array1[1][1] + " " +array1[1][2]);
        System.out.println();
        
        int[][] array2 = new int[2][];
        array2[0] = new int[]{1,2};
        array2[1] = new int[]{3,4,5};

        System.out.println("array2");
        System.out.println(array2[0][0] + " " + array2[0][1]);
        System.out.println(array2[1][0]+ " " + array2[1][1] + " " +array2[1][2]);
        System.out.println();
        
        // 비정방 행렬의 선언 및 값 대입 방법 2
        int[][] array3 = new int[][]{{1,2},{3,4,5}};

        System.out.println("array3");
        System.out.println(array3[0][0] + " " + array3[0][1]);
        System.out.println(array3[1][0]+ " " + array3[1][1] + " " +array3[1][2]);
        System.out.println();

        int[][] array4; // 배열의 선언과 객체 대입 분리 가능
        array4 = new int[][] {{1,2},{3,4,5}};
        
        System.out.println("array4");
        System.out.println(array4[0][0] + " " + array4[0][1]);
        System.out.println(array4[1][0]+ " " + array4[1][1] + " " +array4[1][2]);
        System.out.println();

        // 비정방 행렬의 선언 및 값 대입 방법 3
        int[][] array5 = {{1,2},{3,4,5}};
        System.out.println("array5");
        System.out.println(array5[0][0] + " " + array5[0][1]);
        System.out.println(array5[1][0]+ " " + array5[1][1] + " " +array5[1][2]);
        System.out.println();

        // error
        // int[][] array6;
        // array6 = {{1,2},{3,4,5}};
    }
}

 

2차원 배열의 원소 값 출력

public class Array_Ex08 {
    public static void main(String[] args) {
        // 2차원 배열의 출력

        // // 이중 for문을 이용한 2차월 배열 원소 출력
        // int[][] a = {{1,2},{3,4,5}};
        
        // for(int i=0; i<a.length; i++) {
        //     for(int j=0; j<a[i].length; j++) {
        //         System.out.println(a[i][j]);
        //     }
        // }

        // System.out.println();
        // // 이중 for-each문을 이용한 2차원 배열 원소 출력
        // for(int[] m : a){
        //     for(int n : m) {
        //         System.out.println(n);
        //     }
        // }

        // 2차원 배열의 원소값 출력

        // 2차원 데이터의 배열의 길이
        int[][] array1 = new int[2][3];
        System.out.println(array1.length); // 행 개수
        System.out.println(array1[0].length); // 첫번째 행의 열 개수
        System.out.println(array1[1].length); // 첫번째 행의 열 개수
        System.out.println();

        int[][] array2 = new int[][] {{1,2},{3,4,5}};
        System.out.println(array2.length); // 행 개수
        System.out.println(array2[0].length); // 첫번째 행의 열 개수
        System.out.println(array2[1].length); // 첫번째 행의 열 개수
        System.out.println();

        // 2차원 배열의 출력 방법
        System.out.print(array2[0][0]+ " ");
        System.out.print(array2[0][1]+ " ");
        System.out.println();
        System.out.print(array2[1][0]+ " ");
        System.out.print(array2[1][1]+ " ");
        System.out.print(array2[1][2]);
        System.out.println();

        System.out.println();
            // 이중 for문 사용
        for(int i=0; i<array2.length; i++){
            for(int j=0; j<array2[i].length; j++) {
                System.out.print(array2[i][j] + " ");
            }
            System.out.println();
        }

        System.out.println();
            //for-each문 사용
        for(int[] array :  array2) {
            for(int k : array) {
                System.out.print(k + " ");
            }
            System.out.println();
        }

    }
}

 

 


문자열을 저장하는 String

String 참조변수명 = new String("문자열") String 참조변수명 = "문자열"
String str = new String("Hello"); String str = "Hello";

 

String 객체 저장하기

import java.util.Arrays;

public class CreatString {
    public static void main(String[] args) {
        // // String으로 객체를 생성하는 방법 - 1
        // String str1 = new String("Hello");
        // System.out.println(str1);
        
        // // String으로 객체를 생성하는 방법 - 2
        // String str2 = "Hello!!";
        // System.out.println(str2);
        
        // 객체 안의 값을 변경하면 새로운 객체를 생성
        String str1 = new String("hello");
        String str2 = str1;
        str1 = "Hello World!";
        System.out.println(str1); // Hello World!
        System.out.println(str2); // hello


        // 문자열 수정
        String str3 = new String("hi");
        String str4 = str3;
        
        str3 = "hi hello";
        System.out.println(str3); // hi hello  바뀜
        System.out.println(str4); // hi -복사전 바뀌지 않음

        // 배열 참조형 수정
        int[] array1 = new int[] {3,4,5};
        int[] array2 = array1; // 참조형은 그냥 다 바꿈
        array1[0] = 6; 
        array1[1] = 7; 
        array1[2] = 8;
        System.out.println(Arrays.toString(array1)); 
        System.out.println(Arrays.toString(array2)); 
    }
}

 

문자열  + ?

public class PlusOperationOfString {
    public static void main(String[] args) {
        // 문자열 + 문자열
        String str1 = "안녕" + "하세요" + "!" ;
        System.out.println(str1);

        String str2 = "반갑";
        str2 += "습니다";
        str2 += "!";
        System.out.println(str2);
        System.out.println();

        // 문자열 + 기본 자료형 또는 기본자료형+ 문자열
        String str3 = "안녕" + 1;
        String str4 = "안녕" + String.valueOf(1); // 문자열로 변환
        String str5 = "안녕" + "1";

        System.out.println(str3);
        System.out.println(str4);
        System.out.println(str5);
        System.out.println();

        // 문자열과 기본자료형 혼용
        System.out.println(1 + "안녕");     // 1안녕
        System.out.println(1 + "안녕" + 2); // 1안녕2
        System.out.println("안녕" + 1 + 2); // 안녕12
        System.out.println(1 + 2 + "안녕"); // 앞에서부터 연산수행 3안녕
    }
}

 

 

String 클래스의 주요 메서드 1

 

문자열 길이 length, 

문자열 검색 charAt(),  indexOf(), lastIndexOf(), 

문자열 변환 및 연결 String.valueOf(기본자료형) : 기본자료형 -> 문자열 변환

문자열 연결 concat()

import java.util.Arrays;

public class MethodOfString {
    public static void main(String[] args) {
        // 문자열 길이
        String str1 = "Hello Java!";
        String str2 = "안녕하세요! 반갑습니다.";
        System.out.println(str1.length()); // 11        
        System.out.println(str2.length()); // 13        
        System.out.println();        

        // 문자열 검색
        // @charAt()
        System.out.println(str1.charAt(1)); // e
        System.out.println(str2.charAt(1)); // 녕
        System.out.println();

        // @indexOf(), @lastIndexOf()
        System.out.println(str1.indexOf('a'));          // 7
        System.out.println(str1.lastIndexOf('a'));      // 9
        System.out.println(str1.indexOf('a', 8));       // 9
        System.out.println(str1.lastIndexOf('a', 8));   // 7
        System.out.println(str1.indexOf("Java"));       // 6 
        System.out.println(str2.lastIndexOf("하세요")); // 2
        System.out.println(str1.indexOf("Bye"));        // 없는 경우 -1반환
        System.out.println(str2.lastIndexOf("고맙습니다")); // 없는 경우 -1반환
        System.out.println();

        // 문자열 반환 및 연결
        // @String.valueOf(기본자료형) : 기본자료형 -> 문자열 반환
        String str3 = String.valueOf(2.3);
        String str4 = String.valueOf(false);
        System.out.println(str3);
        System.out.println(str4);

        // @concat() : 문자열 연결
        String str5 = str3.concat(str4);
        System.out.println(str5);

        // String.valueOf() + concat()
        String str6 = "안녕"+3;
        String str7 = "안녕".concat(String.valueOf(3));
        System.out.println(str6);
        System.out.println(str7);

        String str8 = "Hello Java!";
        String str9 = "안녕하세요!";

        // @toCharArray() : 문자열 -> char[] 변환
        char[] array3 = str8.toCharArray();
        char[] array4 = str9.toCharArray();
        System.out.println(Arrays.toString(array3));
        System.out.println(Arrays.toString(array4));

    }
}

 

String 클래스의 주요메서드 2

문자열 수정 toLowerCase(), toUpperCase(), replace()

문자열 일부 substring(),

특정 기호를 기준으로 문자열 분리 split(),

문자열 좌우공백 제거 trim()

문자열 내용비교 equals(), equalsIgnoreCase()

import java.util.Arrays;

public class MethodOfString2 {
    public static void main(String[] args) {
        // 문자열 수정
        // @toLowerCase(). @toUpperCase()
        String str1 = "Java Study";
        System.out.println(str1.toLowerCase());
        System.out.println(str1.toUpperCase());

        // @replace()
        System.out.println(str1.replace("Study", "공부"));

        // @split()
        String[] strArray = "abc/def-ghi jkl".split("/|-| "); // /또는 -또는  ' '공백 으로 구분된 문자열 배열 반환
        System.out.println(Arrays.toString(strArray));
        
        // @trim()
        System.out.println("     abc     ".trim());

        System.out.println();

        // 문자열 내용 비교
        String str2 = new String("Java");
        String str3 = new String("Java");
        String str4 = new String("java");

        // @stack 메모리 비교 == : 위치 비교
        System.out.println(str2 == str3); // false
        System.out.println(str3 == str4); // false
        System.out.println(str4 == str2); // false

        // @equals(), @equalsIgnoreCase() : 내용비교
        System.out.println(str2.equals(str3)); // true
        System.out.println(str3.equals(str4)); // false
        System.out.println(str3.equalsIgnoreCase(str4)); // true

    }
}

 

 

문자열 - 이름과 나이 뽑아 내기

public class StringStr {
    public static void main(String[] args) {
        String str = "내 이름은 [홍길동]입니다. 나이는 [15]살 입니다";
        String name;
        int age;
        
        int Start1 = str.indexOf("[");
        int end1 = str.indexOf("]");
        name = str.substring(Start1+1, end1);

        int Start2 = str.lastIndexOf("[");
        int end2 = str.lastIndexOf("]");
        // age = str.substring(Start2+1, end2); // 형변환 필요
        age = Integer.parseInt(str.substring(Start2+1, end2));
        
        System.out.println(name); // 홍길동
        System.out.println(age);  // 15
    }
}