2023.05.02
1교시
● 가위바위보 마무리
- if else 반복
- 컴퓨터 기준으로 함
1. 비기는 경우 : 같은 걸 냈다
2. 이기는 경우
컴퓨터 나
주먹0 가위2
가위2 보1
보1 주먹0
3. 지는 경우
컴퓨터 나
주먹0 보1
가위2 주먹0
보1 가위2
package game;
import java.util.Random;
import java.util.Scanner;
public class RockPaperScissorsGame {
// 단축키 'p' 만들기
public static void p(String msg) {
System.out.print(msg); // 1줄로 표현(줄 바꿈 없음)
}
public static void main(String[] args) {
String[] rockpaperscissor = {"주먹", "보", "가위"}; // 초기화
int rockpaperscissorSize = rockpaperscissor.length;
// 기호상수 활용하기(인덱스 상수) - 배열을 직관적으로 알아보는데 도움이 됨
int IDX_ROCK = 0;
int IDX_PAPER = 1;
int IDX_SCISSOR = 2;
int com;
int me;
// 랜덤클래스를 이용하여 난수 구하기
Random rand = new Random();
// 정수형 난수를 3으로 나눈 나머지[0,1,2] = 배열의 인덱스를 무작위로 구하는 역할
com = Math.abs(rand.nextInt() % rockpaperscissorSize);
String comChoice = rockpaperscissor[com]; // 컴퓨터가 선택한 문자열 하나(가위,주먹,보)
me = Math.abs(rand.nextInt() % rockpaperscissorSize);
String meChoice = null; // 사용자의 선택
// 키보드로부터 입력을 받음(사용자가 선택한 가위,보,주먹 입력)
Scanner sc = new Scanner(System.in);
p("가위, 주먹, 보 중 하나를 선택하시오. (주먹 = 1, 보 = 2, 가위 = 3): ");
me = Integer.parseInt(sc.nextLine()); // 문자열(nextLine())을 정수형(int)으로 변경
// 입력한 내용[1,2,3]을 실제 가위, 주먹, 보 선택으로 변환 필요 : 보정 or 정제라고 부름
switch ( me ) {
case 1 : // 주먹을 선택한 경우
meChoice = rockpaperscissor[IDX_ROCK];
break; // 다음 케이스로 실행되는 것을 막기 위한 벽(실행 시작점을 빠져나가는 명령)
case 2 :
meChoice = rockpaperscissor[IDX_PAPER];
break;
case 3 :
meChoice = rockpaperscissor[IDX_SCISSOR];
break;
}
// 승부판정 루틴(기준 : comChoice)
String checkMsg = ""; // 변수 - 여기에 판정메세지가 들어갑니다.
// 판정루틴(equals로 값을 비교)
if (comChoice.equals(rockpaperscissor[IDX_SCISSOR])) { // 가위 선택
if(meChoice.equals(rockpaperscissor[IDX_SCISSOR])) {
checkMsg = "무승부! [컴퓨터 : 가위, 나 : 가위]";
}
if(meChoice.equals(rockpaperscissor[IDX_ROCK])) {
checkMsg = "나의 승리! [컴퓨터 : 가위, 나 : 주먹]";
}
if(meChoice.equals(rockpaperscissor[IDX_PAPER])) {
checkMsg = "컴퓨터의 승리! [컴퓨터 : 가위, 나 : 보]";
}
} else if(comChoice.equals(rockpaperscissor[IDX_ROCK])) { // 주먹 선택
if(meChoice.equals(rockpaperscissor[IDX_ROCK])) {
checkMsg = "무승부! [컴퓨터 : 주먹, 나 : 주먹]";
}
if(meChoice.equals(rockpaperscissor[IDX_PAPER])) {
checkMsg = "나의 승리! [컴퓨터 : 주먹, 나 : 보]";
}
if(meChoice.equals(rockpaperscissor[IDX_SCISSOR])) {
checkMsg = "컴퓨터의 승리! [컴퓨터 : 주먹, 나 : 가위]";
}
} else if(comChoice.equals(rockpaperscissor[IDX_PAPER])) { // 보 선택
if(meChoice.equals(rockpaperscissor[IDX_PAPER])) {
checkMsg = "무승부! [컴퓨터 : 보, 나 : 보]";
}
if(meChoice.equals(rockpaperscissor[IDX_SCISSOR])) {
checkMsg = "나의 승리! [컴퓨터 : 보, 나 : 가위]";
}
if(meChoice.equals(rockpaperscissor[IDX_ROCK])) {
checkMsg = "컴퓨터의 승리! [컴퓨터 : 보, 나 : 주먹]";
}
}
// 판정출력 (view)
p("###판정결과### : \n");
p(checkMsg);
// 선택 내용 자동 출력(없어도 되는 부분)
p("\n컴퓨터 선택 : " + rockpaperscissor[com]);
p("\n내 선택: " + me );
/* p("\n내 선택 : " + rockpaperscissor[me]);
이렇게 적으면 me는 1~3의 값 me의 배열은 0~2라서 오류
java.lang.arrayindexoutofboundsexception */
}
}
* 위치를 비교 ==
->같은 객체를 가르킨다.
comChoice == meChoice
같은 객체를 가르킨다 (가르키는 객체의 위치, 객체의 값이 같다)
* 값을 비교 equals
-> 가위바위보는 값을 비교해야하니까 equals를 이용
comChoice.equals(meChoice)
객체의 값이 같다
* 승부판정 루틴
1. 컴퓨터가 낼 3가지 경우 (같은 경우를 묶기) if / else if / else if
2. 컴퓨터가 한 가지를 냈을 때 상대편이 낼 수 있는 경우 if / if / if
2교시
* 변수의 이름은 7~8자 정도가 적당
- rockpaperscissors는 너무 길다 ^^
* 문서화 주석
/** (첫 줄에 * 2개)
*
*/
-> 나중에 문서화 주석만 별도로 추출 가능
* 기호상수 활용
문제 : 현재 가위 주먹 보 순서가 아니라 주먹 보 가위 순으로 되어있어 헷갈림
해결 : 기호상수를 활용하여 배열의 인덱스(숫자)가 아니라 영어 단어로 바꾸기
예시)
int IDX_ROCK = 0;
int IDX_PAPER = 1;
int IDX_SCISSOR = 2;
3교시
* 사용자의 오타를 대비하기 위한 선택지 변경
p("가위, 주먹, 보 중 하나를 선택하시오. (주먹 = 1, 보 = 2, 가위 = 3): ");
주먹 = 1, 보 = 2, 가위 = 3를 보정 or 정제를 해야 함
-> switch문 이용
* switch문은 정해진 값만 비교 가능
- 상태는 불가
* Integer.parseInt : 정수형으로 변경
- Integer객체에 위치한 parseInt() 메서드를 이용하여 변경
* 자바는 변수를 아래 선언하면 오류가 발생함
- 변수 선언을 먼저 해야 함
-> 붉은줄 표시는 하단의 변수가 아래에 선언되어 있어서 발생한 오류이다.
int IDX_ROCK = 0;
int IDX_PAPER = 1;
int IDX_SCISSOR = 2;
* 선언부와 처리부를 나누는 것이 중요
- 관련 있는 것끼리 모으기
* 전역변수 : 변수를 선언한 위치에 상관없이 프로그램 어디서든지 사용 가능
* 로컬변수 : 메소드 블럭 내에서 선언된 변수(브레이스연결된 것은 그 구획(메소드 블록) 안에서만 사용(효)할 수 있다)
->로컬변수는 초기화가 필수임
실제 관련 있는 값을 주거나 null (가르키는것 없음)을 선택
- null : 사용중인게 없다는 것...
● 이론 책(184p)
* int[ ] arr1 = new int[3];
-> 배열이기 때문에 연속으로 방이 3개 만들어짐(배열만의 특성)
방 size는 int 형이기 때문에 4byte * 3 = 12byte
-> new : 실체화 함, 방을 만들고 방의 시작 점을 반환해줌
* 배열 길이
배열변수.length;
- 배열의 length필드를 읽기 위해서 배열변수에 점(.) 연산자를 붙이고 length를 적는다.
- length는 읽기전용필드로 값 변경이 불가하다 (get 속성을 가짐) / (참고)set 속성은 변경이 가능함
* 객체 (데이터가 들어왔다가 나갔다 함) : 실제로 존재하는 것, 제품 같은 것
* 클래스(데이터가 들어왔다가 나갔다 하지 않음) : 실제로 존재하지 않는 것 (메모리에 들어가지 않음), 설계도 같은 것
-> 클래스는 내가 필요한 목적에 맞게 디자인 함
* 컴퓨터는 메모리에 데이터를 저장함
- 메모리에 데이터를 올릴 수 있는 것은 객체
4교시
▷(참고) import 하던 라이브러리 위치 - 10000개정도 됨
● 키보드로부터 학생이름, 수학 점수 입력받아 출력하는 기능 만들기
1. project, package, class 만들기
2. 코드 입력하기
package score;
import java.util.Scanner;
public class InputScore {
public static void main(String[] args) {
String[] names;
int[] mathScoreArray; // 생략하면 기본 값 null
int STUDENT_SIZE = 2; // 학생 수를 기호상수로 정의 (하단에서 학생 수가 변하더라도 여기서만 고치면 됨)
names = new String[STUDENT_SIZE]; // 2명짜리 학생 크기
mathScoreArray = new int[STUDENT_SIZE]; //2명짜리 수학 점수
// 키보드로부터 입력는 기능
Scanner sc = new Scanner(System.in); // 표준라이브러리(ctrl shift o)
// 학생 수 만큼 입력하기(반복문 for 필요)
for(int i = 0; i < STUDENT_SIZE; i++) {
p("학생이름을 입력해주세요 : \n"); // 안내문구
names[i] = sc.next(); // 학생 이름 입력
p("수학점수를 입력해주세요 : \n"); // 안내문구
mathScoreArray[i] = sc.nextInt();
p("\n");
}
// 입력된 내용 출력
int data_size = names.length; // 배열의 개수를 사용하여 정보 출력하기
int index = 0; // 배열에서 현재 데이터(names, mathScoreArray)의 위치를 가르킨다
while(index < data_size) {
p("학생이름[" + index + "] = " + names[index]);
p("\n수학점수[" + index + "] = " + mathScoreArray[index] + "\n");
p("------------------------------\n");
index++;
}
int sum = 0;
double avg = 0.0; // 평균은 소수점으로 나타내고자 함
index = 0; // 다시 현재 학생의 위치를 가르키려고 하므로
// 1. 총점 구하기
/*while(index < names.length) {
sum = sum + mathScoreArray[index];
index++;
}*/
// 2. 향상된 for(forEach)를 이용한 총점 구하기
sum = 0; // 이전 총합을 새로운 총합으로 구할 것이므로 0으로 초기화
for(var score: mathScoreArray) {
sum = sum + score; // score : 현재 점수
}
// 평균 구하기
avg = (double)sum / names.length;
pl("\'수학시험\' 응시자 수 : " + names.length);
pl("총점 : " + sum + "점");
pl("평균 : " + avg + "점");
}
// 메소드 정의는 메소드와 기능이 다르기 때문에 분리
public static void p(String msg) {
System.out.print(msg);
}
public static void pl(String msg) { // \n을 더 이상 사용하지 않아도 됨
System.out.println(msg);
}
}
* 향상된 for(forEach)
for(자료형 변수명 : 객체(ex 배열, 리스트)) {
출력값~~
}
- 변수(명)에 객체(배열)안에 있는 값을 전달하여 변수값을 뽑아내라
* 계획
- 변수 설정 : 학생이름 , 수학
- 키보드로부터 입력 받음
* 배열에서 이름 짓기
names or nameArray
String[] names;
int[] mathScoreArray;
- 이름 작명 시 패키지 이름 아니면 카멜을 주로 사용하는 것을 추천 함.
- 배열은 변수 앞에 [ ](브라켓) 사용
* 기호상수
- 변수에 데이터 집어 넣고 데이터를 고치지 않는 것
- final 활용하기도 함
- 상수취급
- 이름(식별자)은 대문자로 쓰고 단어와 단어는 스네이크 표기법을 사용하면 좋음
int STUDENT_SIZE = 2; // 학생 수를 기호상수로 정의 (하단에서 학생 수가 변하더라도 여기서만 고치면 됨)
names = new String[STUDENT_SIZE]; // 2명의 학생 크기
mathScoreArray = new int[STUDENT_SIZE]; // 2명의 수학 점수
* 학생 수 만큼 입력하기
- 학생수를 아니까 for 루프 사용
5교시
* 비즈니스로직
데이터에 입력한 내용을 끌어모아 총점과 평균을 구함
-> 컨트롤러의 역할
* MVC
- model = data
- view = 입력받은 데이터
- controller = 입력받은 데이터를 model에 넣는 것
* 반복문 for
1. 전통적인 for / while
2. 향상된 for
기본골격 : for(타입 변수 : 배열 ) {
실행문;
}
- var :타입을 데이터에 맞게 자동으로 결정해줌
- int : int타입
// 1. 총점 구하기
while(index < names.length) {
sum = sum + mathScoreArray[index];
index++;
}
// 2. 향상된 for를 이용한 총점 구하기
sum = 0; // 이전 총합을 새로운 총합으로 구할 것이므로 0으로 초기화
for(var score: mathScoreArray) {
sum = sum + score; // score : 현재 점수
}
-> 배열을 score에 넣어 score를 뽑아내라(반복문)
-> sum = sum + score; // score : 현재 점수
= 기준 오른쪽은 이전 총합
= 기준 왼쪽은 최신 총합
* data 와 info의 차이
info 볼 수 있는 정보
data 모여있는 자료
* nextLine() 주의사항
\n 같이 사용 금지
->next()로 사용
- scanner nextLine() '\n'으로 데이터 입력의 끝으로 간주하므로 만약 출력문에 '\n'이 포함되어 있으면 빈줄을 입력한 것으로 간주하는 버그가 있다
- 이런 경우 빈칸을 구분기호로 사용하는 next() 함수를 사용하는것이 좋다.
* 평균을 소수점으로 표하고 싶다면
- 정수를 더블로 강제 형변환 해주는 것이 안전
- 나누어 지는 쪽을 변환시키는게 좋음
int sum = 0; // 총 합은 정수임
double avg = 0.0;
avg = (double)sum / names.length;
- int avg = 0; // 평균을 정수로 나타냄
- double avg = 0.0; // 평균은 소수점으로 나타내고자 함
* 부동소수점
6교시 - class
● 객체 지향 프로그래밍 - 책 212p
* 객체(Object)란
- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것
- 속성(변수)과 동작(메서드)을 가짐
ex) 속성 : 이름, 나이, 색깔, 모델명 등
동작 : 웃다, 걷다, 달린다, 멈춘다 등
- 추상적 : 객체로 승격 가능한 상태
- 속성(data- 변수에 저장한다) : 변수를 가진다
* 현실세계 → 자바 : 추상화
자바 → 현실세계 : 구체화
* 메소드의 호출
리턴값 = 전자계산기객체.메소드(매개값1, 매개값2 ...)
- 전자계산기객체 : 메소드를 가지고 있는 대상
- 매개값 : 메소드를 실행하기 위해 필요한 데이터
- 점(.) : ~의, 객체의 필드와 메소드에 접근할 때 사용
int result = Calculater.add(10, 20);
- add에서 리턴한 값을 int 변수에 저장
- 객체의 상호작용은 객체간의 메소드 호출을 의미
* 객체 간의 관계
기계 - 자동차 : 상속관계 (is 관계)
사람 - 자동차 : 사용관계 (has 관계) - 객체간의 상호작용
자동차 - 엔진, 타이어, 핸들 : 집합관계 - 부품
* 메모리에 자바객체의 자리를 만들어줌 - new를 통해
* 클래스 = 설계도
인스턴스 = 객체
- 객체지향 프로그래밍 개발 단계
1. 클래스 생성 2. 사용할 객체 생성 3. 생성된 객체 이용
* 객체의 종류 (뭐죠 이게 - 나중에 다시 배움)
- 클래스객체 : 메모리에 1회만 올라감(static - 객체의 실체는 1개 뿐, 이미 만들어서 제공한다)
- 인스턴스객체 :
* public 접근제한자
- 누구나 쓸 수 있다
7교시
● chatGPT 이용 방법
- 보안문제가 있기때문에 개인정보, 아이디어 등 사용 금지
* 설치
- vsc의 extentions에서 easycode 검색하여 chatGPT 4 사용 (유료화 될 듯)
* 사용
- 왼쪽에 생긴 아이콘 클릭 후 try ~~ 클릭
- 내용 작성 후 비행기 모양
* 대소문자 변경
- toLowerCase : 소문자 변경
- toUpperCase : 대문자 변경
● 객체생성테스트
1. 패키지, 클래스 만들기
- 객체생성테스트
- 학생(데이터 클래스 - main 사용 안함)
2. 코드 작성
package myclass;
public class 객체생성테스트 {
public static void main(String[] args) {
학생 학생1 = new 학생(); // 학생 클래스의 생성자 함수
// 메모리의 학생 클래스 형식의 객체를 만든다, 만들어진 객체의 내부 변수들을 초기화 한다.
pl("학생1 변수가 학생 객체를 참조합니다.");
학생 학생2 = new 학생();
pl("학생2 변수가 또 다른 학생객체를 참조합니다.");
if ( 학생1 == 학생2 ) {
pl("학생1 변수는 학생2 변수와 같은 객체를 가르킵니다.");
} else {
pl("학생1 변수는 학생2 변수와 다른 객체를 가르킵니다.");
}
}
public static void p(String msg) {
System.out.print(msg);
}
public static void pl(String msg) {
p( msg + "\n");
}
}
학생 학생1 = new 학생();
* new (생성자)
- 학생 클래스의 생성자 함수
- 힙에 학생 객체가 만들어지고 그 번지(위치)를 학생1 변수에 저장한다
- 학생1 변수는 힙의 위치를 사용해서 참조합니다.
- 메모리의 학생 클래스 형식의 객체를 만든다, 만들어진 객체의 내부 변수들을 초기화 한다.