본문 바로가기
백엔드/자바

자바-5

by study_yeon 2023. 5. 2.

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 변수는 힙의 위치를 사용해서 참조합니다.
- 메모리의 학생 클래스 형식의 객체를 만든다, 만들어진 객체의 내부 변수들을 초기화 한다.

'백엔드 > 자바' 카테고리의 다른 글

자바 - 7  (0) 2023.05.04
자바 - 6  (0) 2023.05.03
자바-4  (0) 2023.05.01
자바-3  (0) 2023.05.01
자바-2  (0) 2023.04.27