DAY_007[국비] 자바 웹프로그래밍 과정

Bona의 블로그 입니다.·2022년 10월 5일
0

국비과정

목록 보기
8/99

 ⛅ Day 007 : do~while, Array 

  • 오늘은 시간별로 자르면 내용이 끊어질것 같아 다른 방식으로 정리를 해보았다.



 ✨ 난수 만들기 : Math.random(), Random class 

  • 랜점한 숫자 발생 = 난수를 발생
  1. double r = Math.random(); => 0~1 사이의 랜덤한 수가 나옴

    • 0~99 사이의 난수가 필요하다면 r*100
      -> (int) 캐스팅 연산으로 소수점 자리를 없애준다.

    • 0~49(50미만) 사이가 필요하면 *50

    • 모든 경우의 최종 연산은 (int) 캐스팅 연산으로 소수점 아래를 버리는 동작으로 마무리 한다.

    • 예시 1

  2. Random 클래스 사용하는 방법

    • Scanner와 같은 자료형이라고 보면 되고 사용법도 비슷
    • 즉, import를 해주고 사용해야 한다.
      import java.util.Random;
    • 위 코드를 출력해보면 정수가 나오지만 음수가 나올 때도 있음
    • 이번엔 random 클래스를 사용해서 같은 예시를 작성해보았다.
    • 예시 1-1
  • 차이점
    • Math.random()은 import하지 않고 바로 쓸 수 있고, 코드 길이도 짧다는 장점이 있다.
    • 그러나 실수 계산이라서 정수 계산인 random클래스보다는 연산 속도가 느리다는 점이 단점

 📕 연습문제 : 가위바위보 게임 2 

  • 난수만드는 것을 배웠으니 활용해서 코드를 작성해보기
  • 문제(주어진 코드 ⬇)
  • 내가 쓴 답 ⬇

  • 사용자가 어떤 것을 입력했고 컴퓨터의 수가 뭐였는지 알 수 있게 하려고 코드를 추가해 보았다.

  • 출력 예시 (내가 실행해본 결과)
    가위(0) 바위(1) 보(2) 중 하나를 입력하세요(숫자입력)
    종료를 원하시면 '9'를 입력해주세요 : 2
    컴퓨터에게 이겼습니다.
    결과 You : 보, Com : 바위

    가위(0) 바위(1) 보(2) 중 하나를 입력하세요(숫자입력)
    종료를 원하시면 '9'를 입력해주세요 : 1
    컴퓨터에게 졌습니다.
    결과 You : 바위, Com : 보

    가위(0) 바위(1) 보(2) 중 하나를 입력하세요(숫자입력)
    종료를 원하시면 '9'를 입력해주세요 : 4
    잘못된 입력입니다.
    정수 0(가위), 1(바위), 2(보), 9(종료) 중에 하나를 입력해주세요
    결과 You : X, Com : 바위

    가위(0) 바위(1) 보(2) 중 하나를 입력하세요(숫자입력)
    종료를 원하시면 '9'를 입력해주세요 : 9
    게임이 종료 되었습니다.

  • 0~2를 입력했을 때, 잘못된 입력을 했을 때, 9를 입력했을 때를 테스트해봄
  • 2, 1, 4, 9 를 하나씩 입력해보면서 실행해보았다.
  • 해답과 비교하면서 배운 점

 📕 연습문제 : 달력출력하기 

  • 달력과 관련된 모든 코드와 연습 문제를 총망라한 것 같은 문제였다.
  • 입력받은 년도와 월을 가지고, 달력 전체를 출력하는 것
  • 윤년 구하기, 요일계산하기, 반복문 등등을 모두 이용해야 했다.
  • 거의 대부분 강사님이 코드를 따라쓰면서 진행되었지만, 속도가 빨르기도 했고 갑자기 이클립스가 느려져서 다시 쓰는 등 학습에 시간이 많이 걸렸다.
  • 다행히 3교시까지 이 문제에 할애할 수 있어서 차근차근 따라해보고 안되는 부분은 고쳐보면서 코드를 완성할 수 있었다.
  • 문제+답(1차 : 달력출력)

  • 2월 부분은 원래 switch안에 if문을 넣어야 하는데 뭔가 잘못 썼는지 계속 오류가 나서 2월 부분만 따로 빼서 만들었다.

  • 응용 : 전달, 다음 달, 종료 추가하기
    아래는 내가 써본 코드 - 1차

  • int input; 변수를 만들어주고 위에 달력을 출력하는 코드 전체를 while문으로 감싼다. (변수 선언은 while문 밖에 )
    3을 입력할 때 까지 계속 반복되는 달력
  • 1차 코드 추가할 때 1월인데 전달을 출력하고자 할 때, 12월인데 다음 다을 출력하고자 할 때 그리고 1,2,3외의 입력 처리 안해서 버그(?!)같은 것이 생김
  • 아래는 내가 수정해본 코드
  • 조각조각보면 헷갈릴 수 있으니 나중의 복습을 위해서 전체 코드를 기록하려고 한다. ⬇

  • 완벽하진 않지만 그럭저럭 실행되는 코드가 완성되었다.

 ✨ Do~While문 

  • do while의 특이점 : while(조건)을 후미에 기술
    while(조건)뒤에 ';'세미콜론을 찍는다.
    if(조건); (X)
    for(int i=1; i<100; i++); (X)
    while(i<100); (X)
    do{ } while(조건); (O)
    do에 속한 { } 안의 명령을 한 번 먼저 실행 후, 조건을 테스트한다.

 ✅ 언제 do~while을 사용하는가? 

  • 예시 1
    do~ while을 써서, 사용자가 100을 입력하기 전까지 입력된 모든 숫자를 합산해서 출력 하기

  • 예시 2
    두 개의 숫자와 연산자를 입력 받아서 해당 숫자를 입력한 연산자로 연산한 결과를 출력

  • 위의 코드를 반복 시킬 예정, 무한 반복을 막기 위해서 반복을 멈출 코드를 넣어야 한다.


 ✨ Array (배열) 

  • Array란?
    동일한 변수 이름에 번호(첨자)를 붙여서 다수 개의 데이터를 한 번에 저장할 수 있는 방법

    1. 다수 개의 변수를 같은 이름으로 손쉽게 선언하여 사용 가능
    2. 하나의 이름으로 다수 개의 변수들을 제어할 수 있다.
      ex) 3명의 3 과목 점수, 합, 평균을 저장하려면,
          변수로는 3*5=> 15개의 변수가 필요하다.
          그러나 배열을 쓰면 5개로 줄일 수 있다.
  • 배열 변수 생성

    • 자료형 [] 배열변수명; ⇒ int [] a;
      => 참조변수(레퍼런스 변수)생성 = 배열의 이름이 되는 변수를 생성
     int [] kor = new int[3];
      int [] eng = new int[3];
      int [] mat = new int[3];
      int [] tot = new int[3];
      double [] avg = new double[3];
  • 참조변수는 메모리(주기억장치:RAM) 내부의 공간 중 HEAP라는 영역 안에 실제 데이터가 저장된 곳을 지정하고 그 곳의 위.치.정.보를 저장하는 변수

  • String도 참조변수

  • 다~ 같은 말!!
    참조값 = 레퍼런스값 = 주소값 = 어드레스값

  • 참조변수(레퍼런스변수)는 위 네 개의 이름이 지칭하는 그 하나의 값을 저장하는 변수

  • a=123; ⇒ 에러 (123은 정수가 아니고 위치정보를 표시한 것)
    a변수는 정수를 저장하는 변수가 아니고, 정수가 저장된 곳의 주소를 저장하는 변수이기 때문에
    123번지를 임의로 개발자가 사용하는 것은 위험한 행동

  • 현재는(int [] a;) 배열에 정수를 몇 개 저장할 수 있는 지 개수와 메모리가 정해지지 않았다.
    배열을 사용하기 전에 저장할 수 있는 개수와 HEAP에 만들어진 공간 주소를 반드시 저장하고 사용해야 한다.

  • new int[3]
    : Heap 영역에 정수가 3개 저장될 공간을 "새.롭.게" 확보하라는 명령
    new가 새 메모리를 확보한 후
    그 시작 주소를 왼쪽 참조변수에 전달-저장되게 해준다.
    새로운 메모리는 int(4byte) 3개가 저장되어야 하므로 총 12byte가 확보된다.

  • 배열의 각 공간에 값을 대입하는 방법
    ⇒ 인덱스(첨자) 연산을 사용

  • 배열의 인덱스(첨자) : 시작은0, 종료는 배열의 크기-1
    배열변수명[인덱스(첨자)] = 값;

 ✅ 배열의 선언과 저장 공간 생성 방법 상세! 

  • null : 아무것도 아니고 아무것도 없다는 뜻의 값(value)
  1. null을 이용해서 참조변수 값을 초기화

    • System.out.println(b1);ERROR!!
    • 아무것도 초기화 하지 않은 것과 아무것도 없는 값(null)으로 초기화한 것은 다르다.
    • b1은 아무것도 초기화되지 않았으므로 연산도 안되고 출력도 안된다.
    • a1은 일부 연산의 제약이 있지만 연산도 가능하고 출력도 가능한다. (null 출력)
  2. 배열 참조 변수의 선언과 배열 실제 공간의 생성을 동시에 new를 이용하여 진행한다면... ⬇

  1. 배열의 생성과 동시에 값을 초기화 하는 방법
    • 크기가 5인 배열을 생성하면서,
      각 요소의 값을 1,2,3,4,5로 초기화 하는 코드

  1. 배열 변수 a7, a8을 동시 선언하는 코드

  2. 배열 변수 a9, a10, 일반 int형 변수 a11을 생성하는 코드


 ✨ 배열 변수의 활용 - 배열과 반복문 

  • 배열은 하나의 변수명을 가지며, 변수명과 인덱스를 조합하여 각 요소에 접근할 수 있다.
  • 일반적으로 for 반복문의 기준변수를 사용하여 배열의 인덱스를 제어하는 방식으로 배열의 각 요소에 접근하는 방식이 활용된다.

 📕 연습문제 : n명 학생의 성적표 출력 

  • 아래의 코드는 오류가 발생하기 때문에 앞으로는 이런 식으로 코드를 작성하지 않는다. ⬇️
  • nextInt()를 사용할 때 주의할 점!!
    sc.nextInt();는 사용자의 입력 중에 마지막 Enter를 제외한 앞의 정수만 취한다.
    공교롭게 바로 다음에 sc.nextLine();명령이 온다면 입력 버퍼에 남아있는 Enter를 해당 입력 String 데이터로 인식해서 Enter를 취하고 명령을 종료해버린다.
    이럴 경우 사용자가 String을 입력하지 않았는데 다음 실행으로 넘어가 버려서 원하는 String 입력이 불가능 해진다.
    따라서 별도의 조치가 없어도 되는 상황이 아니라면 sc.nextLine()으로 먼저 입력받고 이를 숫자로 변경한다..

  • 배열 생성하고 성적표 입력 받기 ⬇️

  • 성적표 출력 (혼자해보기)


 ✅ 배열.length (배열의 크기) 

  • 배열의 크기
    : 배열의 크기는 프로그램에서 중요한 정보
  • 배열의 크기에 따라 반복의 횟수나, 특정 인덱스의 값을 참조하는 것이 수시로 바뀐다.
  • 배열은 이러한 문제를 해결하기 위해 .length라는 속성을 제공한다.
  • 배열의이름.length
    ➡️ 배열의 크기를 정수 타입의 데이터로 얻는다.
  • 위 for문에서 std대신 kor.length를 사용할 수 있다.

 📕 연습문제 : 배열 생성 & 출력 

  • 조건

    • 배열 a,b,c 생성 (각 개수 10개)
    • a배열에는 3의 배수들 10개
    • b배열에는 5의 배수들 10개
    • c배열에는 a배열, b배열의 각 같은 인덱스의 합
  • 출력 양식

    • a배열 -> 3,4,9...
    • b배열 -> 5,10,15...
    • c배열 -> 8,16...
  • 쉬운 문제라 금방 작성 할 수 있었음.


 📕 연습문제 : 배열의 최대값, 최소값 

  • 배열에 있는 값들 중 최대값과 최소값을 찾아서 출력하기
    • 최대값 구하는 방법
    1. 변수 max에 저장된 값과 배열에 저장된 값들을 하나씩 차례로 비교
    2. 비교결과 max에 있는 값보다 현재 배열의 값이 더 크면 그 값을 max에 옮겨 저장
    3. 앞의 과정을 배열 처음부터 끝까지 반복하면 가장 큰 수가 남는다.

  •  a의 값들이 모두 음수라면? 
    max의 값을 0으로 하지 말고 a[0]을 넣고 i를 1부터 시작하면 됨
  • 최소값은?
    위 코드에서 if 조건의 부등호만 바꾸면 됨

 📕 연습문제 : 배열을 오름차순 / 내림차순 정렬하기 

  • 최대값, 최소값 구하기 / 오름차순&내림차순 정렬하기는 길고 복잡해서 각자 작성하기 보다는 같이 설명을 들으면서 따라 적고 이해하는 방식으로 수업이 진행되었다.
  • 복습할 때 혼자서 작성해보는 연습을 해야겠다.
  • 배열의 값을 정렬하는 코드를 작성할 때에는 두 변수의 값을 바꾸는 방법, 이중반복문을 사용하였다.
  • 최대값, 최소값을 구하는 방법과 비슷하게 진행되는데 차이점은 비교한 두 값의 자리를 바꾸는 것!!
  • 배열의 값들을 정렬하는 방법 ⬇️

  • 혼자 해보기 (로또 번호 뽑기)
    • 문제
      1~45 사이의 임의의 난수를 a 배열에 여섯 개를 저장한 후,
      오름차순으로 정렬해서 출력

  • 여기서 문제점이 하나 생겼는데 바로 중복되는 숫자들이 생긴다는 것!!
    아직 중복을 없애는 방법은 배우지 못했으므로 여기서 마무리하기로 했다.
  • 그 부분은 내일 수업에서 배우기로 했다.



 🧋 마무리 하면서... 

  • 오늘은 길고 어려운 문제도 많았고, 정리할 이론들도 많아서 메모해둔 글을 정리하는 시간이 길었다.
  • 수업시간, 쉬는 시간에 기록한 내용들을 블로그에 적기위해 다시 다듬으면서 다시 한 번 개념을 정리하고 수업을 복습할 수 있었다.
  • 힘들지만 좋은 복습 방법인 것같다. 적어도 JAVA이론은 빼먹지 말고 매일 기록해야겠다.



profile
제가 공부하고 공유하고 싶은 글을 올리고 있습니다.

0개의 댓글