Java 참조 타입 #3

jjinny_0609·2023년 2월 7일
0

Java

목록 보기
8/31

배열 연습문제

//10, 20, 30, 50, 3, 60, -1값을 배열에 저장하고 아래 문제를 풀어보세요
int[] arr = {10, 20, 30, 50, 3, 60, -3};

문제1. arr 배열 중에서 인덱스가 1인 곳의 값을 출력해보자.

문제2. arr 배열 중에서 값이 60인 곳의 인덱스를 출력해보자.

문제3. arr 배열의 인덱스가 3인곳은 출력하지 말고, 나머지만 출력해보자.

package ch05;

public class Prac_arr {
public static void main(String[] args) {
int[] arr = {10, 20, 30, 50, 3, 60, -3}; //방법 1
/ int[] arr = new int[7]; 방법2
arr[0]=10;
arr[1]=20;
arr[2]=30;
arr[3]=50;
arr[4]=3;
arr[5]=60;
arr[6]=-3;
/

// 문제1. arr 배열 중에서 인덱스가 1인 곳의 값을 출력해보자.
System.out.println(arr[1]);
// 문제2. arr 배열 중에서 값이 60인 곳의 인덱스를 출력해보자.
for(int i=0; i<arr.length; i++) {
if(arr[i]==60) {
System.out.println(arr[i]);
}System.out.println();
}

// 문제3. arr 배열의 인덱스가 3인곳은 출력하지 말고, 나머지만 출력해보자.
for(int i=0; i<arr.length; i++) {
if(arr[i]==arr[3]) {
continue;
}else {
System.out.println(arr[i]);
}
}
}
}

명령 라인 입력

public static void main(String[] args) { }
에서 String[] args가 가지는 의미 : 위 코드에서 java 명령어로 실행하면 JVM은 길이가 0인 String 배열을 먼저 생성하고,
args는 main()메소드 호출 시 전달하는 역할을 합니다.

import ch02.IntergerLiteralExample;

public class MainStringAgument {
	public static void main(String[] args) {
		if(args.length !=2) {
			System.out.println("값의 수가 부족합니다.");
			System.exit(0);
		}
		String strNum1 = args[0];
		String strNum2 = args[1];
		
		int num1 = Integer.parseInt(strNum1);
		int num2 = Integer.parseInt(strNum2);
		
		int result = num1 + num2;
		System.out.println(num1 + " + " + num2 + " = " + result);
	}
}



Program arguments에 값 입력하고 Apply(적용) 누른뒤 Run하면 나타나는 결과

null 값을 가졌다가 arguments를 바꾸면 위와 같이 값이 들어간다.


함수에서 메서드 선언과 호출

  • 선언
    public static 리턴타입(자료형, void) 메서드명() {
    메서드 작성
    return 리턴 데이터; //return 이 void일 경우 return 없음
    }

-호출
메서드명();

package ch05;

public class ArrayCreateByVlaueList {
	public static void main(String[] args) {
		//int[] scores = {83,92,87}; 가능
		
		int[] scores;	//scores라는 배열을 선언
//		scores = {83,92,87}; //초기화와 선언 동시에 불가능
		scores = new int[] {83,90,87};
		int sum1 = 0;
		
		for(int i=0; i<scores.length;i++ ) {
			//sum1 = sum1 + scores[i]);
			sum1 += scores[i];
		}
		System.out.println("총합 : " + sum1);
		
		
		//add 메소드 호출
		//int sum2=add(83,92,87);
		int sum2 = add(new int[] { 83, 92, 87});
		System.out.println("총합 : " + sum2);
			
	}// main 메소드 끝
	
	// add 메소드 선언
//	public static int add(int num1, int num2, int num3) {
	public static int add(int[] score){
		int sum = 0;
		for(int i=0; i<score.length; i++) {
			sum += score[i];
		}
		return sum;	// sum값은 호출한곳으로 보냄 sum2로 보냄.
	}
}


다차원 배열

1차원인 아닌 배열 즉 2차원 이상의 배열을 다차원 배열이라고 합니다.
2차원 배열은 수학의 행렬을 떠올리면 되는데 가로 인덱스와 세로 인덱스를 사용합니다.

ex)
int[] score = new int[5]; // 1차원 배열
int score[] = new int[5]; // 1차원 배열
score1[0]=10;
score1[1]=20;
score1[2]=30;
score1[3]=40;
score1[4]=50;

int score[] = {10, 20, 30, 40, 50};

int[][] score2 = new int[5][3]; //2차원 배열 5행(가로 5줄) 3열(세로 3칸)
int score2[][] = new int[5][3]; //2차원 배열
int[] score2[] = new int[5][3]; //2차원 배열

  • 첫번째 2차원 배열 주는법
    score2[0][0] = 10; score2[0][1] = 20; score2[0][2] = 30;
    score2[1][0] = 40; score2[1][1]= 50; score2[1][2] = 60;
    score2[2][0] = 70; score2[2][1] = 80; score2[2][2] = 90;
    score2[3][0] = 70; score2[3][1] = 80; score2[3][2] = 90;
    score2[4][0] = 70; score2[4][1] = 80; score2[4][2] = 90;

  • 두번째 2차원 배열 주는법
    int score2[][] = {
    {10,20,30},
    {40,50,60},
    {70,80,90}
    {100,110,120}
    {130,140,150}
    }


ex) 배열 속 배열
public class ArrayInArrayExample {
	public static void main(String[] args) {
//		int[][] score2 = new int[5][3];
//		int score2[][] = new int[5][3];
//		int[] score2[] = new int[5][3];
		
//		score2[0][0] = 10;  score2[0][1] = 20; score2[0][2] = 30;
//		score2[1][0] = 40;  score2[1][1]= 50;  score2[1][2] = 60;
//		score2[2][0] = 70;  score2[2][1] = 80; score2[2][2] = 90;
//		score2[3][0] = 70;  score2[3][1] = 80; score2[3][2] = 90;
//		score2[4][0] = 70;  score2[4][1] = 80; score2[4][2] = 90;
		
		int score2[][] = {
				{10,20,30},
				{40,50,60},
				{70,80,90},
				{100,110,120},
				{130,140,150}
		};
		for(int i=0; i<5; i++) {
			for(int j=0; j<3; j++) {
				System.out.println("score2["+i+"]"+"["+j+"] : "+score2[i][j]);
			}System.out.println();
		}

		int[][] englishScores = new int[2][];

		englishScores[0] = new int[2];
		englishScores[1] = new int[3];
		for(int i = 0; i<englishScores.length; i++) {
			for(int k = 0; k <englishScores[i].length; k++) {
				System.out.println("englishScores["+i+"]["+k+"]="+englishScores[i][k]);
			}System.out.println();
		}System.out.println();
		
		int[][] javaScores = { {95, 80}, {92, 96, 80} };
		for(int i=0; i<javaScores.length; i++) {
			for(int k=0; k<javaScores[i].length; k++) {
				System.out.println("javaScores["+i+"]["+k+"]="
						+javaScores[i][k]);
			}
		}
	}
}

ex) 배열 행과 열 입력해서 확인하는 예제

import java.util.Scanner;

public class ArrayInArrayExample_prac {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x, y;
		System.out.println("array[x][y] x(행_가로)에 넣을 값 : ");
		x = sc.nextInt();
		System.out.println("array[x][y] y(열_세로)에 넣을 값 : ");
		y = sc.nextInt();
		
		
		int[][] array = new int[x][y]; 
		for(x=0; x<array.length; x++) {
			for(y=0; y<array[x].length; y++) {
				System.out.print("array["+x+"]"+"["+y+"] | ");
			}System.out.println();
		}
	}
}


배열 행과 열 입력해서 값을 넣고 행렬을 확인하는 예제

ex)

package ch05;

import java.util.Scanner;

public class ArrayInArrayExample_prac {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x, y;
		System.out.println("array[x][y] x(행_가로)에 넣을 값 : ");
		x = sc.nextInt();
		System.out.println("array[x][y] y(열_세로)에 넣을 값 : ");
		y = sc.nextInt();
		
		
		int[][] array = new int[x][y]; 
		for(x=0; x<array.length; x++) {
			for(y=0; y<array[x].length; y++) {
//				array[x][y] 배열에 값을 넣어서 저장
				System.out.println("배열에 저장할 값을 입력해주세요 : ");
				array[x][y] = sc.nextInt();
			}System.out.println();
		}
		for(x=0; x<array.length; x++) {
			for(y=0; y<array[x].length; y++) {
				System.out.print("array["+x+"]"+"["+y+"] : " + array[x][y]+ " | ");
			}System.out.println();
		}
	}
}


객체를 참조하는 배열

기본타입(byte, char, short, int, long, float, double, boolean) 배열은 각 항목에 직접 갖고 있지만,
참조 타입(클래스, 인터페이스) 배열은 각 항목에 객체의 번지를 가지고 있습니다.
String은 클래스이므로 String[] 배열은 각 항목에 문자열이 아니라, String 객체의 번지를 가지고 있습니다.
즉 String[] 배열은 객체를 참조하게 됩니다.

package ch05;

public class ArrayReferenceObjectExample {
	public static void main(String[] args) {
		String[] strArray = new String[3];
		
		strArray[0] = "Java";	
		strArray[1] = "Java";
		strArray[2] = new String("Java");
		
		System.out.println(strArray[0] == strArray[1]);	// true (같은 객체를 참조)
		System.out.println(strArray[0] == strArray[2]);	// false (다른 객체를 참조)
		System.out.println(strArray[0].equals(strArray[1])); // true (같은 객체를 참조)
		//.equals는 배열의 내용 값을 비교해서 같으면 true 아니면 false를 출력함 
	}
}


배열 복사

배열은 한 번 생성하면 크기를 변경할 수 없기 때문에더 많은 저장 공간이 필요하다면 더 클 배열을 새로 만들고
이전 배열로부터 항목 값들을 복사해야 합니다. 배열 간의 항목 값들을 복사하려면 for문을 사용하거나 System.arraycopy() 메소드를 사용합니다.
for문으로 배열을 복사하는 코드는 다음과 같습니다.

ex)

public class ArrayCopyByForExample {
	public static void main(String[] args) {
		int[] oldIntArray = {1,2,3};
		int[] newIntArray = new int[5];
		
		for(int i=0; i<oldIntArray.length; i++) {
			newIntArray[i] = oldIntArray[i];
		}
		for(int i=0; i<newIntArray.length; i++) {
			System.out.print(newIntArray[i] + ", ");
		}
	}
}


System.arraycopy()로 배열 복사

System.arraycopy 속성
System.arraycopy(src, srcPos, dest, destPos, length);
src : 원본배열
srcPos : 원본배열 시작인덱스
dest : 복사본배열
destPos : 복사본 배열 시작 인덱스
length : 길이

public class ArrayCopyExample {
	public static void main(String[] args) {
		String[] oldStrArray= {"java","array","copy"};
		
		String[] newStrArray = new String[5];
		
		// arrayCopy 메소드를 활용해서 복사
		//			   원본배열, 원본배열 시작인덱스, 복사본배열 , 복사본 배열 시작 인덱스, 길이
		System.arraycopy(oldStrArray, 0, newStrArray, 0, oldStrArray.length);
		
		for(int i = 0; i<newStrArray.length; i++) {
			System.out.println(newStrArray[i]);
		}
	}
}


향상된 for문

사용법
for( ② 타입 변수 : ① 배열 ){
③ 실행문;
}

자바스크립트
for 변수 in 배열{
실행문;
}

public class AdvancedForExample {
package ch05;

public class AdvancedForExample {
	public static void main(String[] args) {
		int[] scores = {95, 71, 84, 93, 87};
		
		int sum = 0;
//		for(int i = 0; i < scores.length; i++) { //일반적인 for
//						배열의 길이만큼 반복		
		for(int score : scores) {
			sum += score;//sum = sum + scores[i];
		}
		System.out.println("점수 통합 = " + sum);
		
		double avg = (double)sum / scores.length;
		System.out.println("점수 평균 = " + avg);
	}
}

끝.

profile
뉴비 개발자 입니다. velog 주소 : https://velog.io/@jjinny_0609 Github 주소 :

0개의 댓글