Java

새싹체험_java_1015

coolcode 2022. 10. 15. 09:06

1015
반복문(for문) > 적은양의 코드로 반복되는 코드를 작성할 수 있음 (편리함/유지보수용이)
초기화식 > [조건식 > 실행문 > 증감식 >조건식 > 실행문 > 증감식] ....반복 후 조건 false시 반복 종료

*소스파일을 저장하면 이클립스는 자동으로 바이트 파일을 만들어줌 
굳이 화면 보지 않아도 되는 실습은 소리만 듣고 연습하기

* 2,4,6,8,10 출력 예제

for(int i = 2; i <= 10; i++) {
    if(i%2 == 0) {
        System.out.println(i);
    }
}

System.out.println();
for(int i = 2; i <= 10; i+=2) {
    if(i%2 == 0) {
        System.out.println(i);
    }
}


for문 안에서 선언된 지역변수는 for문 블록 안에서만 사용 가능 
밖에서 선언된 변수는 메서드 안에서도 사용 가능
(메인 메서드 안에서 선언된 변수는 메인 메서드 전체에서 사용이 가능함)

내일 main 메서드 범위를 벗어나서 코드를 작성해볼 예정

// for 문을 사용한 1~10까지의 합 예제 

for(int j = 1; j <= 10; j++) {
    tmp += j;
//	System.out.println(tmp);
}
System.out.println(tmp);
// 0~ 90까지 10단위로 출력하기 

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

    if(i%10 == 0) {
        System.out.println(i);
    }
}

for(int i = 0; i <= 90; i+=10) {
    System.out.println(i);
}
// 반복문 안에서 여러번 입력받고 입력값의 합 구하기

int sum = 0;
String input;

Scanner scanner = new Scanner(System.in);
for(int i = 1; i <= 5; i++) {
    System.out.printf("%d번째 숫자를 입력하세요>",i);
    input = scanner.nextLine();
    sum += Integer.parseInt(input);
    System.out.println(sum);
}

=================================1교시 끝

// 이중for문(중첩for문)

for(int i = 1; i < 10; i++) {
    System.out.printf("2*%d = %d\n",i, i*2);
}
		
for(int i = 2; i < 10; i++) {
    for(int j = 1; j < 10; j++) {
        System.out.printf("%d * %d :: %d\n", i, j, i*j);
    }
    System.out.println();
}

for문 조건식의 초기화식은 한번만하지만 이중 for문의 경우 

바깥쪽 for문을 새로 돌때마다 안쪽 for문은 새로 시작하는거라서 반복할때 마다 초기화해주어야 함

** 구구단 가로 출력 

반복문 (while문)

for문보다 while문이 먼저 나왔는데 while문의 초기식 + 조건식 + while문 블록안에 증감식으로 종료 조건을 주는 방식을 합쳐서 for문이 태어남 (for문은 반복횟수를 지정할 때 사용 / while 문은 조건에 따라서 반복할때 주로 사용)

while 문은 조건을 먼저 보고 dowhile 문은 반복 먼저 실행 후에 조건 확인

Scanner scanner = new Scanner(System.in);
System.out.println("10 + 20 의 값은 >");
String input = scanner.nextLine();
int result = Integer.parseInt(input);
while(result != 30) {
    System.out.println("정답이 아닙니다");
    System.out.println("정답 입력 >");
    result = scanner.nextInt();
}
System.out.println("정답입니다");
// while문으로 1~10까지 합 구하기

int sum = 0;
int i = 1;

while(i <= 10) {
    sum += i;
    i++;
}
System.out.println(1 +2 +3 +4 +5 +6+ 7 +8 +9 +10);
System.out.println(sum); // 55

continue문 :: continue문 만나는 시점 이후 코드 실행 안하고 while 문의 조건식으로 이동함 / 반복문에서만 사용되고 실행 흐름을 이동시킬 때 사용 (while 문에서는 조건식으로 for문에서는 증감식으로 이동함)

break문 :: break문을 만나는 시점 이후의 코드 실행 안하고 반복문을 빠져나가서 실행 중지함

do while 문 :: 조건이 false여도 처음 한번은 무조건 실행함 / while 문과의 유일한 차이점 

=================================2교시 끝

배열 변수는 참조 타입

자바 타입은 크게 기본 타입과 참조타입으로 분류됨

기본 타입 데이터는 실제 값을 변수에 저장하지만 참조타입 변수는 메모리 주소를 찺으로 갖게 됨

ex) 바탕화면의 바로가기도 실제 실행 파일의 주소를 가르킴

배열 >> 실제 값의 주소를 참조함

***배열이란 같은 타입의 데이터를 연속된 공간에 나열하고 각 데이터에 인덱스를 부여해놓은 자료 구조 이다

배열의 각 인덱스는 각 항목의 데이터를 읽거나 저장하는데 사용되고 배열 이름 옆에 대괄호[ ]에 기입된다

인덱스는 자동 부여되고 0부터 시작됨(인덱스는 숫자)  / 배열 안의 요소는 인덱스를 통해서 읽을 수 있음 

메모리 사용 영역 :: 배열 변수인 scores는 스택 영역에 생성되지만 실제 10, 20, 30을 갖는 배열은 힙 영역에 생성된다. 배열 변수 scores에는 배열의 힙 영역의 주소가 저장됨 

같은 메모리 상이지만 영역을 나눠놓음 (스택 / 힙)

* 참조변수 :: 주소값으로 배열의 실제 요소 값을 참조 할 수 있음

배열변수는 주소를 통해 실제 데이터를 참조하는데 배열이 없다면 배열 변수는 null값으로 초기화 될 수 있다

// 어떤 배열도 참조하지 않고 있음을 의미하기 위해 null 값으로 초기화 할 수 있음 

int[] arr = null;

** null도 하나의 특수한 값이다

배열을 생성하려면 new 연산자를 사용하면 되고 배열 안에 들어갈 목록 값을 알고 있다면 선언과 동시에 배열을 중괄호에서 생성할 수 있음

int[] arr = new int[5]; // 길이가 5인 배열
int[] intArray1 = {10, 20, 30};
	int a = intArray1[0];
    System.out.println(a);
    
    for(int b : intArray1) {
        System.out.println(b);
    }

위의 10 값에 있는 주소값이 배열변수 intArray1에 저장됨(=주소를 통해서 배열을 참조함)

int[] intArray2 = null;
    // 어떤 배열도 참조하고 있지 않음을 의미 
    // 실제 배열을 참조하지 않는다라는 뜻으로 배열 변수를 null값으로  초기화 할 수 있음
    // 주소값 없는 상태이고 null 값을 가지고 있는 것
// 배열의 길이는 알고 있고 값은 나중에 생성할 예정이라면 
// 배열의 길이만 지정해서 배열을 생성할 수 있음

int[] arrTest = new int[5];
System.out.println(arrTest.length); // 5

// 값 할당
arrTest[0] = 200;
arrTest[1] = 300;
arrTest[2] = 400;

System.out.println(arrTest[0]);
System.out.println(arrTest[1]);
System.out.println(arrTest[2]);

 

배열을 생성하면 아래의 기본값으로 자동 초기화 된다

정수 :: 0 

실수 :: 0.0

boolean(논리) :: false

참조타입(클래스나 인터페이스 등) :: null

배열 길이란 배열에 저장할 수 있는 전체 항목의 개수를 말함

코드에서 배열의 길이를 얻으려면 배열변수에 도트 연산자(.)를 붙이고 length를 붙여주면 됨

** for문 안에서 배열을 출력할때 i 는 배열의 idx를 제어하는 제어 변수로서 사용하게 됨 

String[] strArr = {"AA","BB","CC","DD"};
    System.out.println("배열의 길이는 :: " + strArr.length); 

    for(int i = 0; i < strArr.length; i++) {
        System.out.printf("%d번째 strArr[%d]\n", i, i);
    }

    for(String str : strArr) {
        System.out.println(str);
    }
// 3번째 배열 제외하고 출력하기

int[] arr = {10, 20, 30, 40, 50, 60, 70};
for(int i = 0; i < arr.length; i++) {
    if(i == 3) {
        continue;
    }
    System.out.println(arr[i]);
}

for(int i = 0; i < arr.length; i++) {
        if(i != 3) {
           System.out.println(arr[i]);
        }
    }
// 배열과 for문을 사용해서 3명의 이름을 입력받고 출력하기
String[] name = new String[3];
Scanner scanner = new Scanner(System.in);

for(int i= 0; i < name.length; i++) {
    System.out.println("이름을 입력 >");
    name[i] = scanner.nextLine();
//	System.out.println(name[i]);
}

for(int i= 0; i < name.length; i++) {
    System.out.println(name[i]);
}
// for문을 사용해서 정수를 입력받아 num 배열의 각 요소에 저장하기
// 이중 for문, 배열, if문, temp 변수를 사용해서
// num 배열의 idx 0부터 작은수로 만들기

*** 작동O 
for(int i = 0; i < 5; i++) {
    for(int j = i; j < 5; j++) {
        if(num[i] > num[j]) {
            tmp = num[i];
            num[i] = num[j];
            num[j] = tmp;
        }
    }
    System.out.println(num[i]);
}

*** 작동X >>> 모든 IDX의 값끼리 서로 비교할 수 없기 때문
for(int i = 0; i < num.length-1; i++) {
    if(num[i] > num[i+1]) {
        tmp = num[i];
        num[i] = num[i+1];
        num[i+1] = tmp;
    }
    System.out.println(num[i]);
}

====================================3교시 끝

배열 복사 / 향상 for 문 (배열을 좀 더 쉽게 처리하기위해 제공하는 반복문)

int[] engScore = {70,97,63,87,77};
		
    for(int score:engScore) {   // 배열의 요소들을 저장할 변수(배열과 같은 타입) scroe 선언
        System.out.println(score); // 70,97,63,87,77
    }
// 학생 2명이 더 늘어났다면 어떻게 해야할까 > 배열 복사!
// 배열은 초기 생성 후에 길이를 늘릴 수 없음
// 그래서 새로운 더 큰 배열을 만들어주고 이전 배열 요소 값을 복사해주어야 함

int[] newEngScore = new int[7];
for(int i = 0; i < engScore.length; i++) {
    newEngScore[i] = engScore[i];
}

for(int eng : newEngScore) {
    System.out.println(eng); // 70,97,63,87,77,0,0
}
// Math 클래스의 random() 으로 난수 생성하기

double mixNum = Math.random();
// 0.0 ~ 0.999999...
System.out.println(mixNum);

mixNum = Math.random()*10;
// 0.0 ~ 9.999999...
System.out.println(mixNum);

int num = (int)(Math.random()*10);
// 1 ~ 9
System.out.println(num);
// 주사위 번호 랜덤으로 출력하기

int cube = (int)(Math.random()*6)+1;
// 1 ~ 6
System.out.println(cube);
// Math.random()과 반복문 for문을 사용해서 lotto 번호
// 1 ~ 45 사이의 정수를 뽑아서 배열의 각 요소에 저장 & 출력하기

int[] lotto = new int[6];

// 중복수 없이 난수 뽑기 
for(int i = 0; i < lotto.length; i++) {
    lotto[i] = (int)(Math.random()*45)+1;

    for(int j = 0; j < i; j++) { // j는 i의 아랫수 까지만 반복 
        if(lotto[i] == lotto[j]) {
            i--; // 반복수가 나온 인덱스로 다시 돌아가기 위함 
            break; // 가장 가까운 j포문 반복문 탈출해서 i포문 증감식으로 돌아감
        }
    }
}

for(int l : lotto) {
    System.out.print(l + " ");
}

로또 게임 만들어보기 !! 

내일은 메서드 앞부분이랑 클래스 필드쪽 볼 예정 !