3.1. 발표 내용 ¶
- C에서의 배열은 선언과 생성이 동시에 되나, Java에서는 선언과 생성이 다름.
int[] arr; : 선언 arr = new int[5]; : 생성 int[] arr = new int[5]; : 선언과 생성, 동시에. 자동으로 0으로 초기화 int[] arr = {1, 2, 3, 4, 5}; 이런 형식도 가능. 단, 이 경우에는 선언과 생성을 동시에 할 경우에만. 먼저 선언을 했을 경우에는 int[] arr; arr = new int[]{1, 2, 3, 4, 5}; int[] arr = {1, 2, 3, 4, 5}; 선언과 동시에 생성과 값 입력 가능
- 생성 후 크기 변경도 가능.
int[] arr; arr = new int[3]; arr = new int[5]; → 문제없음.
- 함수의 return형이 배열인 것도 가능.
- public static int[] function() {...}
- public static int[] function() {...}
- arr.length : 배열의 길이값을 return하는 메서드
- 다차원 배열
선언 : int[][] arr; 생성 : arr = new int[3][]; → 열의 길이를 비워둘 수 있음 arr[0] = new int[3]; arr[1] = new int[2]; → 각 행의 배열 길이가 모두 달라도 됨 //다차원 배열에서의 length 메서드 arr.length == 3 arr[0].length == 3 arr[1].length == 2
- for-each 구문
int[] arr = {1, 2, 3, 4, 5}; for (int e : arr) { System.out.print(e); } → 출력값 : 12345 for (int e : arr) { e++; System.out.print(e); } → 출력값 : 23456 //e는 index가 아니라, arr[index]의 값을 잠깐 받아놓는 역할.
- arraycopy 메소드
int[] arr1 = {1, 2, 3}; int[] arr2 = {11, 12, 13, 14}; System.arraycopy (arr1, 0, arr2, 1, 2); → arr2 = {11, 1, 2, 14}; // arr1[0]부터 2개의 값을, arr2[1]부터 2개의 값으로 복사.
- main함수의 String[] args ??
- command line에서 문자열들을 입력받을 수 있음.
- command line에서 문자열들을 입력받을 수 있음.
java program abc 123 args[0] == abc args[1] == 123
5. 과제 ¶
- 임의의 n*n 행렬을 입력받아 (n+1)*(n+1) 행렬을 생성해, (n+1)번째 행과 열에 각 행과 열의 합을 계산하여 넣고 출력하는 프로그램을 작성하라.
- 행렬의 크기 n은 입력을 받으면 더 쉽다. 안 받고도 만들어보자.
- n*m으로도 만들어보자.
- 행렬의 크기 n은 입력을 받으면 더 쉽다. 안 받고도 만들어보자.
예시 input 1 2 3 4 5 6 7 8 9 output 1 2 3 6 4 5 6 15 7 8 9 24 12 15 18 45
5.3. 이지수 ¶
import java.io.*; import java.util.Scanner; public class Jisu { @SuppressWarnings("resource") public static void main(String[] ar) throws IOException{ int[] tempArr = new int[1000]; //입력값을 저장할 임시 행렬 int[][] matrix; int i, n = 0; Scanner in = new Scanner(System.in); System.out.println("경고 : 입력받는 숫자의 개수는 제곱수이어야 합니다."); for(i=0; i<1000; i++){ System.out.print(i+1 + "번째 원소를 입력하세요(-1은 종료). : "); tempArr[i] = in.nextInt(); if(tempArr[i] == -1) break; n++; } matrix = cloneArray(tempArr, n); //일차원의 임시 행렬을 이차 행렬로 복사하여 matrix에 대입한다. matrix = sumElementOfArray(matrix); //이차 행렬의 각 행과 열의 원소 값을 합한다. printArray(matrix); //행렬을 출력한다. } public static int[][] cloneArray(int[] oneDimArr, int arrLength){ int length = (int) Math.pow(arrLength, 0.5); '''//여기서 0.5 대신 1/2를 입력하면 안 된다. 왜지...''' int[][] twoDimArr = new int[length+1][length+1]; int i, j = 0; for(i = 0; i<length; i++){ System.arraycopy(oneDimArr, j, twoDimArr[i], 0, length); j = j + length; } return twoDimArr; } public static int[][] sumElementOfArray(int [][] arr){ int n = arr[0].length; int i, j; for(i=0; i<n-1; i++){ for(j=0; j<n-1; j++){ arr[i][n-1] += arr[i][j]; arr[n-1][i] += arr[j][i]; } arr[n-1][n-1] += arr[i][n-1]; } return arr; } public static void printArray(int[][] arr){ System.out.println("\n결과 : "); for(int[] row : arr){ for(int col : row){ System.out.print(col + " "); } System.out.println(); } } }
일단 n*n으로 했습니다. 그리고 출력 형태가 영 안이쁘네요.
예외 처리도 안 되었구요.
나중에 수정해보도록 하죠.
예외 처리도 안 되었구요.
나중에 수정해보도록 하죠.
5.4. 김용준 ¶
import java.util.Scanner; public class _20140709 { public static void main(String[] args) { Scanner scan = new Scanner( System.in ); System.out.print("input n : "); int n = scan.nextInt(); int [][]map = new int[n+1][n+1]; for(int r = 0; r < n;r++){ for(int c = 0; c < n;c++){ map[r][c] = scan.nextInt(); map[r][n] += map[r][c]; map[n][c] += map[r][c]; map[n][n] += map[r][c]; } } System.out.printf("\noutput\n"); for(int r = 0; r <= n;r++){ for(int c = 0; c <= n;c++){ System.out.printf("%3d",map[r][c]); } System.out.println(); } } }
6. 후기 ¶
- for-each 구문은 다차원에서도 사용 가능한지 궁금하네요. 그리고 자바에서도 다차원 배열이 C와 같이 일차원 배열과 메모리값이 같은지도 알아보고 싶군요. - 유재범
- for-each를 활용한 2차 배열 출력입니다. - 이지수
- for-each를 활용한 2차 배열 출력입니다. - 이지수
int[][] array = new int[][]{{1, 2, 3}, {2, 3, 4}}; for(int[] row : array){ for(int col : row){ System.out.print(col); } }
- 아까 정민이가 배열을 선언하고 나서 그 크기를 바꾸는 것은 괜찮다고 했는데, 그렇게 할 경우 새로운 크기의 배열은 무조건 0으로 초기화가 되는군요...값 보존이 안 되네요.
int[] arr = new int[]{1,2,3,4}; arr = new int[3]; for(int n: arr){ System.out.print(n + " "); }이렇게 할 경우
0 0 0이렇게 나와요. - 이지수
- new라는 것 자체가 메모리를 할당해주는건데, arr에 새로 new int[]를 해주는 순간 기존의 할당된 메모리와 관계없이 다른 메모리가 할당되는 거니까 라고 설명하면 되려나? - 최다인
- java에서는 주소값을 볼 수 있는 방법이 없나 궁금하네요. 주소값 볼 수 있으면 C언어와 java의 배열 차이점을 구분 할 수 있을탠데요. - 유재범
- 찾아보니까 가능하다는 말은 없습니다. 일단은 java에서는 주소값을 직접 볼 수 없다고 잠정적으로 결론을 내렸는데 정확한 답을 아시는 분은 답변 해주세요. - 유재범
- 찾아보니까 가능하다는 말은 없습니다. 일단은 java에서는 주소값을 직접 볼 수 없다고 잠정적으로 결론을 내렸는데 정확한 답을 아시는 분은 답변 해주세요. - 유재범
- 방금 찾은 건데 java는 call by reference 같다고 생각하겠지만 call by value라고 합니다...
는 저도 잘 모르겠네요. 자세히 찾고 수정하도록 하겠습니다.(일단 질문은 던지고 본다.)- 유재범
- primitives도 object도 call by value를 한다고 합니다. 정확한 해석인지는 모르겠지만 sun사에서 point라는 표현을 잘못 사용하였다고 된 것으로 봐서 java의 포인터는 우리가 C에서 알던 포인터와 조금 다른 것인 것 같습니다. 자료를 찾은 사이트를 대신 올립니다. http://javadude.com/articles/passbyvalue.htm - 유재범
- primitives도 object도 call by value를 한다고 합니다. 정확한 해석인지는 모르겠지만 sun사에서 point라는 표현을 잘못 사용하였다고 된 것으로 봐서 java의 포인터는 우리가 C에서 알던 포인터와 조금 다른 것인 것 같습니다. 자료를 찾은 사이트를 대신 올립니다. http://javadude.com/articles/passbyvalue.htm - 유재범
- System.out.print(배열이름)하면 볼 수 있답니다. 그러나 이 경우에는 두 배열을 이름으로 구분할 수 없자나요..둘의 주소값이 같은지다른지 어떻게 확인할까요ㅠ - 이지수
- 상속이란 개념을 미리 봐서 그런지 주소값이 필요하다는 생각이 안 드네요. - 김용준
잌ㅋㅋ, 저거 안되는군요. 사실 저거 잘 모르고 설명한거라.. 죄송요 - 김정민
- 지수 과제코드가 왜이리 길음? 부담스럽다. - 김용준
- 질문을 잘못봤다고 합니다. 결국 설명이 잘못됨.. - 김정민
- 이게 맞는거 같습니다 - 김용준
int [] a; // 배열의 선언 a=new int[3]; // 배열의 생성 - int형의 공간을 3개로 만듬.(JVM이 메모리 할당)
- 이 정보 추가 했습니다. - 김용준
int[] arr = {1, 2, 3, 4, 5}; 선언과 동시에 생성과 값 입력 가능