ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2주차 개념노트
    메가테라 2022. 8. 21. 21:21

    반복문

    제어문 중 하나로, 컴퓨터는 사람과 달리 동일 연산의 많은 반복을 짧은 시간에 실수 없이 정확하게 할 수 있기 때문에,

    컴퓨터에 반복문을 잘 시키는 것이 컴퓨터를 효율적으로 쓰는 방법이라고 할 수 있다.

    while, for, do-while문 이 대표적이다.

    while

    조건이 참일 때 코드를 실행한다.

    if조건이 참이면 코드를 실행하고, 다시 조건을 확인해서 참이면 코드를 실행하는 방식이므로 if문의 반복으로 볼 수 있다.

    따라서 조건이 거짓이 되는 경우가 없는 경우 코드를 무한히 반복하게 되고, 당연히 컴퓨터가 에러를 뱉게 된다.

    while문은 조건이 false인 경우 실행이 한 번도 되지 않는다.

    하지만 코드를 짜다 보면 일단 한 번은 실행을 시키고, 그 다음부터 조건을 검사해서 조건을 만족하는 동안 코드를 실행시키고 싶은 경우가 있다. 그럴 때는 do {} while (조건) 을 사용하면 된다.

    무한 루프

    프로그램이 무한정 돌아가는 것으로, 반복문에 종료 조건이 없거나 종료 조건이 참이 될 수 없는 경우 발생한다.

    무한루프에 빠지면 컴퓨터가 연산을 더 이상 못한다고 뻗으니 무한루프에 빠지지 않도록 주의해야 한다.

     

    특히 소수값을 비교할 때 무한루프에 빠지기 쉬우므로 주의해야한다.

    실수를 컴퓨터 상에서 표현할 때 오차가 생길 수 밖에 없어서 실수의 값이 동일한지 비교하기 보다는 두 실수의 차가 엄청 작은 숫자(threshold)보다 작을 때를 조건으로 주는 것이 바람직하다.

    메인 루프

    가장 중심이 되는 루프

    프로그램의 핵심이라고 볼 수 있다.

    종료 조건

    while문의 조건이 거짓이 되게 만들어서 반복을 끝내주는 조건을 의미한다.

    재할당

    어떤 값을 갖고 있는 변수에 다른 값을 넣어주는 것을 재할당이라고 한다.

    재할당을 할 때는 주의를 해야 한다.

    한 값이 여러군데에서 재할당이 되면 그 값을 컨트롤하기가 매우 어려워지고, 예를 들어 100점을 더하고 나서 2배를 해야되는데, 2배를 하고 100점을 더하는 이런 버그들이 나타나는데 기여할 수 있기 때문에 재할당은 주의해야 한다.

    증감

    증가하거나 감소하는 것을 의미한다.

    반복문에서 변수의 증감을 통해 종료 조건에 이르게 해서 반복을 끝낼 수 있다.

    중복 제거

    프로그램에서 중복이 보인다는 것은 리팩토링을 해야한다는 신호이다.

    더 간단하고 읽기 좋은 코드를 위해 중복을 반복문을 통해 줄여보자.

    반복의 3요소

    반복문이 성립하려면 보통 3가지가 필요하다. 

    1. 초기값 지정

    2. 반복 조건 확인

    3. 상태 변경

    반복이 되는 동안 반복을 시킬지 반복을 멈출지 판단할 매개체가 있어야 되기 때문에

    그 역할을 해줄 변수에 초기값을 지정해준다.

    그러고 나서 그 변수가 반복 조건을 만족시킨다면 해당 코드를 실행시키고, 그 코드 내부에서 변수도 적절히 수정해준다.

    수정된 변수가 반복 조건을 만족한다면 이 사이클이 한 번 더 진행이 될 것이고, 아니라면 멈출 것이다.

     for 문

    반복문의 일종이다.

    반복문을 돌게 해줄 변수 하나를 이용해서 그 변수의 시작 값을 선언해주고,

    한 번 코드를 돌리고 나서 그 변수의 값을 재할당해주고,

    프로그램이 반복되기를 원하는 동안 그 변수가 만족할 조건을 이용해서 코드를 반복한다.

    응집도

    관심사의 분리와 관련이 있다.

    비슷한 것은 비슷한 것 끼리 다른 것은 따로 따로 구분을 해두면 응집도가 높아진다.

    for문은 반복을 위한 값들의 응집도가 높다.

    따라서 반복에 대한 내용을 한 번에 파악하기 좋다.

    Escape문자

    역슬래시 \ 로 시작하는 문자는 escape character라고 해서 컴파일러가 다르게 컴파일 하도록 한다.

    간단하게 특수 문자라고 생각하면 된다.

    \t 탭을 넣고, 정렬을 한다.
    \b 백스페이스를 넣는다. (바로 앞의 문자를 지운다.)
    \n 개행(다음 줄로 이동) 한다.
    \r 해당 줄의 맨 앞으로 간다.
    \f 프린터에서 강제로 다음 페이지로 넘긴다.
    \' 작은 따옴표를 넣고 싶을 때 쓴다.
    \" 큰 따옴표를 넣고 싶을 때 쓴다.
    \\ \를 출력하고 싶을 때 쓴다.

    반복문 escape, skip 키워드

    - break

    반복문에서 반복 실행을 중단시키고 반복문을 종료(빠져나올 수 있게) 해준다.

    - continue

    반복문을 빠져나오지는 않고 continue 밑의 코드를 실행시키지 않고 다음 반복으로 넘어가게 해준다.

    control flow

    프로그래밍에서 함수의 호출, 명령어, 구문이 실행되거나 평가되는 순서를 말한다.

    간단히 프로그램 진행 순서라고 보면 된다.

    business logic = domain logic

    프로그램의 핵심 로직을 뜻한다.

    데이터가 어떻게 생성되고 저장되고 수정되는지를 정의한 것이다.

    배열

    같은 type의 값들을 모아둔 type이다.

    각각을 요소라고 부르고, index를 통해 요소를 불러낼 수 있다.

    배열의 요소로 배열을 넣어줄 수 있고, 배열에 배열을 넣어줄 때 마다 1차원씩 증가하게 된다.

    for문과 같이 사용하면 범용성 있는 코드를 짤 수 있다.

    main의 args

    자바에서 public static void main (String[] args)로 클래스 파일을 생성할 때 args는 사실 변수명이기 때문에 어떻게 지어도 상관이 없다.

    그리고 그 앞에 String[]이 있는 것을 보아 args는 String배열인 것을 알 수 있다.

    args는 해당 프로그램을 실행할 때 넣어주는 인자들을 띄어쓰기를 기준으로 저장해둔 배열에 해당한다.

    out of bounds

    배열이 갖고 있는 index를 벗어난 index의 값을 배열에 요구할 때 out of bounds에러가 발생한다.

    이 에러가 발생하면 index값이 제대로 됐는지 확인해야 한다.

    guard clause

    우리가 원하지 않는 결과를 가지고 있는 조건을 검사해서 걸러내어 미리 값을 반환하거나 종료시키는 구문을 의미한다.

    코드가 복잡해지는 것을 막고, 우리가 원하는 결과에 초점을 맞출 수 있게 해준다.

    Random

    통계학에서 무작위 값을 생성할 필요성이 옛날부터 있었기 때문에 무작위 값을 생성하는 방식에 대해 사람들이 오래 전부터 연구해왔다.

     

    자바에서는 현재 시간을 이용해서 0에서 1사이의 double 값을 무작위로 주는 Math.random()을 사용하거나 java.util 패키지의 Random클래스를 import해서 사용하면 된다.

     

    random한 수를 만들기 위해서는 seed라는 게 필요하다.

    seed는 random숫자를 만들기 위해 사용되는 값인데, 직접 넣어줄 수도 있고, 넣어주지 않으면 시간을 보통 사용한다.

    seed가 동일하면 같은 숫자가 만들어진다.

    아래의 linear congruential generator라는 수식으로 난수를 생성할 수 있는데,

     

     

    4byte 컴퓨터에서는 보통 a를 16807, c를 0, M을 2^31 -1로 주로 사용한다.

    여기서 Sn, Sn-1이 seed에 해당한다.

    그 이전 seed로부터 그 다음 seed가 4.82a식으로 계산이 된다.

    따라서 첫 seed가 동일한 랜덤 숫자 100개씩을 뽑으면 같은 숫자들로 이뤄져 있다.

    해당 수식은 이와 같이 파이썬 코드로 짤 수 있다.

    shuffle

    카드 게임을 할 때 카드를 섞는 행위를 말한다.

    카드덱을 처음 사면 순서대로 들어있기 때문에 카드가 어떤 카드인지 몰라야 하는 게임을 하기 위해서는 카드를 무작위로 섞는 셔플링이 필요하다.

    무작위로 숫자(0 ~ 카드 개수 - 1)를 두 개 받아서 그 순서에 해당하는 숫자 두개를 위치를 바꿔주는 일을 많이 반복해주면 무작위로 섞인 상태가 된다.

    순서대로 정렬하는 sorting의 반대 개념이다.

    댓글

Designed by Tistory.