구구단 게임 만들기
//요구사항
// - 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() 두 가지 방법으로 생성할 수 있습니다.
var arr1 = [];
var arr2 = new Array();
배열 원소에 값을 할당하기
배열 원소의 index 를 통해서 값을 할당해 주거나 배열을 생성하면서 동시에 값을 할당하는 것이 가능합니다.
다음은 배열을 생성한 후에 원소에 값을 할당하는 방법입니다.
var array = []; // 배열 생성
array[0] = 데이터 1; // 데이터 요소 추가
array[1] = 데이터 2;
array[2] = 데이터 3;
var fruits = [];
fruits[0] = '사과';
fruits[1] = '배';
fruits[2] = '바나나';
[]배열을 생성시킨 후 변수 fruits 에 할당합니다. 그리고 변수 fruits 를 통해서 배열의 원소 0~2 index 에 값을 할당한 것입니다.
배열의 인덱스는 0부터 시작하기 때문에 사과를 index 0에 값을 할당한 것입니다.
배열을 생성과 동시에 원소에 값을 할당하는 방법은 다음과 같습니다.
var fruits = ["사과", "배", "바나나"];
배열인 []을 생성한 후에 원소 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를 반환
- 해당 token을 가져와 존재하는지 확인한 후
- user 가 존재하는 지 확인하고
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. 복잡한 프로그램 = 복잡한 걸 처리할 수 있다 = 프로그램이 어렵다 = 정답이 없다
// → 더 나은게 있다 = 지금 보는 코드에서 시작 → 토론 / 질문 / 실험
'개발공부하며 느낀 인생 공부' 카테고리의 다른 글
인출학습은 뭘까? (메가테라 4주차 주간회고,학습법에 관한 고찰) (0) | 2022.06.04 |
---|---|
부트캠프 메가테라 3주차 주간회고(코딩을 아...ㄹ까 ?) (0) | 2022.05.28 |
초보 개발자 2주차 공부 느낀점(메가 테라 2주차 주간회고) (0) | 2022.05.21 |
자바로 헬로 월드! 만들기, 자바는 자바스크립트와 다른가? (메가테라 2주차 자바 공부 요약) (0) | 2022.05.16 |
일잘하는 개발자가 되기위한 과정 메가테라 1주차 회고 (0) | 2022.05.14 |
댓글