Coding(Java)/Java(이론)2021. 9. 24. 16:30
반응형

[Java] 15. 배열(1)

 

 

다음은 자바에서 배열을 구별하는 기준이다.

배열 1차원배열 기본 자료형 배열
객체형 배열
다차원배열 기본 자료형 배열
객체형 배열

 

1차원 배열은 같은 자료형끼리 모을 수 있는 묶음이 하나밖에 없는 것을 의미한다(1단 책꽂이(객체)를 생각할 것).

 

기본 자료형

기본 자료형은 boolean, char, int float등과 같은 기본 자료형들을 가지고 배열을 생성하는 것이다.

배열은 다음의 과정을 거쳐 만들어진다

1. 배열 선언: char[] ch(또는 char ch[];)

이 배열은 오로지 char형만 저장할 수 있고, 이 배열을 참조할 수 있는 참조변수는 ch이다. 여기까지는 선언만 했을 뿐 실제 배열 객체가 생성되지는 않는다(stack영역에만 ch가 있고, heap영역은 공백).

*배열은 하나의 객체이다. 

2. 배열 생성:ch=new char[4]

new연산자를 통해 배열 객체를 명시적으로 생성한다. []괄호 안에는 배열의 개수를 입력한다. 여기서는 4를 입력했으므로 4개 배열을 생성했음을 뜻한다(stack영역에는 ch가, heap영역에는 4개의 배열).

*배열의 길이는 '참조변수명.length'명령으로 구할 수 있고, 배열의 개수는 길이를 초과할 수 없다.

3. 배열 초기화: ch[0]='J', ch[1]='a', ch[2]='v', ch[3]='a'

생성 단계에서 기본값(공백)으로 초기화되는데 원하는 프로그램의 움직임을 가져오기 위해서는 초기화 작업을 해야 한다.  

ch[0]='J', ch[1]='a', ch[2]='v', ch[3]='a'은 ch배열의 0번째에 J, 1번째에 a, 2번째에 v, 3번째에 a를 설정하는 것이다.

*배열 요소들은 각각을 참조할 수 있는 index값을 갖는데 항상 첫 번째 index는 0부터 시작한다.  

 

객체형 배열

객체형 배열은 기본 자료형과 거의 비슷하지만 차이점이 있다면 char형 또는 int형과 같은 기본 자료형들의 묶음(집합)이 아니라 객체를 참조하는 참조변수들의 집합이다(참조형 배열이라고도 한다).

객체형 배열은 집에 있는 우편함을 한 곳에 모아둔 것을 생각하면 된다(우편함은 가정이라는 객체의 주소를 대신하고, 이들의 집합이 참조형 배열이다).   

 

다음은 1차원 배열을 이용한 프로그램이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package myutil;
 
import java.util.Arrays;
 
public class MyArray1 {
    
    public static void display(int [] mr2) {
        
        for(int i=0;i<mr2.length;i++) {
            System.out.printf("%-3d", mr2[i]);
        }
    
        System.out.println();;//줄바꾸기
        
        //정렬(sort)
        /*Arrays.sort(mr);
        
        System.out.println("---sort한 결과---");
        /*
         *for(int i=0; i<mr.length;i++) {System.out.printf("%-3d", mr[i]); }
         *system.out.println(); //줄바꾸기
         */
        //클래스명, 메소드명();
        //Array1.display(mr);
        
    }
    
    
    public static void fill(int [] mr, int newVal) {
        
        for(int i=0;i<mr.length;i++) {
            
            mr[i]=newVal;
        }
    }
    
    public static void fill(int [] mr, int fromIndex, int toIndex, int newVal) {
        
        for(int i=fromIndex ;i<toIndex;i++) {
            
            mr[i]=newVal;
        }
    }
    
    //Selection Sort(선택정렬)
    
    //오름차순(Ascending)
    public static void sort_asc(int [] mr) {
        
        for(int i=0; i<mr.length-1;i++) {//selection index
            
            for(int k=i+1;k<mr.length;k++) {
                
                //swap(값 교환)
                if(mr[i]>mr[k]) {
                    int im=mr[i];
                    mr[i]=mr[k];
                    mr[k]=im;
                }
                
            }
        }
    }
        
    //내림차순(Descending)
    public static void sort_desc(int [] mr) {
        
        for(int i=0; i<mr.length-1;i++) {//selection index
            
            for(int k=i+1;k<mr.length;k++) {
                
                //swap(값 교환)
                if(mr[i]<mr[k]) {
                    int im=mr[i];
                    mr[i]=mr[k];
                    mr[k]=im;
                }
                
            }
        }
    }
}
 
cs

위 프로그램은 배열의 줄바꾸기, 오름차순, 내림차순을 위한 클래스이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package mymain;
 
import java.util.Arrays;
 
import myutil.MyArray1;
 
public class _01_Array1_test1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //1차원배열을 참조하는 변수
        int [] mr;
        
        //1차원배열을 생성하고 배열정보를 mr에게 넘긴다
        mr=new int[4];
        
        System.out.printf("mr's length=%d\n", mr.length);
        
        //각 배열의 요소(element)에 값을 넣는다
        mr[0]=1;
        mr[1]=2;
        mr[2]=3;
        mr[3]=4;
        
        //출력
        for(int i=0;i<mr.length;i++) {//i=0 1 2 3 
            
            System.out.printf("mr[%d]:%d\n", i, mr[i]);
            
        }
        
        //1차원배열을 관리하는 클래스: Arrays
        
        Arrays.fill(mr, 0); //배열의 모든 값을 0으로 채우기
        
        System.out.println("---0으로 채우기---");
        for(int i=0; i<mr.length;i++) {
            System.out.printf("%-3d", mr[i]);
        }
        
        System.out.println();//줄바꾸기
        
        //값을 무작위로 넣기
        mr[0]=4;
        mr[1]=2;
        mr[2]=3;
        mr[3]=1;
        
        System.out.println("---무작위로 채우기---");
        for(int i=0; i<mr.length;i++) {
            System.out.printf("%-3d", mr[i]);
        }
        
        System.out.println();//줄바꾸기
        
        //정렬(sort)
        Arrays.sort(mr);
        
        System.out.println("---sort한 결과---");
        /*
        for(int i=0; i<mr.length;i++) {
            System.out.printf("%-3d", mr[i]);
        }
        System.out.println();//줄바꾸기
        */
        //클래스명.메소드명();
        MyArray1.display(mr);
        
        //모든값 1로 설정
        MyArray1.fill(mr, 1);
        
        System.out.println("--- 모두 1로 설정 ---");
        MyArray1.display(mr);//출력
        
        //기존 API
        //             from  to
        //             시작  시작+개수
        Arrays.fill(mr, 1,   1+2      , 9);
        System.out.println("-- 2,3칸 9로 채우기 ---");
        MyArray1.display(mr);
        
        MyArray1.fill(mr, 135);
        System.out.println("-- 내가 구현한 MyArray1: 2,3칸 5로 채우기 ---");
        MyArray1.display(mr);
        
        //값을 무작위로 넣기
        mr[0]=4;
        mr[1]=2;
        mr[2]=3;
        mr[3]=1;
        System.out.println("---무작위로 채우기---");
        MyArray1.display(mr);
        
        //정렬: 
        //오름차순(ascending sort) : 작은->큰
        //내림차순(descending sort): 큰->작은
        
        MyArray1.sort_asc(mr);
        System.out.println("---오름차순 정렬---");
        MyArray1.display(mr);
        
        MyArray1.sort_desc(mr);
        System.out.println("---내림차순 정렬---");
        MyArray1.display(mr);
 
    }
 
}
 
cs

이 프로그램은 길이, 배열의성분, 채우기, 설정, 특정한 수로 채우기 등을 실행하는 프로그램이고, 그 실행결과는 다음과 같다.

mr's length=4
mr[0]:1
mr[1]:2
mr[2]:3
mr[3]:4
---0으로 채우기---
0  0  0  0  
---무작위로 채우기---
4  2  3  1  
---sort한 결과---
1  2  3  4  
--- 모두 1로 설정 ---
1  1  1  1  
-- 2,3칸 9로 채우기 ---
1  9  9  1  
-- 내가 구현한 MyArray1: 2,3칸 5로 채우기 ---
1  5  5  1  
---무작위로 채우기---
4  2  3  1  
---오름차순 정렬---
1  2  3  4  
---내림차순 정렬---
4  3  2  1  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package mymain;
 
import myutil.MyArray1;
 
public class _02_Array1_test2_초기화 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //초기화: 변수 선언과 동시에 값을 넣는 것
        int a=10;
        
        //배열 초기화         0 1 2 3 4
        //배열 초기화 시 개수부분 생략       
        //int [] mr=new int[] {1,2,3,4,5};//new int[]생략 
        int [] mr={1,2,3,4,5};
        
        //대입(치환) 
        int [] mr2;
        mr2=new int[]{10,20,30,40,50};
        
        System.out.println("---mr---");
        MyArray1.display(mr);
        
        System.out.println("---mr2---");
        MyArray1.display(mr2);
                
    }
}
 
cs

이 프로그램은 초기화를 통해 변수 선언과 동시에 값을 대입하고, 치환하는 프로그램이고, 그 결과는 다음과 같다.

*여기서 사용된 클래스는 맨 위의 클래스이다.

---mr---
1  2  3  4  5  
---mr2---
10 20 30 40 50 

다음은 1차원배열을 응용해 특정 월에 며칠이 있는지, 몇년도생은 무슨 띠인지 구하는 프로그램이다. 

*이 프로그램 역시 맨 위의 클래스를 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package mymain;
 
import myutil.MyArray1;
 
public class _03_Array1_test3_활용 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        //                    1  2  3  4  5  6  7  8  9 10 11 12   <=month
        //                    0  1  2  3  4  5  6  7  8  9 10 11   <=index  (month-1)
        int [] month_array= {31,28,31,30,31,30,31,31,30,31,30,31};
        
        int month=8;
        
        System.out.printf("[%d]월은 [%d]일까지 있습니다\n", month, month_array[month-1]); //month-1은 첨자
        
        //출생년도를 이용해서 띠 구하기
        
        int year=1999;
        
        //       4   5   6   7   8   9   0   1   2   3
        //10간: 갑, 을, 병, 정, 무, 기, 경, 신, 임, 계          <=출생년도%10
        //       4   5   6   7   8   9  10  11   0   1   2   3
        //12지: 자, 축, 인, 묘, 진, 사, 오, 미, 신, 유, 술, 해  <=출생년도%12
        
        //띠 구하기: 출생년도%12
        //       4   5   6   7   8   9  10  11   0   1   2   3  <=tti_index <= year%12
        //12지: 자, 축, 인, 묘, 진, 사, 오, 미, 신, 유, 술, 해
        
        //                          0    1    2    3     4    5      6       7     8    9    10   11
        String [] tti_array= {"원숭이","닭","개","돼지","쥐","소","호랑이","토끼","용","뱀","말","양"};
        
        System.out.printf("[%d]년생의 띠는 [%s]띠 입니다.",year, tti_array[year%12]);
                
    }
}
 
cs

이 프로그램의 실행결과는 다음과 같다.

[8]월은 [31]일까지 있습니다
[1999]년생의 띠는 [토끼]띠 입니다.
반응형

'Coding(Java) > Java(이론)' 카테고리의 다른 글

[Java] 17. 클래스 예제  (0) 2021.10.11
[Java] 16. 배열(2)  (0) 2021.09.24
[Java] 14. 메소드 예제  (0) 2021.09.09
[Java] 13. 클래스의 정의와 메소드  (0) 2021.09.02
[Java] 12. 다중반복문, break&continue label  (0) 2021.08.31
Posted by skywalker222