본문 바로가기
카테고리 없음

24. 07. 17 개발자교육 4주차 수요일 JAVA_while문, 배열, 얕은복사, 깊은복사

by 융기융 2024. 7. 17.
반응형

LoopEx1(숫자 출력하기, for문 등등)

package loop.ex;

 

import java.util.Scanner;

 

public class LoopEx1 {

 

// 필드(전역 변수 비슷)

Scanner sc = new Scanner(System.in);

 

 

 

/**

* 1부터 10까지 출력하기

*/

public void method1() {

 

// Java는 초기식 변수 선언 시 let X -> Java 자료형

for(int i = 1 ; i <= 10 ; i++) {

System.out.println(i);

}

 

}

 

 

/**

* 첫 번째 입력 받은 수 부터

* 두 번째 입력 받은 수 이하 까지

* 세 번째 입력 받은 수 만큼 증가하며 출력하기

*/

public void method2() {

System.out.print("시작 끝 증가값 :");

int start = sc.nextInt();

int end = sc.nextInt();

int value = sc.nextInt();

 

for(int i= start; i <= end ; i += value) {

System.out.println(i);

}

 

}

 

/**

* 두 수를 입력받아

* 작은 수 부터 큰 수 이하까지 1씩 증가하며 반복

*/

 

 

public void method3() {

System.out.print("숫자 2개 입력 : ");

 

int a = sc.nextInt();

int b = sc.nextInt();

 

if( b > a) { // a 가 작은경우

for(int i = a ; i <= b; i++) {

System.out.println(i);

}

}else { // b가 작거나 같은 경우

for(int i = b ; i <= a; i++) {

System.out.println(i);

}

 

 

}

 

System.out.println("-----------------------");

 

//추가 변수를 이용해서 시작, 종료 값 지정하기

int start = a;

int end = b;

 

if(a > b) { // 시작이 끝 보다 큰 경우

start = b;

end = a;

}

 

for(int i=start ; i<=end ; i++) {

System.out.println(i);

}

 

System.out.println("----------------------");

 

 

// a에 작은값, b에는 큰 값 저장하게 만들기

 

 

if(a > b) { // a 값이 b보다 큰 경우 a <-> b 값 변경

int temp = a; // a 값을 보관하는 임시 변수

a = b;

b = temp;

}

 

for(int i = a; i <= b; i++) {

System.out.println(i);

}

 

System.out.println("-----------------------");

 

// 자바에서 제공하는 기능(메서드)이용

int min = Math.min(a, b); // a,b중 작은값

int max = Math.max(a, b); // a,b중 작은값

 

for(int i = min ; i <= max; i++) {

System.out.println(i);

}

 

 

}

 

/** 1부터 100 사이의 정수중 5의 배수의 합, 개수 구하기

* sum, count

*/

public void method4() {

 

int sum = 0;

int count = 0;

 

for(int i = 1; i <= 100; i++) {

 

if(i % 5 == 0) { // 5의 배수인 경우

sum += i; // sum에 i값(5의 배수) 누적

count++; // count1 증가(5의 배수 카운트)

 

}

 

}

System.out.printf("합계 : %d / 개수 : %d", sum, count);

 

}

 

// 구구단 3단 출력하기

public void method5() {

 

System.out.println("[3단]");

 

for(int i=1 ; i<=9 ; i++) {

 

System.out.printf("3 X %d = %d \n", i, 3*i );

 

}

}

 

/**

* 입력 받은 단 출력하기

* 단, 입력 받은 단이

* 2~9 사이 숫자가 아니면

* "잘못 입력 하셨습니다" 출력

*/

public void method6() {

 

System.out.println("[입력 받은 단 출력하기]");

 

int input = sc.nextInt();

 

if( input <2 || 9 < input) {

System.out.println("잘못 입력 하셨습니다");

return;

}

for(int i=1 ; i<=9 ; i++) {

System.out.printf("%d x %d = %d \n", input, i, (input*i) );

}

 

}

 

/**

* while문 기본 작성법

*/

public void method7() {

int num = 1;

 

// while(조건식) -> 조건식이 ture인 경우에 반복수행

while(num <= 10) {

System.out.print(num + "");

num++;

}

 

}

 

// for(초기식;조건식;증감식)

// -> 지정된 횟수만큼 반복

 

// while(조건식)

// -> 조건식이 false 가 될 때 까지 반복

// == 몇회인지 모르겠지만 일단 끝날 때 까지 반복

 

/** [구구단 출력하기 version.2]

* 입력 받은 단 출력하기

* 단, 입력 받은 단이

* 2~9 사이 숫자가 아니면

* "잘못 입력 하셨습니다" 출력 후

* 다시 단 입력 받기

*/

public void method8 () {

 

int input;

 

while(true) { // 무한반복

 

 

System.out.println("단 입력(2~9) :");

input = sc.nextInt();

 

if( input >= 2 && input <= 9 ) { // 2~9 사이

break; // 가까운 반복문 정지(분기문)

}

 

System.out.println("잘못 입력 하셨습니다");

 

}

 

// 구구단 출력

for(int i=1 ; i<=9 ; i++) {

System.out.printf("%d x %d = %d \n", input, i, (input*i) );

}

}

 

 

}

 

LoopEx2 (모양 출력하기, do while문 등등)

package loop.ex;

 

import java.util.Scanner;

 

public class LoopEx2 {

 

// 필드(전역 변수 비슷)

Scanner sc = new Scanner(System.in);

 

 

/** 다음 모양 출력하기

* 1234

* 1234

* 1234

*/

 

public void method1() {

for(int i = 1 ; i<=3 ; i++) { // 행 제어(3행 반복)

 

for(int y = 1; y<=4; y++) { // 열 제어(4열 반복)

System.out.print(y);

}

 

System.out.println(); // 한 행이 끝나면 줄 바꿈

 

}

 

}

 

/** 다음 모양 출력하기

* 54321

* 54321

* 54321

* 54321

*/

public void method2() {

for(int i = 1; i<=4 ; i++) {

 

for(int y=5; y>=1; y--) {

System.out.print(y);

}

System.out.println();

}

 

 

}

 

/**

* 행, 열, 정방향(1)/역방향(-1) 입력 받아 출력

*

* 행 입력 : 3

* 열 입력 : 6

* 정방향(1)/역방향(-1) : -1

*

* 654321

* 654321

* 654321

*/

public void method3() {

 

System.out.print("행 입력 :");

int row = sc.nextInt();

 

System.out.print("열 입력 :");

int col = sc.nextInt();

 

System.out.print("정방향(1)/역방향(-1) :");

int direction = sc.nextInt();

 

for(int x =1; x <= row; x++) { //행

 

if(direction == 1) {

for(int y = 1; y <= col; y++) {

System.out.print(y); // 정방향

}

}else {

for(int y = col ; y >= 1; y--) {

System.out.print(y); // 역방향

}

 

}

 

System.out.println(); // 행 출력 완료 -> 줄바꿈

}

 

System.out.println("-------------------------------");

 

// 정방향 초기화

int start = 1;

int end = col;

 

if(direction == -1) { // 역방향

start = col;

end = 1;

}

 

for(int x = 1 ; x <= row ; x++) {

 

for(int y = start ; ; y += direction) {

if(direction == 1 && y <= end) {

System.out.print(y);

continue;

}

 

if(direction == -1 && y >= end) {

System.out.print(y);

continue;

}

 

break;

 

}

 

System.out.println(); // 줄바꿈

 

}

 

}

 

/** 다음 모양 출력 하기

*

* (0,0) (0,1) (0,2)

* (1,0) (1,1) (1,2)

* (2,0) (2,1) (2,2)

*/

public void method4() {

 

for(int row = 0; row < 3 ; row++) { // 0~2행(1번칸)

 

for(int col = 0; col < 3 ; col++) { // 0~2열(2번칸)

 

System.out.printf("(%d,%d)", row, col);

 

}

 

System.out.println(); // 줄바꿈

 

 

}

 

}

 

/** 다음 모양 출력 하기

*

* (0,0)

* (1,0) (1,1)

* (2,0) (2,1) (2,2)

*/

public void method5() {

 

for(int row = 0; row < 3 ; row++) { // 0~2행(1번칸)

 

for(int col = 0; col < row+1 ; col++) { // 0~2열(2번칸)

 

System.out.printf("(%d,%d)", row, col);

}

System.out.println(); // 줄바꿈

 

}

 

}

 

/** 다음 모양 출력 하기

*

* (0,0) (0,1) (0,2)

* (1,0) (1,1)

* (2,0)

*/

public void method6() {

 

for(int row = 0; row < 3 ; row++) { // 0~2행(1번칸)

 

for(int col = 0; col < 3 - row ; col++) { // 0~2열(2번칸)

 

System.out.printf("(%d,%d)", row, col);

 

}

 

System.out.println(); // 줄바꿈

}

 

 

}

 

/** [do ~ while]

* - 최소 1회 이상 반복하는 while문

*/

public void method7() {

 

int num = 10;

 

do{

System.out.println("반복 출력");

 

}while(num < 10);

 

System.out.println("---- 종료 ----");

 

}

 

 

/**

* 0이 입력될 때 까지 입력된 모든 수의 합

*/

public void method8() {

 

int input = 0; // 숫자를 입력 받을 변수

 

int sum = 0; // 합계

 

do{ System.out.print("숫자 입력 : ");

input = sc.nextInt();

sum += input;

 

}while(input != 0);

 

System.out.println("합계 : " + sum);

}

 

 

 

}

 

 

 

LoopRun

package loop.run;

 

import loop.ex.LoopEx1;

import loop.ex.LoopEx2;

 

/**

* 실행용 클래스

*/

public class LoopRun {

public static void main(String[] args) {

 

// LoopEx1 ex1 = new LoopEx1();

 

// ex1.method1();

// ex1.method2();

// ex1.method3();

// ex1.method4();

// ex1.method5();

// ex1.method6();

// ex1.method7();

// ex1.method8();

 

LoopEx2 ex2 = new LoopEx2();

// ex2.method1();

// ex2.method2();

// ex2.method3();

// ex2.method4();

// ex2.method5();

// ex2.method6();

// ex2.method7();

ex2.method8();

 

 

}

 

}

 

 

arrayEx1 ( 배열)

package ex;

 

import java.util.Arrays;

import java.util.Scanner;

 

public class ArrayEx1 {

 

Scanner sc = new Scanner(System.in);

 

/* JavA 배열 (자료구조)

*

* - 같은 자료형 변수를 하나의 묶음으로 다루는 것

*

* - 생성된 배열의 요소(묶여진 배열)는

* 인덱스 번호로 구분된다! (index는 0부터시작)

*

* - 생성된 배열을 활용하기 위해서는

* 배열을 참조하는 "참조형 변수"를 이용한다!

*

* [참조형 변수]

* - 값 X, 주소를 저장하는 변수

*

* - 변수 호출 시 값 반환 X

* ->저장된 주소로 찾아가

* 해당 위치의 배열/객체를 참조

*

* - 기본자료형 8개를 제외한 나머지는 모두 참조형!

*

*/

 

/**

* 배열 선언, 할당, 초기화

*/

 

public void method1() {

 

// 배열 선언

int[] arr; // Stack 메모리 영역에

// int[] 자료형을 참조할 변수 arr을 선언

 

// 배열 할당(생성)

arr = new int[4];

// Heap 메모리 영역에

// int 4칸짜리 배열을 할당(생성)한 후

// 생성된 배열의 주소를 arr에 대입

 

// -> arr 변수를 이용해 생성된 배열을 참조할 수 있다!

 

// 배열 초기화

// -> 배열 요소에 값 대입

 

// 1) 배열을 생성 하자마자

// 각 칸에는 무슨 값이 저장되어 있을까?

// -> 각 자료형의 기본값이 저장되어 있음!!

// -> int : 0 / double : 0.0 / long : 0L

// float : 0.0f / char : '\u0000' / boolean : false

 

System.out.println( arr ); // 배열의 해시코드(주소 비슷)

 

System.out.println("arr[0] : " + arr[0]); // 0

System.out.println("arr[1] : " + arr[1]); // 0

System.out.println("arr[2] : " + arr[2]); // 0

System.out.println("arr[3] : " + arr[3]); // 0

 

// 2) index별로 값 초기화

arr[0] = 1000;

arr[1] = 20;

// arr[2] = 3.14; // int 배열 요소에 double 대입 불가!

arr[2] = 3;

arr[3] = 500;

 

// for 문을 이용해 arr에 저장된 값 모두 출력

for(int i = 0; i <4 ; i++) {

System.out.printf("arr[%d]의 값: %d \n", i, arr[i] );

}

 

// ----------------------------------------------------

 

/* Java의 배열은 크기 조절 X */

arr[4] = 999;

// ArrayIndexOutOfBoundsException : 배열 인덱스 범위 초과 예외

 

 

 

}

 

/**

* 정수 4개를 입력받아

* 배열 요소에 차례대로 대입 후

* 저장된 값 한번에 출력하기

*/

public void method2() {

 

// 정수 4칸짜리 배열을 생성하여

// 배열 주소를 arr 변수에 대입

int[] arr = new int[4];

 

// arr. length == 배열 길이

for(int i = 0; i < arr.length; i++) {

System.out.print(i + "번 인덱스 : ");

arr[i] = sc.nextInt(); // 입력 값을 배열에 대입

}

 

// java.util.Arrays 클래스 : 배열의 유용한 기능을 모아둔 클래스

 

// Arrays.toString(배열명) :

// 배열에 저장된 값을 하나의 문자열로 반환

 

String str = Arrays.toString(arr);

System.out.println(str);

 

 

System.out.println("<<종료>>");

 

}

 

// debug : 프로그램 수행이 정상적으로 이루어 지지 않은 경우

// 원인을 파악하기 위해 추적하는 것

// + 해결 까지 !

 

/* [이클립스 디버그 모드 사용 방법]

*

* 1) 확인하고 싶은 코드 다음 줄에 break point 추가

*

* 2) debug 모드로 실행 (벌레 아이콘 또는 F11)

*

* 3) debug 화면으로 switch

*

* 4) resume (F8 키)를 눌러가며 순서대로 확인

*

* */

 

/**

* 배열 선언과 동시에 초기화 + 난수 활용

*

* [배열 선언 + 초기화]

* JS> let arr = ["aaa", "bbb", "ccc"];

* Java> String[] arr = {"aaa", "bbb", "ccc"};

*

*/

public void method3() {

 

// 과목이 작성되어 있는 배열 생성

 

String[] subjects = {"HTML", "CSS", "JS", "Java", "Java", "Java", "Java", "Java"};

 

// 배열 index 범위의 난수 생성

int ran = (int)(Math.random() * subjects.length);

 

System.out.printf("당신이 시험볼 과목은 %s 입니다", subjects[ran]);

 

}

 

/**

* 5칸짜리 char 배열을 만들어

* 각각의 배열 요소에 이력된 값을 대입

*

* 입력완료 후

* 저장된 값을 역순으로 출력

*/

 

public void method4() {

 

char[] arr = new char[5];

 

for(int i=0 ; i<arr.length ; i++ ) {

System.out.print(i + "번째 요소 : ");

arr[i] = sc.next().charAt(0);

// 입력된 문자열의 0번째 문자(char)를 반환

// -> char 입력 방법

 

}

 

// a p p l e

// -> e l p p a

 

// 마지막 인덱스부터 0까지 1씩 감소

for(int i = arr.length - 1; i >=0 ; i-- ) {

System.out.print(arr[i] + " ");

}

 

}

 

}

 

ArrayEx2 ( 배열인데 중요한 ★☆ 얕은복사, 깊은복사 ☆★)

package ex;

 

import java.util.Arrays;

 

public class ArrayEx2 {

 

 

 

/** 얕은 복사

* - 참조형 변수가 가지고 있는

* "주소"만 복사하는 것

*

* - 서로 다른 변수가

* 같은 배열/객체를 참조하기 떄문에

* 같은 값을 공유!!!!

*

*/

 

public void method1() {

 

// 원본 배열

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

 

// 얕은 복사한 배열 선언

int[] copyArr = arr;

 

System.out.println("[변경 전]");

System.out.println("arr :" + Arrays.toString(arr) );

System.out.println("copyArr :" + Arrays.toString(copyArr) );

 

// 복사한 배열의 값 변경

copyArr[3] = 4444;

copyArr[4] = 5555;

 

System.out.println("[변경 후]");

System.out.println("arr :" + Arrays.toString(arr) );

System.out.println("copyArr :" + Arrays.toString(copyArr) );

// 복사한 배열을 수정했지만

// 원본도 같이 수정됨

// -> 얕은 복사는 주소만 복사해서

// 같은 배열을 참조하게 만들어 값을 공유함

 

}

 

/**

* 깊은 복사

* - 원본 배열/객체가 가지고 있는 값을

* 똑같이 복사한 배열/객체를 만드는 것

* (복제의 개념)

*

* - 새로운 배열/객체가 만들어지는 것으로

* 원본과는 독립되어 있음

* -> 값을 공유하지 않는다!!!

*

*/

public void method2() {

 

// 원본 배열

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

 

// 깊은 복사 1 : for문 이용

int[] copyArr = new int[arr.length]; // 원본크기 새 배열 생성

 

// 원본 배열 요소의 값을

// 같은 인덱스의 복사된 배열 요소에 대입

for(int i=0 ; i<arr.length; i++) {

copyArr[i] = arr[i];

}

 

// 깊은 복사 2 : System.arraycopy() 이용

 

// System.arraycopy(원본 배열명, 원본 복사 시작 인덱스,

// 복사 배열명, 복사 배열의 삽입 시작 인덱스,

// 복사 길이)

 

int[] copyArr2 = new int[arr.length];

 

System.arraycopy(arr, 0, copyArr2, 0, arr.length);

 

// 원본, 복사1, 복사2의 0번 인덱스 값을 변경

arr[0] = 11111;

copyArr[0] = 22222;

copyArr2[0] = 33333;

 

System.out.println("arr + " + Arrays.toString(arr));

 

System.out.println("copyArr + " + Arrays.toString(copyArr));

 

System.out.println("copyArr2 + " + Arrays.toString(copyArr2));

    }

}

 

ArrayRun (실행용)

package run;

 

import ex.ArrayEx1;

import ex.ArrayEx2;

 

public class ArrayRun {

 

public static void main(String[] args) {

 

ArrayEx1 ex1 = new ArrayEx1();

 

// ex1.method1();

// ex1.method2();

// ex1.method3();

// ex1.method4();

 

ArrayEx2 ex2 = new ArrayEx2();

 

// ex2.method1();

ex2.method2();

 

 

}

 

}

 

오늘까지는 자바 루프와 배열에 대해 배웠다.

내일은 루프 나머지 마무리 조금하고

객체 들어간다고 하시는데

객체부터가 진정한 자바라고 하시니 좀 무섭다..화이팅

반응형