본문 바로가기
개발공부하며 느낀 인생 공부

메가테라 3주차 강의 필기 노트

by 날파리1 2022. 5. 23.

구구단 게임 만들기

//요구사항

// - 2단 출력 → 2 * 1 = 2 , 2 * 2 = 4 … 2 * 9 = 18

/ - 2~9단 출력 → 2 * 1 = 2, …. , 9 * 9 = 81

// 1. 중복을 먼저 발견 → 패턴 발견 → 중복 제거

// 2. 반복의 3요소? = 초기값 지정 + 조건 확인 + 상태 변경 → for문으로 정리.

// 3. for문 ⇒ for (초기값 지정; 반복 조건; 반복할 때마다 실행될 것)

예시

for (int x =2: x < 10; x +=1)

구조)

for(변수 초기화(시작점); 조건식(도착점 및 반복 횟수); 증감식(보폭)) {
	조건식이 true일 때 실행되는 구현부
}

// 4. 응집도가 높다. 끼리끼리 논다. 반복이라느 주제, 관심사에 따라 뭉침.

// 5. 관례 → 반복문에서 반복할 때 쓰는 정수형(int) 변수는 i로 쓴다.

// → 그 다음은 j, k ,l, ….

// ⇒ 하지만 j까지만 쓰자(너무 많이 쓰면 복잡하다.) 2 depth 까지만…

// 6. Escape 문자(탈출 문자, 특수 문자)

// -”\n” → new line ( 다음 줄로 넘김)

// -”\t”

이스케이프 시퀀스 설명

  • \a (경고 문자)
    \a는 기본적으로 들을 수 있는 경보 소리를 낸다. 일부 시스템에서는 아무런 효과를 내지 않는다.
  • \n, \t, \v, \b, \f, \r (출력 장치 제어 문자)
    • \n : 현재 활성 위치를 다음 줄의 시작 위치로 옮김(키보드의 enter 기능과 동일)
    • \t : 현재 활성 위치를 수평 탭의 다음 위치로 옮김(키보드의 tab 기능과 동일)
    • \v : 현재 활성 위치를 수직 탭의 다음 위치로 옮김
    • \b : 현재 활성 위치의 라인에서 활성 위치를 한 스페이스 뒤로 옮김(키보드의 backspace 기능과 동일)
    • \f : 현재 활성 위치를 다음 페이지의 시작 위치로 옮김
    • \r : 현재 활성 위치를 현재 라인의 시작 위치로 옮김

// 7. 반복문 탈출 → break

// 8. 반복문에서 아래만 skip → continue

// 9. Flow Control → 복잡한 걸 처리할 수 있게 됨. = 프로그램이 복잡해짐.

                          → 정답이 뚜렷하지 않을 수 있음.

// → 더 나은 방법은 존재함.

// ⇒ k는 쓰면 안 되나? 고민 … → 토론 / 질문 / 실험

// 10. 어떻게 하면 더 나은 구조로 바꿀 수 있을까 ?

 

 

숫자야구구게임

// 1. 정답을 준비 → 임의의 숫자 만들기 (random)

java.util.Random은 난수를 생성하는데 사용되는 클래스입니다.

Random은 다음과 같이 생성할 수 있습니다.

Random random = new Random();

그리고 nextInt()를 호출하면 Int형의 난수가 생성됩니다. 숫자의 범위는 32bit로 표현 가능한 모든 Integer가 리턴될 수 있습니다.

Random random = new Random();
System.out.println(random.nextInt());
System.out.println(random.nextInt());
System.out.println(random.nextInt());
System.out.println(random.nextInt());

// 2. strike와 ball 계산 (연산/처리) → Business Logic( 제일 중요하다)

//

// 1. 중복을 발견 → 패턴 발견 → 중복을 제거.

// 2. 배열(Array) → 같은 타입의 여러 값을 index로 접근해서 관리할 수 있는 타입.

배열

배열(Array)은 많은 데이터를 순번을 가지고 저장할 때 사용됩니다.

배열에는 원소라는 index 번호를 할당받은 저장소가 있으며, 배열의 원소에 index 로 접근하여 할당된 값을 읽어 올 수 있습니다.

많은 양의 데이터를 보관해야 할 때 배열을 사용하면 효율적으로 데이터를 관리할 수 있습니다.

  • 하나의 변수에 여러 개의 데이터를 담을 수 있는 그릇 or 여러 개의 변수를 한꺼번에 다룰 수 있는 자료
  • 대괄호[]를 사용해 생성하고 안에 쉼표로 구분해 자료를 입력
  • 여러 개의 변수를 인덱스 번호로 관리

 

배열 생성하기

배열은 다음과 같이 [] 또는 new Array() 두 가지 방법으로 생성할 수 있습니다.

JAVASCRIPT
var arr1 = [];
var arr2 = new Array();
Copy

 

배열 원소에 값을 할당하기

배열 원소의 index 를 통해서 값을 할당해 주거나 배열을 생성하면서 동시에 값을 할당하는 것이 가능합니다.

다음은 배열을 생성한 후에 원소에 값을 할당하는 방법입니다.

JAVASCRIPT
var array = []; // 배열 생성
array[0] = 데이터 1; // 데이터 요소 추가
array[1] = 데이터 2;
array[2] = 데이터 3;

var fruits = [];
fruits[0] = '사과';
fruits[1] = '배';
fruits[2] = '바나나';
Copy

[]배열을 생성시킨 후 변수 fruits 에 할당합니다. 그리고 변수 fruits 를 통해서 배열의 원소 0~2 index 에 값을 할당한 것입니다.

배열의 인덱스는 0부터 시작하기 때문에 사과를 index 0에 값을 할당한 것입니다.



배열을 생성과 동시에 원소에 값을 할당하는 방법은 다음과 같습니다.

JAVASCRIPT
var fruits = ["사과", "배", "바나나"];
Copy

배열인 []을 생성한 후에 원소 3곳에 값을 차례대로 넣어 주었습니다. 그리고 변수 fruits 에 배열을 할당한 것입니다.



출처: https://webclub.tistory.com/500 [Web Club]

// (index는 0부터 시작한다)

// 3. 배열의 크기/길이 ⇒ 여러 개 → 몇 개? length

// 4. main args는, 실행할 때 뒤에 쓴 단어(띄어쓰기로 구분)의 갯수.

// 5. 배열의 요소(item, element)에 접근하는 법 → array[index] ⇒ args[0], args[1]

// 6. 배열의 크기를 알고, 안에 있는 걸 모조리 보고 싶다 → 반복.

// 7. Guard Clause (보호절) → 실제로 처리해야 하는 상황이 아닌 경우. ⇒ 예외 처리.

Guard Clause란 무엇인가?

if/else 문의 단점

  • if/else 문이 복잡하고 중첩될 수록 부담이 늘어 가독성을 해친다.
    • 즉, 현재 조건의 state 를 파악하기 위해 아래 위로 움직이면서 조건을 파악을 해야한다.
    • code depth 가 깊어진다.
      Guard Clause 로 코드 평탄화 작업을 시켜 코드의 가독성을 향상시킬 수 있다.

Guard 란?

“In computer programming, a guard is a boolean expression that must evaluate to true if the program execution is to continue in the branch in question. Regardless of which programming language is used, guard code or a guard clause is a check of integrity preconditions used to avoid errors during execution.” — Wikipedia

  • wiki 전문
    • 프로그래밍에서 실행이 분기에서 계속되어야하는 경우 True 로 평가되어야하는 부울의 표현식
    • 어떤 프로그래밍 언어를 사용하든 가드 코드 또는 가드 절은 실행 중 오류를 피라기 위해 사용되는 무결성 전제 조건을 확인하는 것

Guard Concept 적용하기

  • 기존코드
if Guard {
    ...
}
  • Guard Concept 적용
    • Guard 조건을 not으로 변경하고 조기에 return 시킴(return early)
    • 기존의 guard 조건을 가진 분기의 코드 블락을 아래와 같이 not guard 이후 작성
if not Guard {
    return ...
}

...

중첩 조건문에 적용해 보기

  • token 을 인증하는 가상의 코드가 있다고 할 때,
    • user 가 존재하는 지 확인하고
      • 해당 token을 가져와 존재하는지 확인한 후
        • token purpose가 reset 인지 확인해서 이 경우 True를 반환

concept 적용전

async def verify_token(email: str, token: str, purpose: str):
    user = await user_service.get_user_by_email(email)

    if user:
        token = await user_service.get_token(user)

        if token :
            if token.purpose == 'reset':
                return True
    return False

concept 적용후

  • 변화된 사항
    • 중첩조건문이 사라지고, depth가 얕아짐
    • 복잡한 조건문을 가독성 높은 코드로 풀어낼 수 있음
async def verify_token(email: str, token: str, purpose: str):
    user = await user_service.get_user_by_email(email)

    if not user:
        return False
    
    token = await user_service.get_token(user)

    if not token or token.purpose != 'reset':
        return False
    
    return True

// 8. Array 초기화 → 중괄호를 이용해서 값을 넣을 수 있다.

// 9. 유지보수 → 유연성, 확장성… 얼마나 나중에 잘 바꿀 수 있는가? ⇒ 배열.

// 10. Random이라는 타입을 가져와서 도구를 만들어서 쓴다. (Scanner 동일)

// 11. 셔플 ⇒ 0~9까지의 숫자가 들어있는 배열을 준비하고, 섞어서, 앞에 있는 3개만 사용.

// 12. swap → temp 변수 사용.

// 13. 복잡한 프로그램 = 복잡한 걸 처리할 수 있다 = 프로그램이 어렵다 = 정답이 없다

// → 더 나은게 있다 = 지금 보는 코드에서 시작 → 토론 / 질문 / 실험

댓글