웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.03.19

shine94 2020. 3. 19. 09:01

1. JVM의 메모리 영역
1) Method Area(메소드 영역)
 : 프로그램 시작될때 생성, 프로그램 종료될 때 소멸
   byte code, 리터럴(literal), 상수(final), static

2) Heap(힙)
 : new 생성시 생성, reference가 끊기면 Garbage Collection에 의해 자동으로 소멸
   객체(object), 배열, new로 생성되는 모든 것 

3) Stack(스택)
 : 블럭 안에서 선언될 때 생성, 블럭이 끝날 때 소멸
   지역변수(local variable), 매개변수(argument)

 

 

2. 배열 생성 초기화 할 때 JVM 메모리에서 일어나는 일
 : new 는 위와 같이 heap 에 객체를 생성하고, 생성된 주소를 리턴한다.  

리턴된 주소는 score 변수값에 대입되고 score 변수는 배열 객체를 reference(참조)하게 된다

[ex) int[] score = new int[3];
1) 지역변수 score가 스택에 생긴다
타입은 int[] 타입(reference 타입!)

2) new 로 생성한 int[3]개짜리 배열객체가 heap에 생성된다
각 배열원소는 int  타입이라 0 으로 초기화 됨.

 

[실습코드]


1. Lec10_Loop
1) practice.gugu2 패키지, Gugu2 클래스
** 숙제, 내가 작성한 코드 **

package practice.gugu2;
/*
 * 구구단 ver.2
 * 
 * 3개 열로 출력될수 있도록
 * 작성해보세요
 * 
 * 패키지: practice.gugu2
 * 클래스: Gugu2
*/
public class Gugu2 {

	public static void main(String[] args) {

		int start = 2;
		int end = 4;
		
		while(end < 10) {
			for(int n = 1; n < 10; n++) { 
				for(int dan = start; dan <= end; dan++) {
					System.out.print(dan + " x "+ n + " = " + (dan * n) + "\t");
				}
				System.out.println();
			}
			start += 3;
			end += 3;
			
			if(end == 10) {end -= 1;}
		}
        
	}

}

 

2) com.lec.java.loop05 패키지, Loop05Main 클래스

package com.lec.java.loop05;

public class Loop05Main {

	public static void main(String[] args) {
		System.out.println("순환문 연습 - 언제 100을 넘나?");
		// 1 + (-2) + 3 + (-4) + ...+ (n) >= 100 ?
		// 언제(n) 합이 100을 넘나?  그 합은?
		
		int sum = 0; // 합을 계산할 변수 선언&초기화
		for (int n = 1; sum < 100; n++) {
			int temp;
			if (n % 2 == 1) {
				// 홀수인 경우에는 숫자 그대로
				temp = n;
			} else {
				// 짝수인 경우에는 숫자를 음수로 바꿔서
				temp = -n;
			} // end else
			sum = sum + temp; // sum += temp;
			
			System.out.println("n = " + n + ", sum = " + sum);
		} // end for (n)
		
		System.out.println();
		System.out.println("순환문 연습 - 두 주사위 눈의 합");
		// 두 주사위 눈의 합 = 6
		// (1, 5), (2, 4), (3, 3), (4, 2), (5, 1)
		// x + y = 6를 만족하는 x, y 쌍을 찾으면 됨.
				
				for (int x = 1; x <= 6; x++) {
					for (int y = 1; y <= 6; y++) {
						if (x + y == 6) {
							System.out.println(x + ", " + y);
							//break;
						} // end if
						
					} // end for (y)
					
				} // end for (x)

		System.out.println("\n프로그램 종료");
	} // end main()

} // end class


3) com.lec.java.loop06 패키지, Loop06Main 클래스

package com.lec.java.loop06;
/* break 레이블;   // 레이블(label) 위치까지 순환문 탈출
 * 
 * 프로그래밍의 구조적 설계에 악영향을 줄수 있으니 가급적 지양하기 바랍니다 
 */
public class Loop06Main {

	public static void main(String[] args) {
		System.out.println("레이블 (label)");

		System.out.println();
		// 구구단이 결과가 50을 넘어가면 출력 종료. 어떻게 하나?
		// 맨 밑의 '프로그램 종료' 까지 진행해야 한다.
		
		z:	// 레이블은 반드시 순환문 직전에 표시
		for(int dan = 2; dan <= 9; dan++) {
			System.out.println(dan + "단");
			for(int n = 1; n <= 9; n++) {
				if(dan * n > 50) {
					break z;	//레이블 위치까지 탈출
				}
				
				System.out.println(dan + " x " + n + " = " + (dan * n));
			}
			System.out.println();
		}
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class

 

 

2. 반복제어문1, 자가진단04

package 반복제어문1.자가진단04;

import java.util.Scanner;
/*
 * 정수를 계속 입력받다가 100 이상의 수가 입력이 되면
 * 마지막 입력된 수를 포함하여 합계와 평균을 출력하는 프로그램을 작성하시오.
 * (평균은 반올림하여 소수 첫째자리까지 출력한다.)
 * 
 * [입력 예]
 * 1 2 3 4 5 6 7 8 9 10 100
 * 
 * [출력 예]
 * 155
 * 14.1
*/
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n;
		int sum = 0, cnt = 0;
		
		//for(;;) {}	// 무한루프
		for(;true;) {	// 무한루프
			n = sc.nextInt();
			sum += n;
			cnt++;
			if(n >= 100) {break;}
		}
		
		System.out.println(sum);
		System.out.printf("%.1f", (double)sum / cnt);
		
		sc.close();		// 위에가 무한루프면 Unreachable code 에러가 발생
					// 현재는 위의 코드가 무한루프에 빠져 나올수 있는 조건이 생겼기 때문에
					// 에러 메시지가 사라짐과 동시에 에러도 사라짐
		
	}

}

 

[추가] 위에가 무한루프면 Unreachable code 오류 발생

[추가] 현재는 위의 코드가 무한루프에 빠져 나올수 있는 조건이 생겼기 때문에
         에러 메시지가 사라짐과 동시에 에러도 사라짐

 


3. 반복제어문2, 자가진단07

package 반복제어문2.자가진단07;
/*
 * 아래와 같이 출력되는 프로그램을 작성하시오.
 * 2 3 4 5 6
 * 3 4 5 6 7
 * 4 5 6 7 8
 * 5 6 7 8 9
 * 6 7 8 9 10
 */
public class Main {

	public static void main(String[] args) {
		
		for(int i = 2; i <= 6; i++) {
			for(int j = 0; j < 5; j++) {
				System.out.print((i + j) + " ");
			}
			System.out.println();
		}

	}

}

 

 

4. 반복제어문1, 형성평가 실습 3

** 내가 만든 코드 **

package 반복제어문1.형성평가03;
/*
 * 0 부터 100 까지의 점수를 계속 입력받다가 범위를 벗어나는 수가 입력되면 
 * 그 이전까지 입력된 자료의 합계와 평균을 출력하는 프로그램을 작성하시오.
 * (평균은 반올림하여 소수 첫째자리까지 출력한다.)
 * 
 * [입력 예]
 * 55 100 48 36 0 101
 * 
 * [출력 예]
 * sum : 239
 * avg : 47.8
 */
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//사용자로부터 입력 받음(0부터 100까지 받기)
		int input = 0;
		//합계, 평균
		int sum = 0;
		double avg = 0.0;
		//평균을 위한 총 입력받은 수 
		int cnt = 0;
		
		while(true) {
			input = sc.nextInt();
			
			if(0 <= input && input <= 100) {
				// 합계구하기
				sum += input;
				cnt++;
				continue;
			} else {
				// 평균내고
				avg = (double)sum / cnt;
				// 출력하기
				System.out.println("sum : " + sum);
 				System.out.println("avg : " + String.format("%.1f", avg));
				break;
			}
		}
	}

}

 

** 쌤이 만든 코드 **

package 반복제어문1.형성평가03;
/*
http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=27&sca=1060
127 : 반복제어문1 - 형성평가3 

0 부터 100 까지의 점수를 계속 입력받다가 범위를 벗어나는 수가 입력되면 
그 이전까지 입력된 자료의 합계와 평균을 출력하는 프로그램을 작성하시오. 
(평균은 반올림하여 소수 첫째자리까지 출력한다.)

[입력예]
55 100 48 36 0 101

[출력예]
sum : 239
avg : 47.8
*/
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n ;
		int sum = 0, cnt = 0;  // '합계' 와 '개수'
		while(true) {
			n = sc.nextInt();  // 계속 반복해서 숫자 입력
			if(0 > n || n > 100) break;  // 범위를 벗어나면 입력 종료
			sum += n;  // 합계 누적
			cnt++;     // 입력 개수 증가
		}
		// 결과 출력
		System.out.println("sum : " + sum);
		System.out.printf("avg : %.1f", (double)sum / cnt);
		
		sc.close();
	}// end main

}// end class

 


5. 반복제어문2, 형성평가 실습 8

** 내가 만든 코드 **

package 반복제어문2.형성평가08;

import java.util.Scanner;
/*
 * 행과 열의 수를 입력받아 다음과 같이 출력하는 프로그램을 작성하시오.
 * 
 * [입력 예]
 * 3 4
 * 
 * [출력 예]
 * 1 2 3 4
 * 2 4 6 8
 * 3 6 9 12
 */
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 행값, 3
		int col = sc.nextInt();
		// 열값, 4
		int row = sc.nextInt();
		
		for(int i = 1; i <= col; i++) {
			for(int j = 0; j <= row-1; j++) {
				System.out.print(i + (j * i) + " ");
			}
			System.out.println();
		}
		
	}

}

 

** 쌤이 만든 코드 **

package 반복제어문2.형성평가08;
/* 137 : 반복제어문2 - 형성평가8
http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=37&sca=1070

행과 열의 수를 입력받아 다음과 같이 출력하는 프로그램을 작성하시오.

입력 예]
3 4
출력 예]
1 2 3 4
2 4 6 8
3 6 9 12
 */
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int row = sc.nextInt(); // 행 입력
		int col = sc.nextInt(); // 열 입력
		
		for(int i = 1; i <= row; i++) {
			for(int j = 0; j < col; j++) {
				System.out.print((i + i * j) + " ");
			}
			System.out.println();
		}
		
		sc.close();
	}// end main

}// end class

 


6. 반복제어문3, 형성평가 실습 3

** 내가 만든 코드 **

package 반복제어문3.형성평가03;

import java.util.Scanner;
/*
 * 자연수 n을 입력받아 "출력 예"와 같이 출력되는 프로그램을 작성하시오.
 * 주의! '*'과 '*'사이에 공백이 없고 줄사이에도 빈줄이 없다.
 * 
 * [입력 예]
 * 3
 * 
 * [출력 예]
 * *
 * **
 * ***
 * **
 * *
 */
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int input = sc.nextInt();
		
		// 증가
		for(int i = 0; i < input + 1; i++) {
			for(int j = 0; j < i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
		//감소
		for(int i = input - 1; i > 0; i--) {
			for(int j = i; j > 0; j--) {
				System.out.print("*");
			}
			System.out.println();
		}		

	}
}

 

** 쌤이 만든 코드 **

package 반복제어문3.형성평가03;
/* http://jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=42&sca=1080
142 : 반복제어문3 - 형성평가3

자연수 n을 입력받아 "출력 예"와 같이 출력되는 프로그램을 작성하시오.
주의! '*'과 '*'사이에 공백이 없고 줄사이에도 빈줄이 없다.

입력 예]
3

출력 예]
*
**
***
**
*

 */
import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		

		// 증가 방향
		for(int i = 0; i < n; i++) {
			for(int j = 0; j <= i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
		// 감소 방향
		for(int i = n; i >= 1; i--) {
			for(int j = 0; j < i - 1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
		sc.close();
	}// end main

}// end class



7. Lec11_Array
1) com.lec.java.array01 패키지, Array01Main 클래스

package com.lec.java.array01;
/* 배열(Array)
 		동일 타입의 여러개의 데이터를 담는 집합자료형
 	
 	배열 선언
 		자료타입[] 변수이름;
 		
 	배열 원소 (element)
 		배열에 담긴 각각의 데이터
 		
 	배열의 길이 (length)
 		배열 원소의 개수, 즉 배열에 담긴 데이터의 개수 
 		
 	배열 인덱스 (첨자, index)
 		배열의 인덱스는 0부터 시작해서, (배열의 길이 - 1)까지가 됨
 		배열인덱스를 사용하여 배열원소에 접근하여 사용
 	
 	배열을 new로 생성한뒤에는 자동초기화 가 됨.(즉, new로 생성할 때 무조건 자동 초기화됨)
		숫자타입들은 --> 0으로
		boolean타입은 --> false 로
		객체타입(Object) 타입은 --> null 로.
 	
 	★ 배열변수의 타입, 배열원소의 타입 확실히 구분하자
 	★ JVM 메모리 상에 생기는 구조 이해 필수 
 */
public class Array01Main {

	public static void main(String[] args) {
		System.out.println("배열(Array)");
		
		int korea1 = 99;
		int korea2 = 88;
		int korea3 = 77;
		//...
		// 다량의 데이터를 위해서 매번 변수 작성하는건... 사실상 불가 ㅜ^ㅜ
		// 그래서 배열이라는 집합자료형이 나옴!!
		
		// 배열 선언, 초기화
		int[] korean = new int[3];
		// int타입 배열 선언
		// 3개의 int 데이터를 담는 배열로 초기화
		
		korean[0] = 90;		// 첫번째 배열원소에 90 대입
		korean[1] = 80;	
		korean[2] = 70;
		
		System.out.println("국어0 : " + korean[0]);
		System.out.println("국어1 : " + korean[1]);
		System.out.println("국어2 : " + korean[2]);
		
		//korean[3] = 60;	// Exception in thread "main" 
        				// java.lang.ArrayIndexOutOfBoundsException: 3
					// at com.lec.java.array01.Array01Main.main(Array01Main.java:51)
		
		// korean 의 타입은? int[] 타입(인티저 배열 타입)
		// korean[0] 의 타입은? int 타입(인티저 타입)
		
		System.out.println("for문을 사용하여 배열 출력");
		for(int n = 0; n < 3; n++) {
			System.out.println("korea[" + n + "] = " + korean[n]);
		}
		
		System.out.println();
		
		// int 타입의 english 라는 이름의, 5개 데이터를 담는 배열 선언, 초기화
		int[] english;
		english = new int[5];
		
		// 에러 아님!
		// 0을 대입한 적이 없는데 0이 출력이 됨!
		// 왜? 자동초기화가 되서....!!!
		System.out.println(english[1]);
		
		System.out.println();
		for(int i = 0; i < 5; i++) {
			english[i] = i * 10;
		}
		
		for(int i = 0; i < english.length; i++) {
			System.out.println(english[i]);
		} 
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array01Main

 

[추가] Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
         at com.lec.java.array01.Array01Main.main(Array01Main.java:51)

 

2) com.lec.java.array02 패키지, Array02Main 클래스

package com.lec.java.array02;
/*  배열의 선언과 초기화
 	
 	배열 선언 따로, 초기화 따로
		타입[] 이름 = new 타입[배열의 길이];
		
	배열을 선언과 동시에 초기화 1
		타입[] 이름 = new 타입[] {a, b, c, ...};
		
	배열을 선언과 동시에 초기화 2
		타입[] 이름 = {a, b, c, ...};
		
	배열의 길이를 자동으로 알 수 있는 방법
		배열이름.length 
 */
public class Array02Main {

	public static void main(String[] args) {
		System.out.println("배열의 선언과 초기화");
		
		// 배열 선언 따로, 초기화 따로
		int[] korean = new int[3];
					// length : 데이터 개수 ---> 3
					// size : 용량 ---> 12 byte (이상)
		
		korean[0] = 100;
		korean[1] = 90;
		korean[2] = 80;

		for (int i = 0; i < korean.length; i++) {
			System.out.println("국어" + i + " : " + korean[i]);
		}
		
		System.out.println();
		
		// 선언과 동시에 초기화
		int[] english = new int[] {30, 20, 40};
		
		for (int i = 0; i < english.length; i++) {
			System.out.println("영어" + i + " : " + english[i]);
		}
		
		System.out.println();
		
		int[] math = {99, 88, 77, 66};	// new int[] {99, 88, 77, 66}
		
		for (int i = 0; i < math.length; i++) {
			System.out.println("수학" + i + " : " + math[i]);
		}
		
		// 수학 점수들의 총점과 평균 계산
		int total = 0;
		for (int i = 0; i < math.length; i++) {
			total += math[i];
		}
		double avg = (double)total / math.length;
		System.out.println("수학총점 : " + total);
		System.out.println("수학평균 : " + avg);
		
		System.out.println();
		// 배열 변수를 출력하면...?
		System.out.println(math);	// 출력값 : [I@15db9742
		
		// () 괄호
		// {} brace
		// [] bracket
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array02Main

 

[추가] System.out.println(math);     // 출력값 : [I@15db9742

 

3) com.lec.java.array03 패키지, Array03Main 클래스

package com.lec.java.array03;

public class Array03Main {

	public static void main(String[] args) {
		System.out.println("여러가지 자료형의 배열");
		
		System.out.println();
		System.out.println("[1] double형 배열");
		// 타입[] 이름 = new 타입[배열 길이];
		// 타입[] 이름 = new 타입[] {a, b, ...};
		// 타입[] 이름 = {a, b, ...};

		double[] array1 = {1.2, 2.3, 3.4};
		
		for (int i = 0; i < array1.length; i++) {
			System.out.println(array1[i]);
		}
		
		System.out.println();
		System.out.println("[2] char형 배열");
		
		char[] array2 = new char['z' - 'a' + 1];
		for (int i = 0; i < array2.length; i++) {
			array2[i] = (char)('a' + i);
			System.out.print(array2[i] + " ");
		}
		System.out.println();
		
		
		System.out.println();
		System.out.println("[3] boolean형 배열");

		boolean[] array3 = new boolean[4];
		// 짝수 index => true, 홀수 index => false
		for (int i = 0; i < array3.length; i++) {
			if(i % 2 == 0) {array3[i] = true;}
			else {array3[i] = false;}
			
			System.out.println(i + " : " + array3[i]);
		}
		
		System.out.println();
		System.out.println("[4] String형의 배열");

		String[] array4 = new String[3];
		array4[0] = "Hello Java";
		array4[1] = "Hello C++";
		array4[0] = "Good bye HTML";
		
		for (int i = 0; i < array4.length; i++) {
			System.out.println(array4[i]);
		}
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array03Main

 

4) com.lec.java.array04 패키지, Array04Main 클래스
** 내가 만든 코드 **

package com.lec.java.array04;

import java.util.Scanner;
/* 연습
 * 길이 5개 int 형 배열을 선언하고
 * 사용자로부터 5개 정수를 입력받아 초기화 한뒤 
 * 
 * 총점, 평균, 최대값, 최소값  출력해보기
 */
public class Array04Main {

	public static void main(String[] args) {
		System.out.println("배열 연습");
		
		Scanner sc = new Scanner(System.in);
		
		int[] number = new int[5];
		int sum = 0;
		double avg = 0.0;
		int max = 0, min = 0;
		
		for (int i = 0; i < number.length; i++) {
			System.out.println((i + 1) + "번째 정수 입력하시오 : ");
			number[i] = sc.nextInt();
			
			sum += number[i];
		}
		
		avg = (double)sum / number.length;
		
		max = number[0];
		min = number[0];
		
		for (int i = 1; i < number.length; i++) {
			
			if(max < number[i]) {
				max = number[i];
			}
            
			if(min > number[i]) {
				min = number[i];
			}
			
		}
		
		System.out.println("총점 : " + sum + ", 평균 : " + avg + ", 최대값 : " + max + ", 최소값 : " + min);
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array04Main

 

** 쌤이 만든 코드 **

package com.lec.java.array04;

import java.util.Scanner;
/* 연습
 * 길이 5개 int 형 배열을 선언하고
 * 사용자로부터 5개 정수를 입력받아 초기화 한뒤 
 * 
 * 총점, 평균, 최대값, 최소값  출력해보기
 */
public class Array04Main {

	public static void main(String[] args) {
		System.out.println("배열 연습");
		
		// int형의 길이는 5개인 배열을 score라는 이름으로 선언
		int[] score = new int[5];
		int total = 0;  // 총점
		
		// 키보드로 입력을 받아서 배열 원소 5개를 초기화
		Scanner sc = new Scanner(System.in);
		for (int i = 0; i < score.length; i++) {
			System.out.println("점수 입력: ");
			score[i] = sc.nextInt();
			total += score[i];  // 총점 누적
		} // end for ()
		
		sc.close();
		
		System.out.println("총점: " + total);
		System.out.println("평균: " + (double)total / score.length);
		
		System.out.println();
		// 최댓값
		int max = score[0];
		for (int i = 1; i < score.length; i++) {
			if(score[i] > max) {
				max = score[i];
			}
		}
		System.out.println("최댓값 = " + max);
		
		// 최솟값 
		int min = score[0];
		for (int i = 1; i < score.length; i++) {
//			if (score[i] < min) {
//				min = score[i];
//			} // end if

			min = (score[i] < min) ? score[i] : min;
			
		} // end for
		System.out.println("최솟값 = " + min);
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array04Main

 

5) com.lec.java.array05 패키지, Array05Main 클래스

package com.lec.java.array05;
/* 2차원 배열 (2-dimensional array)
 * 	직전의 예제와 같이 같이 배열 첨자를 하나만 쓰는 배열을 
 * 1차원 배열 (one-dimensional array) 이라고 함
 *   배열원소가 '1차원 배열' 들로 이루어진 배열을 2차원 배열 이라 한다
 *   배열원소가 '2차원 배열' 들로 이루어진 배열을 3차원 배열 이라 한다
*/
public class Array05Main {

	public static void main(String[] args) {
		System.out.println("2차원 배열");
		
		// 1차원 배열들...
		int[] arr1 = {1,2};
		int[] arr2 = {3,4};
		int[] arr3 = {5,6};
		
		// 2차원 배열 : (배열 원소가 1차원 배열)
		// 1차원 배열 x 3개 갖고 있는 2차원 배열
		int[][] array = {
				{1, 2},		// <-- array[0]
				{3, 4},		// <-- array[1]
				{5, 6}		// <-- array[2]
		};
		
		System.out.println(array[0][0]);
		System.out.println(array[0][1]);
		System.out.println(array[1][0]);
		System.out.println(array[1][1]);
		System.out.println(array[2][0]);
		System.out.println(array[2][1]);
		//System.out.println(array[3][0]);	//오류: ArrayIndexOutOfBoundsException
		
		// 흔히 2차원배열은 '행'과 '열'로 표기(표현)하기도 함
		// 위 array는 3행(row) x 2열(column) 인 2차원 배열
		
		// 2차원 배열에서 length의 의미:
				// array.length: 2차원 배열의 원소, 즉 1차원배열의 개수 
				//  		행열의 개념에선 2차원 배열의 행(row)의 개수를 의미
		System.out.println("array.length = " + array.length);
		
		// array 의 타입 --> int[][]
		// array[0] 의 타입 --> int[]
		// array[0][0] 의 타입 --> int
		
		System.out.println("array[0].length = " + array[0].length);
		System.out.println("array[1].length = " + array[1].length);
		
		// 2차원 배열 원소, for
		for (int x = 0; x < array.length; x++) {
			for (int y = 0;	y < array[x].length; y++) {
				System.out.print(array[x][y] + " " );
			}
			System.out.println();
		}
		
		// TODO: 
		// 2행 4열의 2차원배열을 두 개를 만들어서 
		// 아래와 같이 초기화하고 출력하기
		
		// 첫번째 배열 출력
		// 1 2 3 4
		// 5 6 7 8	
		
//		System.out.println();
//		int[][] arrData = new int[2][4];
//		int data = 0;
//		
//		// 값 저장
//		for (int i = 0; i < arrData.length; i++) {
//			for (int y = 0; y < arrData[i].length; y++) {
//				data++;
//				arrData[i][y] = data;
//			}
//		}
//
//		// 값 출력
//		for (int i = 0; i < arrData.length; i++) {
//			for (int y = 0; y < arrData[i].length; y++) {
//				System.out.print(arrData[i][y] + " ");
//			}
//			System.out.println();
//		}
		
		int [][] arr4 = {
				{1, 2, 3, 4},
				{5, 6, 7, 8}
		};
		for(int x = 0; x < arr4.length; x++) {
			for(int y = 0; y < arr4[x].length; y++) {
				System.out.print(arr4[x][y]  + "\t");
			}
			System.out.println();
		} // end for
		
		System.out.println();
		System.out.println("array\t\t: " + array);	// 2차원 배열 주소값 출력  : [[I@15db9742
		System.out.println("array[0]\t: " + array[0]);	// 1차원 배열 주소값 출력됨 : [I@6d06d69c
		System.out.println("array[1]\t: " + array[1]);	// 1차원 배열 주소값 출력됨 : [I@7852e922
		System.out.println("array[2]\t: " + array[2]);	// 1차원 배열 주소값 출력됨 : [I@4e25154f

		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array05Main

 

6) com.lec.java.array09 패키지, Array09Main 클래스

package com.lec.java.array09;
/* ragged array: column(열)의 개수가 일정하지 않은 배열
	가변 배열 선언 방법: 행의 개수만 지정을 하고, 열의 개수는 비워둠
	열(column)이 몇 개가 될 지 모르기 때문에 메모리 할당이 되지 않습니다.
 */
public class Array09Main {

	public static void main(String[] args) {
		System.out.println("Ragged Array(가변 배열)");

		//int[] arr[];	// 가능은 하다...
		//int arr[][];
		int[][] arr = new int[3][];	// int[] 3개짜리 2차원배열 객체만 생성
						// 오류 : NullPointerException
		
		// NullPointerException 오류를 해결하기 위해 아래의 3줄 코드를 작성하면됨
		// 아래의 3줄이 누락되면 NullPointerException 오류 발생
		arr[0] = new int[]{10};
		arr[1] = new int[]{11, 12};
		arr[2] = new int[]{20, 30, 40};
		
		// 확인
		for (int x = 0; x < arr.length; x++) {
			for (int y = 0; y < arr[x].length; y++) {
				System.out.print(arr[x][y] + " ");
			} // end for(y)
			System.out.println();
		} // end for(y)
		
		// arr[1]과 arr[2]를 바꾸고 싶다!
		System.out.println();
		int[] temp = arr[1];
		arr[1] = arr[2];
		arr[2] = temp;
		
		// 확인
		for (int x = 0; x < arr.length; x++) {
			for (int y = 0; y < arr[x].length; y++) {
				System.out.print(arr[x][y] + " ");
			} // end for(y)
			System.out.println();
		} // end for(y)
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array09Main

 

[추가] int[] 3개짜리 2차원 배열 객체만 생성.

        int 1차원 배열 값을 설정하지 않으면 초기값으로 Null 값이 들어가고 Null값으로 어떠한 액션을 취할 수 없음

        즉, NullPointerException 오류 발생!!!

[추가] NullPointerException 오류를 해결하기 위해 아래의 3줄 코드를 작성하여

        int 1차원 배열 값을 설정해주면 됨!!

7) com.lec.java.array10 패키지, Array10Main 클래스

package com.lec.java.array10;
/* Enhanced for (향상된 for) 문
 	
 	for (배열타입 변수 : 배열이름) { ... }
 	
 */
public class Array10Main {

	public static void main(String[] args) {
		System.out.println("Enhanced for (향상된 for) 문");
		
		int[] arr = {11, 22, 33, 44, 55};
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i] + " ");
		}
		System.out.println();
		
		System.out.println("Enhanced-for 사용");
		for(int x : arr) {
			System.out.println(x);
		}
		
		System.out.println();
		System.out.println("2차원 배열에서 Enhanced-for 사용");
		int[][] arr2 = {
				{1, 2},
				{3, 4, 5, 6},
				{7, 8, 9}
		};
		
		for(int[] row : arr2) {
			for(int e : row) {
				System.out.print(e + " ");
			}
			System.out.println();
		} // end for
		
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array10Main


8) com.lec.java.array11 패키지, Array11Main 클래스

package com.lec.java.array11;
/* for와 enhanced for의 차이점
	 enhanced for문에서는 배열의 원소를 꺼내서
	 변수에 복사(저장)해서 사용하는 것입니다.
	 즉, 배열의 원소를 직접 변경하는 것은 불가능하다.
 */
public class Array11Main {

	public static void main(String[] args) {
		System.out.println("for와 enhanced for의 차이점");
		
		int[] arr1 = {10, 20, 30, 40, 50};
		
		// 증가 전 값 화면 출력하기
		System.out.println("증가 전");
		for (int i = 0; i < arr1.length; i++) {
			System.out.println(arr1[i] + " ");
		}
		
		System.out.println("\n\n증가 후");
		// 배열의 원소를 +1씩 증가
		for (int i = 0; i < arr1.length; i++) {
			arr1[i] += 1;	// arr1[i]++, arr1[i] = arr1[i] + 1
		}
        
		// 증가된 값 출력하기
		for (int i = 0; i < arr1.length; i++) {
			System.out.print(arr1[i] + " ");
		}
		
        
		System.out.println("\n\nEnhanced for 증가후");
		int [] arr2 = {10, 20, 30, 40, 50};
		
		// enhanced for문에서는 사본을 이용하는 것이기 때문에
		// 값이 증가가 안된다
		// 즉, 배열의 원소를 직접 변경하는 것은 불가능하다.
		for(int num : arr2) {
			num += 1;
		}
		
		// 값이 증가가 되지 않았음을 확인하기 위해 출력
		for(int num : arr2) {
			System.out.print(num + " ");
		}
		System.out.println();
        
		System.out.println("\n프로그램 종료");
	} // end main()

} // end class Array11Main

 

9) com.lec.java.array12 패키지, 클래스

package com.lec.java.array12;

/* main() 의 매개변수 String[] args
 */
public class Array12Main {

	// 윈도우 환경에서 path 설정이 되어 있으면 커맨드 창 에서 
	// bin>java com.lec.java.array12.Array12Main ~~ ~~  
	// 이클립스 환경에선 Run-Run configuration 에서 [Argument] 를 설정해주면 된다.
	
	public static void main(String[] args) {
		System.out.println("main 메소드 매개변수: String[] args");
		
		System.out.println("args.length = " + args.length);
		
		for(String arg : args) {
			System.out.println("--> " + arg);
		}
		
	} // end main

} // end class Array12Main

 

[추가] main()의 매개변수 String[] args를 cmd 창을 이용하여 값을 입력해보기

[추가] main()의 매개변수 String[] args를 이클립스를 이용하여 값을 입력해보기

        : Run > Run Configurations

        > Arguments > Program arhuments > 매개 변수 입력 > Debug 클릭 

        > main()의 매개변수 길이와 값을 알 수 있음!!

10) com.lec.java.array13 패키지, 클래스

package com.lec.java.array13;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/* java.util.Arrays 클래스
     배열을 다루는 유용한 메소드들 제공
		Arrays.toString() : 문자열 형태로 리턴
		Arrays.copyOf(원본배열, 복사할 length)
		Arrays.copyOfRange(원본배열, from, to))
		Arrays.fill()  : 배열에 특정 값으로 채우기
		Arrys.sort(원본배열) :  오름차순 변경
		Arrays.asList() : array -> List 로
 */
public class Array13Main {

	public static void main(String[] args) {
		System.out.println("java.util.Arrays 클래스");

		int[] arr = {10, 20, 30, 40, 50};
		
		// Arrays.toString() : 배열 -> 문자열로 리턴
		System.out.println(Arrays.toString(arr));
		
		// Arrays.copyOf(원본배열, 복사할 length)
		// 배열을 복사하여 새로운 배열생성하여 리턴
		int[] arr2 = Arrays.copyOf(arr, 3);
		System.out.println(Arrays.toString(arr2));

		// length가 원본보다 크면, 나머지 부분은 기본값으로 채워짐
		// 출력 : [10, 20, 30, 40, 50, 0, 0, 0, 0, 0]
		int[] arr3 = Arrays.copyOf(arr, 10);	
		System.out.println(Arrays.toString(arr3));
		
		// Arrys.sort(원본배열)
		// 오름차순 변경.  원본 배열을 변경시킨다
		// 내림차순은 지원하지 않는다.
		int[] arr7 = {8, 9, 3, 5, 1, 2};
		System.out.println(Arrays.toString(arr7));
		Arrays.sort(arr7);
		System.out.println(Arrays.toString(arr7));
		
		// Arrays.equals(배열1, 배열2)
		int[] arr8 = {10 ,20 ,30};
		int[] arr9 = {10 ,20 ,30};
		// 주소 비교를 했기 때문에 false값이 출력됨
		System.out.println(arr8 == arr9);
		// 그렇기 때문에 배열의 값이 일치하는지 확인하기 위해서는 Arrays.equals() 메서드를 사용하자!
		System.out.println(Arrays.equals(arr8, arr9));
		
		System.out.println("\n프로그램 종료");
	} // end main

} // end class

 

 

8. 배열1.자가진단09

package 배열1.자가진단09;

import java.util.Arrays;
import java.util.Scanner;

/*
 * 10개의 정수를 입력받아 배열에 저장한 후 내림차순으로 정렬하여 출력하시오.
 * 
 * [입력 예]
 * 95 100 88 65 76 89 58 93 77 99
 * 
 * [출력 예]
 * 100 99 95 93 89 88 77 76 65 58
 */
public class Main {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[] array = new int[10];
		for (int i = 0; i < array.length; i++) {
			array[i] = sc.nextInt();
		}
		sc.close();

		// 배열 정렬하기
		// bubble sort
		
		// cycle
		for (int i = array.length; i > 0; i--) {
			// 비교
			for (int j = 0; j < i - 1; j++) {
				if(array[j] < array[j + 1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
				
			}
			
		}
		
		
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + " ");
		} // end for

		System.out.println();

	}
}

'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글

2020.03.23  (0) 2020.03.23
2020.03.20  (0) 2020.03.20
2020.03.18  (0) 2020.03.18
2020.03.17  (0) 2020.03.17
2020.03.16  (0) 2020.03.16