U E D R , A S I H C RSS

한자공/시즌3/20140709 (rev. 1.58)

한자공/시즌3/20140709


1. 일시

  • 오후 12시 15분 ~ 12시 45분

2. 참가자

유재범 불참
최다인 참석
이지수 참석
김용준 불참
김정민 참석

3. 진행 상황

  • 김정민 학우의 발표
    • Java의 정석 - Chapter 5

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() {...}

  • 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에서 문자열들을 입력받을 수 있음.

java program abc 123

args[0] == abc
args[1] == 123

4. 다음 진행

  • Chapter 6
    • 객체지향 프로그래밍 1
  • 발표 : 최다인

5. 과제

  • 임의의 n*n 행렬을 입력받아 (n+1)*(n+1) 행렬을 생성해, (n+1)번째 행과 열에 각 행과 열의 합을 계산하여 넣고 출력하는 프로그램을 작성하라.
    • 행렬의 크기 n은 입력을 받으면 더 쉽다. 안 받고도 만들어보자.
    • n*m으로도 만들어보자.

예시

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.1. 유재범

5.2. 최다인

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();
		}
	}
}

5.5. 김정민

6. 후기

  • for-each 구문은 다차원에서도 사용 가능한지 궁금하네요. 그리고 자바에서도 다차원 배열이 C와 같이 일차원 배열과 메모리값이 같은지도 알아보고 싶군요. - 유재범
    • 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는 call by reference 같다고 생각하겠지만 call by value라고 합니다... 는 저도 잘 모르겠네요. 자세히 찾고 수정하도록 하겠습니다.(일단 질문은 던지고 본다.) - 유재범
    • primitives도 object도 call by value를 한다고 합니다. 정확한 해석인지는 모르겠지만 sun사에서 point라는 표현을 잘못 사용하였다고 된 것으로 봐서 java의 포인터는 우리가 C에서 알던 포인터와 조금 다른 것인 것 같습니다. 자료를 찾은 사이트를 대신 올립니다. http://javadude.com/articles/passbyvalue.htm - 유재범
  • System.out.print(배열이름)하면 볼 수 있답니다. 그러나 이 경우에는 두 배열을 이름으로 구분할 수 없자나요..둘의 주소값이 같은지다른지 어떻게 확인할까요ㅠ - 이지수
    • new 한번 하고 print로 출력 하고 다시 new할당하고 출력. - 최다인
      • 아 그거 해봤었는데 주소값 같게 나오더라구요ㅎㅎ - 이지수
  • 상속이란 개념을 미리 봐서 그런지 주소값이 필요하다는 생각이 안 드네요. - 김용준
  • 잌ㅋㅋ, 저거 안되는군요. 사실 저거 잘 모르고 설명한거라.. 죄송요 - 김정민
  • 지수 과제코드가 왜이리 길음? 부담스럽다. - 김용준
  • 질문을 잘못봤다고 합니다. 결국 설명이 잘못됨.. - 김정민
  • 이게 맞는거 같습니다 - 김용준

int [] a; // 배열의 선언
 a=new int[3]; // 배열의 생성 - int형의 공간을 3개로 만듬.(JVM이 메모리 할당) 

int[] arr = {1, 2, 3, 4, 5};
선언과 동시에 생성과 값 입력 가능
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:31:31
Processing time 0.0298 sec