일
C#으로 프로그래밍 입문하기: 헬로 코딩Hello Coding 본문

이 책으로 코딩 기초에 입문했다.
아래는 복습 당시에 썼던 글이다.
Chapter 1: 프로그래밍을 위한 준비
01 프로그램과 프로그래밍이란 무엇인가?
001 프로그램과 프로그래밍
프로그램program: 어떤 목표를 이루기 위한 계획
예를 들어, TV 프로그램은 방송되는 콘텐츠의 계획표 같은거임
프로그래밍programming: 어떤 목표를 이루기 위한 계획을 세우는 과정
-> 컴퓨터 프로그램: 어떤 목표를 이루기 위해 컴퓨터에 제시하는 계획
002 모스 부호와 코드
프로그래밍을 한다는 말 대신에 '코드code를 짠다'라고도 함.
코드: 암호 또는 부호. 대표적인 부호가 모스 부호Morse Code임
모스 부호: 전신기 버튼을 통해 긴 전류와 짧은 전류를 조합해서 글자를 표현한 것.
우리나라 K5 자동차 광고에서 썼던 소리도 모스 부호임. (뚜- 뚜. 뚜- 뚜.뚜.뚜.뚜.뚜. ㅇㅇ)
그럼 '코드를 짠다'는 무슨 말이냐면?
컴퓨터가 이해하기 쉬운 암호를 작성하는 행위 ㅇㅇ
그래서 프로그래머를 '코드를 짜는 사람'이라는 의미로 코더coder라고 부르기도 함.
003 컴퓨터 코드와 빌드
왜 컴퓨터 코드를 짜느냐?
우리가 쓰는 말을 컴퓨터가 알아듣기에는 한계가 있기 때문임.
우리가 하는 말을 컴이 알아듣는 부호인 컴퓨터 코드를 이용해서 번역을 해줘야 프로그램을 짤 수 있음.
이걸 빌드한다고 말함.
-> 빌드Build: 프로그래머가 작성한 코드를 컴퓨터가 이해하는 코드로 번역하는 작업
02 프로그래밍 환경 설정
001 프로그래밍 언어의 종류
저급 언어:
- 컴퓨터가 이용하기 쉬움
-0과 1로 이루어진 기계어
-기계어와 1:1 대응하는 어셈블리어
-> 기계어와 어셈블리어의 차이가 정확히 뭔지 모르겠는데 지금 중요한건 아니니까 넘어감
고급 언어:
-인간이 이해하기 쉬움(인간중심주의...)
-기계어로 바꿔주는 과정 필요. 효율성 낮음
-스크립트 언어 (스크립트 언어가 뭔데요)
저급 언어와 고급 언어는 상대적임~ 지금 고급언어인게 나중엔 저급언어로 내려갈 수 있다고 함
002 어떤 언어로 시작해야 할까?
003 왜 C#인가?
004 개발 도구 설치하기
03 프로젝트 생성과 화면 구성
001 프로젝트와 템플릿, 솔루션
비주얼 스튜디오에서 사용하는 전용 단어임.
프로젝트project: 프로그램을 개발하는 데 필요한 각종 파일을 모아두는 보관함
템플릿template: 어떤 프로그램에 필요한 기본 코드를 미리 포함시켜 놓은 프로젝트 틀
ex) PC용 프로그램 템플릿, 핸드폰용 프로그램 템플릿
솔루션solution: 1개 이상의 프로젝트를 모아두는 보관함
04 빌드 및 실행
빌드를 해야 컴이 실행할 수 있는 프로그램이 만들어짐
빌드 단축키: ctrl + shft + b
실행 단축키 ctrl + F5
Chapter 2: 화면에 글자를 보여주려면, 출력문
01 프로그램 만들기
001 기존의 프로젝트 열기
002 코드 입력하기와 주석
코드 중에 앞머리에 //을 달면 '주석'이라는 뜻으로 컴퓨터는 주석을 무시함.
프로그래머의 메모 목적으로 사용됨.
02 화면에 글자 출력하기
001 함수
함수: 특정 기능을 수행하는 코드 묶음
'함수를 호출한다'라고 보통 표현함
002 콘솔
콘솔Console: 제어장치, 모니터링 장치
컴퓨터의 콘솔은 모니터링 장치에 좀 더 가까움.
프로그램의 출력은 콘솔 창에서 이루어짐.
저장하고 싶을 때는 ctrl + s
003 Console.Write()와 Console.WriteLine()
화면에 글자를 출력할 때 쓰는 함수.
1) Console.Write() -> 그 다음 출력 내용이 그냥 이어져서 나옴
2) Console.WriteLine() -> 엔터친 것처럼 한 줄씩 나옴
004 특수문자 출력과 오류 메시지
숫자는 "" 없이 함수 괄호 안에 바로 써도 출력됨
특수문자는 문자열로 취급하는 듯. "" 안에 써줘야 함.
' " \(역슬래시: 한글 자판에선 \) 등을 쓰고 싶을 경우에는 앞에 역슬래시를 붙여줘야 함
오류 메시지: 빌드 중 코드에 문제가 있어 빌드에 실패하면 출력되는 메시지
Chapter 3: 값을 바꿀 필요가 없다면, 상수( 그리고 값의 종류)
01 상수란 무엇인가?
상수Constant: 프로그램을 실행하는 중에 변하지 않는 값
-> 수數라고 해서 딱히 숫자만을 의미하는 건 아님. 기존의 과학 및 수학에서 Constant를 상수 라고 번역해서 쓰고 있었고 후대에 생긴 컴퓨터 언어가 그 번역어를 그대로 써서 그런 거ㅇㅇ
02 상수의 종류
001 정수형 int
정수integer: 자연수(양의 정수), 0, 0보다 작은 수(음의 정수)를 통칭하는 용어
정수형 상수: 소수점이 없는 숫자를 나타내는 상수
ex) Console.Write(12)의 12
002 실수형 double(실수 double형은 실수 float형보다 두 배의 양으로 저장되어 오차를 줄일 수 있음)
실수: 유리수(비로 표현되는 수)와 무리수(비로 표현되지 않는 수)를 통칭하는 단어
실수형 상수: 소수점이 있는 숫자를 표현하는 상수
ex) Console.Write(1.2)의 1.2
003 문자열형 string
문장을 표현하는 상수. 함수 괄호 안에서 큰따옴표"" 사이에 넣어서 출력함.
03 상수에 이름을 붙이자
코드 기본형:
<상수의 종류> <상수의 이름> = <상수>;
ex) string appleCountDescription = "사과의 개수";
04 왜 상수에 이름을 붙일까?
001 코드를 읽기 쉽다
002 실수를 줄일 수 있다
003 같은 값을 여러 번 넣을 때 편하다
상수 이름 지을 때는 되도록 영어로 명사에 해당하는 단어 사용.
두 개 이상의 단어를 결합할 때는 다음 단어의 첫 알파벳을 대문자로.
그럼 코드 읽기 편함 ㅇㅇ
Chapter 4: 내맘대로 값을 바꾸고 싶다면, 변수 그리고 연산
01 컴퓨터란 무엇인가?
컴퓨터computer: 고성능 전자회로를 내장한 자동 계산기.
compute: 복잡한 계산을 하다 / calculate: 간단한 계산을 하다
02 사칙연산, 연산의 기본
03 문자열 연산
04 변수란 무엇인가?
변수variable: 바뀔 수 있는 값. 필요에 따라 여러 가지 값을 넣을 수 있는 저장소
변수에 연산을 저장할 경우, 최종 결괏값을 가지는 변수는 등호=의 왼쪽에 쓴다.
ex) appleCount = appleCount - 2
코드에 등호가 있을 경우, 등호 오른쪽의 수식을 계산해서 왼쪽의 변수에 넣는다고 생각하면 됨.
변수에 아무것도 넣지 않고 출력을 하면 안 됨. -> 초기화가 안 된 변수
05 디버깅: 버그를 잡아보자
001 디버그와 디버깅
002 중단점
003 디버깅 시작하기
심화 문제 4-2
주머니에 동전이 10개 있습니다. 아람은 절반을 가져가더니 1개를 도로 넣었습니다.
우람은 남은 동전의 절반을 꺼내더니 2개를 더 꺼냈습니다.
아람이 가져간 동전, 우람이 가져간 동전, 주머니에 남은 동전이 몇 개인지 출력하는 프로그램을 작성하세요.
코드 ↓

구현 ↓

Chapter 5: 실행 중인 프로그램에 명령을 내리려면, 키보드 입력
01 입력이 필요한 이유
입력: 프로그램에 값을 넣어주는 행위. 컴퓨터에 사용자가 정보를 넘기는 모든 행위
변하는 부분이 생길 때마다 매번 빌드를 하면 귀찮으니까, 빌드는 한번만 하되 원하는 값을 입력하는 거임
02 키보드 입력
키보드 입력을 받을 때 쓰는 함수: Console.ReadLine()
-> Read 읽다 Line 줄 ㅇㅇ
03 문자열 변환
문자열을 정수로 변환할 때 쓰는 함수: int.Parse()
-> integer 정수 parse 해석하다 ㅇㅇ
실수로 변환할 때는: double.Parse()
심화 문제 5-3
동전이 10개 들어 있는 주머니가 있습니다. 어머니는 동전을 몇 개 더 넣고 아람과 우람에게 원하는 만큼 동전을 가져가라고 할 것입니다. 문제의 예제 실행 화면 입니다.
주머니에는 동전이 10개 들어 있습니다
어머니는 몇 개의 동전을 주머니에 넣었나요?
10 (키보드 입력)
아람이는 몇 개의 동전을 꺼냈나요?
3 (키보드 입력)
우람이는 몇 개의 동전을 꺼냈나요?
6 (키보드 입력)
주머니에 남아 있는 동전의 개수는 11개입니다.
이 창을 닫으려면 아무 키나 누르세요...
이 프로그램을 구현하세요.
코드 ↓

구현 ↓

Chapter 6: 상황에 따라 결과가 달라야 한다면, 조건문
01 조건문이 필요한 이유?
입력받은 문자열이 어떤 값인지 비교한 뒤 그 결과에 따라 필요한 연산을 해야 하는 경우가 많기 때문
그런 비교를 할 때 조건문을 씀
조건문: 비교연산자를 이용하여 두 개의 값을 비교하는 코드
02 비교연산자
>
<
>=
<=
==: 같다는 뜻
!=: 같지 않다는 뜻
조건문을 돌릴 때 상수끼리 비교를 하면 참, 거짓 결과가 변하지 않지만
변수끼리 비교를 하면 그 결과가 변할 수도 있음.
이런 결과가 변하지 않게 저장을 할 때 쓰는 변수가 있음
논리 자료형 bool: 참true, 거짓false을 저장하는 변수의 종류
03 만약 그렇다면 if
기본형:
if(조건식)
{
조건을 만족할 때만 실행하는 코드
}
*읽기 좋은 코드 - 중괄호와 들여쓰기
코드를 작성할 때는 가독성이 중요함. 중괄호를 쓰면 자동으로 들여쓰기가 되어서 코드 읽기 편해짐.
04 만약 그렇지 않다면 else
기본형:
if(조건식)
{
조건을 만족할 때만 실행하는 코드
}
else
{
조건을 만족하지 않을 때만 실행
}
-> else 안에 if문이 또 들어갈 경우 처음부터 else if 로 줄여 쓰기도 함
04 논리연산
001 논리곱연산자(&&)
뜻: 왼쪽이 참이고 오른쪽도 참이라면
기본형: 조건식 1 && 조건식 2 && 조건식 3 && ...
002 논리합연산자(||)
뜻: 왼쪽이 참이거나 오른쪽이 참이라면
기본형: 조건식 1 || 조건식 2 || 조건식 3 || ...
003 논리부정연산자(!)
뜻: 참거짓이 반대라면
기본형: !(조건식)
심화 문제 6-2
정수형 변수 userInput에 사용자의 입력을 받아서
userInput이 20보다 크고 3의 배수이면
"20보다 큰 3의 배수입니다."를 출력하는 프로그램을 작성하세요.
(힌트: %3이 0이면 3의 배수입니다.)
코드 ↓

구현 ↓

Chapter 7: 수많은 변수를 손쉽게 관리하려면, 배열
01 변수가 많아지면 복잡해져요
만약 변수가 1,2개가 아니라 100개, 1000개라면 코드는 엄청 길고 복잡해질 것임
그런 불편함을 개선하기 위해 배열을 이용함
02 배열
001 배열이란?
배열array: 같은 종류의 변수 여러 개를 한 줄로 세워 둔 것
기본형: 변수의 종류[] 이름 = { 배열에 들어가는 값. 각 값은 쉼표(,)로 구분한다. };
배열에 들어 있는 값에 접근할 때는 [] 안에 인덱스 숫자를 넣어 위치를 지정함.
인덱스index: 배열 안에 들어 있는 값의 위치
첫 번째 숫자를 읽어올 때 1이 아니라 0을 사용함.
왜? 컴퓨터는 숫자를 셀 때 1이 아니라 0부터 세기 때문.
배열에 들어가는 값도 입력받을 경우 {}을 쓰지 않고 배열 속 변수의 숫자만 정하기도 함
ex) 6개의 실수 변수가 들어가는 배열 코드 -> double [] array = new double[6];
그 숫자도 변수로 선언할 수도 있음.
ex) int[] student = new int[studentCount]
002 다양한 종류의 배열 만들기
정수형, 실수형, 문자형 변수 모두 배열로 만들 수 있음
003 안전하게 배열을 사용하려면?
배열 범위를 벗어난 위치(인덱스)를 입력할 경우도 있으니, 입력 값의 범위를 검사하는 코드 추가 가능
03 컨테이너
컨테이너container: 데이터를 한 군데 모아 놓을 수 있는 저장소
컨테이너의 대표적 종류
1. 배열array: 배열의 크기를 프로그램 실행 중에 바꿀 수 없음, 위치(인덱스) 지정 시 정수만 사용 가능
2. 리스트list: 언제라도 그 속에 들어가는 데이터의 개수 변경 가능
3. 딕셔너리dictionary: 인덱스 지정 시 문자열을 사용할 수 있음
심화 문제 7-2
국어, 영어, 수학, 과학, 사회 점수를 입력받아서 총점과 평균을 구하는 프로그램을 작성하세요.
(힌트: 점수에 배열을 사용하세요.)
코드 ↓

구현 ↓

사진 설명을 입력하세요.
Chapter 8: 같은 코드를 여러 번 실행하려면, 반복문 while
01 같은 코드를 여러 번 실행하고 싶어요
예를 들어 도어락 프로그램의 경우엔 입력한 비번이 틀리면 다시 입력할 기회를 주잖아?
만약 비번을 맞출 때까지 입력을 받는다면 코드 길이는 끝나지 않겠지.
똑같은 코드를 계속 붙여넣는 것보다는 이미 짜놓은 코드로 돌아가서 재실행하는게 효율적임.
그럴 때 필요한 게 반복문.
02 ~하는 동안
while: ~하는 동안 (접속사)
기본형:
while(조건식)
{
조건을 만족할 때만 실행
}
while문은 어떤 조건이 참인 동안 특정한 코드를 반복해서 실행함.
<-> if문은 어떤 조건이 참인 동안 특정한 코드를 한번만 실행함.
03 반복문 빠져나오기
만약 while문의 조건식이 언제나 참이라면 while문이 끝없이 반복될 수도 있음.
참 거짓 하니까 논리 자료형bool 생각나지? 맞음. bool을 while문에 이용할 수 있음.
예를 들어 while (true) 인 경우처럼ㅇㅇ
이때 while문을 끝내는 장치가 필요한데, 그건 바로 break 임.
while문 안에서 break를 쓰면 즉시 while문이 끝남.
반대로 while문의 처음으로 돌아가는 장치도 있음. continue임.
while문 안에서 continue를 쓰면 즉시 while문의 처음으로 돌아가서 실행됨.
심화 문제
먼저 총학생 수를 입력받습니다. 그리고 각 학생마다 각각 국어, 영어, 수학 점수를 입력받습니다.
그다음 입력받은 점수를 계산해서 각 학생의 총점과 평균을 구하는 프로그램을 작성하세요.
코드 ↓

구현 ↓

Chapter 9: 반복횟수가 정해져 있다면, 반복문 for
01 while문으로 반복횟수가 정해진 코드 작성
while문은 반복 횟수가 무한한 반복문이고, for문은 반복 횟수가 유한한 반복문임.
물론 조건식에 따라 반복 횟수가 유한한 while문을 짤 수도 있음.
그러나 유한한 반복 횟수의 경우 for문의 문법이 더 편리함.
언제 끝날지 모르는 반복문에는 while문이 더 편리함.
02 for문으로 반복횟수가 정해진 코드 작성
for: ~하는 동안 (전치사)
기본형:
for ( 1 초기화 코드; 2 반복 조건식; 4 증감문)
{
3 반복할 코드
}
-> 적어놓은 숫자 1 2 3 4 의 순서대로 실행됨.
ex) for (int passcodeIndex = 0; passcodeIndex < passcodeLength; passcodeIndex++)
-> 여기서 ++: 후위연산자.
passcodeIndex++의 뜻은 passcodeIndex = passcodeIndex + 1과 비슷하다.
But 완전히 같은 코드는 아님.
for문을 사용하면 프로그래머가 코드를 한 줄에 읽을 수 있기 때문에 편함.
보기만 해도 이 반복문이 총 몇 번 실행될지 알수 있기 때문.
03 이중 for문
for문 안에 for문이 또 있는, 이중 for문도 많이 이용함.
예를 들어 구구단이나 사진 등, 표로 만들 수 있는 2차원(2D) 데이터에 이용.
사진은 너비와 높이가 반복되고, 구구단은 행이 1부터 9까지 반복되고 열이 1부터 9까지 반복되기 때문.
-> 구구단을 출력하는 이중 for문:
-> 변수 이름 i, j, k 를 쓰는 이유는 포트란Fotran이라는 프로그래밍 언어에서부터 시작된 관습 때문임.
별다른 이유가 없을 때는 관습적으로 쓰지만, 구체적 목적의 프로그램을 짤 때는 의미를 정확히 알리는 변수 이름을 사용하는게 좋음.
심화 문제 9-2
3학년에 다섯 개의 반이 있고 한 반의 학생은 10명입니다.
각 반의 학생들의 성적을 입력받아서 반별로 평균을 구하세요.
(힌트: 이중 for문을 쓰세요.)
-> 5개 반, 10명 학생은 구현 콘솔 창이 너무 길어질 것 같아서 2개 반, 3명 학생으로 줄였다.
코드 ↓

구현 ↓

이 코드는 변형하고 싶었는데 아직 성공을 못해서 좀 아쉽다.
지금 코드는 한 반의 성적을 입력하면 끝에 그 반의 평균이 나오고 다음 반으로 넘어가는 순서인데,
모든 반의 성적을 쭉 입력하고 모든 반의 평균을 쭉 출력하는 순서로도 만들어보려고 했는데 아직 잘 모르겠다.
Chapter 10: 언제나 똑같으면 재미가 없으니, 랜덤
01 게임: 예측을 못해야 재미있어요
때로는 프로그램에 따라 프로그래머도 어떤 숫자가 나올지 몰라야 하는 경우가 있음.
이렇게 예측 불가능한 숫자가 필요할 때 사용하는 것이 랜덤임.
02 랜덤
랜덤Random: 무작위/임의로 숫자를 뽑아내는 클래스
-> 클래스class: 쉽게 말하면 함수(특정 기능을 수행하는 코드 묶음)를 모아둔 곳.
클래스는 이 책에서 자세히 다루지 않음.
이 책 진도 상에서는
<Random random = new Random();이라는 코드로 랜덤 생성기를 만들어 random 변수에 대입한다>
고만 기억하면 됨.
랜덤 변수는 넥스트 함수와 많이 쓰임.
ex) int number = random.Next(1, 7);
-> 1과 7은 넥스트 함수의 최솟값min과 최댓값max임.
Next() 함수를 호출하면 min 이상 max 미만의 숫자가 무작위로 뽑힘.
코드 10-2 로또 번호를 고르는 프로그램
(문제로 나온 건 아니고 본문 진도에 수록된 코드인데, 책을 보지 않고 혼자 구현하면 복습에 좋을 것 같아서 넣었다.)
로또 번호 생성기를 만드세요.
로또 번호의 길이는 6자리, 유효한 범위는 1~45입니다.
중복되는 번호가 있으면 안됩니다.
(힌트: 논리 자료형 bool 을 이용하세요.)
코드 ↓

처음에 본문을 안 보고 나 혼자 구현해봤는데 본문 코드와 너무 달라져서 다시 참고했다.
내가 그냥 할 때는 중복 검사 없이 이렇게 짰음...ㅎ

중복 검사 안할거면 Duplication 왜 썼을까
이 문제는 이번주 금요일에 복습하면서 다시 한번 풀어봐야겠다.
코드가 복잡해지니 혼자 구현할 때는 논리적으로 순서를 배치하는게 아직 어려운 듯!
그 이유는 내가 문제가 요구하는 논리를 머릿속에서 제대로 그려내지 못했기 때문인 것 같다.
연습하면 점점 늘 것이다!
그리고 다시 풀어보면서 개념을 제대로 깨달은게 있다.
1) break 키워드는 중첩된 모든 반복문을 끝내는게 아니라 break가 들어간 그 반복문만 끝낸다.
2) continue 키워드는 중첩된 모든 반복문의 처음으로 돌아가는 게 아니라 continue가 들어간 그 반복문의 처음으로만 돌아간다.
이래서 복습이 중요...ㅎ
더 간단하고, 더 가독성이 좋은 코드를 만들고 싶다.
찾아보니 중첩 반복문에서 한번의 break 키워드로 빠져나가는 방법은 loop를 걸어주는 것이다.


[Java]이중루프, for문 빠져나가는 방법 우리가 흔히 자바에서 for문으로 이중 루프를 돌릴때, 조건에 맞으면 나가야 할 때가 있다. 그럴때 쓰는것이 바로 break; 예를 들어서 [단일 loop] for(int i= 0; i < a.l..
docu94.tistory.com
구현 ↓
심화 문제 10-1
숫자 맞추기 게임을 만드세요. 규칙은 다음과 같습니다.
(힌트: while문을 쓰세요.)
1) 수비수가 1 이상 100 이하의 숫자를 무작위로 고릅니다.
2) 공격수가 숫자를 입력합니다.
3) 만약 입력한 숫자가 수비수가 고른 숫자보다 크면 "더 작은 숫자입니다"를 출력합니다.
4) 만약 입력한 숫자가 수비수가 고른 숫자보다 작으면 "더 큰 숫자입니다"를 출력합니다.
5) 만약 입력한 숫자가 수비수가 고른 숫자보다 같다면 "정답입니다."를 출력합니다.
6) 맞출 때까지 2~5를 반복합니다.
코드 ↓

구현 ↓

심화 문제 10-2
가위바위보 게임을 만드세요. 규칙은 다음과 같습니다.
1) 1은 가위, 2는 바위, 3은 보입니다.
2) 프로그램에서 1 이상 3 이하인 숫자를 무작위로 고릅니다.
3) 사용자가 1,2,3 중에 하나를 고릅니다.
4) 사용자가 지면 "졌습니다."를 출력합니다.
5) 사용자가 이기면 "이겼습니다."를 출력합니다.
6) 비겼다면 "비겼습니다."를 출력합니다.
7) 비기면 2~6을 반복합니다.
코드 ↓


이거 좀 더 간단히 짤 수 있을 거 같은데 잘 모르겠다.
일단 가위바위보 for문으로 구글링해보니까 대부분 if문과 Random을 이용해서 푸는 듯 하다.
구현 ↓

복습 끝 소감: 총 3회독을 했다. 그래도 책에 나오는 문제 휘리릭 풀진 못한다 ㅎ
그래도 처음 1회독은 하다가 어려우니 미루기도 해서 4-5일 정도 오래 걸렸는데,
회독을 거듭하니 저번보다 이해가 잘 되고 속도도 더 빨라지는게 눈에 보여 재밌고 기쁘다!
'C' 카테고리의 다른 글
KNK Chap.2 (2.8~Q&A) (0) | 2022.12.06 |
---|---|
KNK Chap.2 (2.5~2.7) (0) | 2022.12.03 |
KNK Chap.2 (2.4) (0) | 2022.12.02 |
KNK Chap.2 (2.1~2.3) (0) | 2022.12.02 |
C Programming: A Modern Approach second edition a.k.a KNK (2008) Chap.1 (1) | 2022.12.02 |