오늘은 method를 복습을 하고 객체 지향 언어에 대해서 배우도록 하겠습니다.
목차 | |
1. | method 복습 |
2. | 객체 지향 언어 |
3. | 예제 문제 |
4. | 느낀점 |
1. method 복습
◈ 최대공약수, 최소공배수 구하기
public class Method03 {
public static void main(String[] args) {
// method(기능) = function(기능)
// 접근 제한다 리턴 타입 메서드명(매개변수) {
// 기능;
// }
// - 리턴이 없다면 void
// - 매개변수는 생략 가능.
// - return 결과를 내보내는 동시에 메서드 종료
/* 최대공약수, 최소공배수 리턴하는 메서드
* */
int num1 = 6;
int num2 = 12;
System.out.println("최대공약수: " + gcd(num1, num2) + " 최소공배수: " + lcm(num1, num2));
}
/* 두 정수를 매개변수로 받아, 최대공약수를 리턴하는 메서드
* 매개변수 : 두 정수(int num1, int num2)
* 리턴타입 : 최대공약수 (int)
* 메서드명 : gcd
*/
/* 두 정수를 매개변수로 받아, 최소공배수를 리턴하는 메서드
* 매개변수 : 두 정수(int num1, int num2)
* 리턴타입 : 최소공배수 (int)
* 메서드명 : lcm
*/
public static int gcd(int num1, int num2) {
int max = 0;
for (int i = 1; i <= num1; i ++) {
if ((num1 % i == 0) && (num2 % i == 0)) {
max = i;
}
}
return max;
}
public static int lcm(int num1, int num2) {
for (int i = 1; ;i ++) {
int min = num1 * i;
if ((min % num2== 0)) {
return min;
}
}
}
}
◈ 1 ~ 100까지 중에서 소수 판별(True or False)하기
public class Method04 {
/* 정수 하나가 주어지면 그 정수가 소수인지 아닌지 판별(true / false)
* 리턴타입:
* 매개변수:
* 메서드명:isPrime
*/
public static boolean isPrime(int num) {
boolean result = false;
int cnt = 0;
for(int i = 1; i <= num; i ++) {
if(num % i == 0) {
cnt ++;
}
}
if(cnt == 2) {
return true;
}
return false;
}
public static void main(String[] args) {
/* 소수 구하기 메서드
* 2 ~ 100까지 중 소수를 출력
*/
for (int i = 2; i <= 100; i ++) {
if (isPrime(i) == true) {
System.out.print(i + " ");
}
}
}
}
※ boolean
=> method에서 return값을 true or false로 할 때 사용하는 리턴타입
◈ 배열을 5개씩 한 줄로 나열하여 출력하기
/* 배열을 콘솔에 출력하는 메서드
* 매개변수 : 배열
* 리턴타입 : 출력 => void
* 메서드명 : printArray
*
* 5개씩 한줄로 나열
*/
public static void printArray(int arr[]) {
for (int i = 0; i < arr.length; i ++) {
if(i % 5 == 0 && i != 0) {
System.out.println();
}
System.out.print(arr[i] + " ");
}
}
※ length
length 뒤에 괄호 X (ex : arr.length( ) => (x) / arr.length => (O))
+ 숫자를 정렬(오름차순)
/* 배열을 정렬하는 메서드(오름차순)
* 매개변수 : 배열
* 리턴타입 : 출력 => void / int []
* 메서드명 : sortArray
*/
public static int[] sortArray(int arr[]) { // 리턴타입을 void로 해도 이미 array를 변형하였기에 상관없음 만약 리턴타입을 정한다면 원래 array와 복사하여 정렬한 array로 나뉘어진다.
for (int i = 0; i < arr.length - 1; i ++) {
for (int j = i; j < arr.length; j ++) {
if (arr[i] > arr[j]) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
return arr;
}
- 리턴 타입을 void, int[ ]로 하든 상관이 없음
◈ 랜덤값을 배열에 채우고 리턴하기
/* 배열을 생성하여 [10] 랜덤값 (1 ~ 50)을 채우고 해당 배열을 리턴
* 메서드명 : randomArray
* 매개변수 : X
* 리턴타입 : 배열
*/
public static int[] randomArray() {
int arr[] = new int[10];
for (int i = 0; i < arr.length; i ++) {
int ran = (int)(Math.random()*50) + 1;
arr[i] = ran;
}
return arr;
}
2. 객체 지향 언어
3. 예제 문제
◎ 문제 1번
/* 로또 번호 생성 (1 ~ 45)
* 사용자 번호 6자리
* 당첨번호 7자리 => 마지막 자리는 보너스 번호
* - 당첨 기준
* 1등 당첨번호 6자리 모두 일치
* 2등 당첨번호 5자리 모두 일치 + 보너스번호 일치
* 3등 당첨번호 5자리 일치
* 4등 당첨번호 4자리 일치
* 5등 당첨번호 3자리 일치
* 나머지 꽝
*/
// 배열을 매개변수로 받아 1 ~ 45까지 랜덤수를 채우는 메서드 (중복 불가능 => 중복확인 메서드 활용)
/* 배열을 받아 배열을 출력하는 메서드
* user 1 2 3 4 5 6
* lotto 1 2 3 4 5 6 [7]
*/
/* 중복 확인 메서드
* 같은 값이 있으면 true, 없으면 false
*/
/* 등수 확인 메서드 (중복확인 메서드 활용)
*/
◎ 문제 2번
// 야구 게임의 클래스화
// 랜덤으로 배열을 중복되지 않게 생성
// 중복되면 true / false 알려주는 메서드
/* 스트라이크 개수를 카운트하여 리턴하는 메서드
* comNum, myNum 주고 번호와 위치가 같이 일치하면 count하는 메서드
* 매개변수 : int comNum[], int myNum[]
* 리턴 타입 : 카운트 값 int
*/
/* 볼 개수를 카운트하는 메서드
* comNum, myNum 주고 번호와 위치가 같이 일치하면 count하는 메서드
* 매개변수 : int comNum[], int myNum[]
* 리턴 타입 : 카운트 값 int
*/
정답:
◎ 문제 1번
// 중복 확인 메서드
public static boolean isContain(int arr[], int random) {
for(int i = 0; i < arr.length; i ++) {
if(arr[i] == random) {
return true;
}
}
return false;
}
public static void randomArray(int arr[]) {
//매개변수로 들어온 배열에 랜덤값을 중복없이 채우기.
int cnt = 0; //while에서 i 역할을 할 변수
while(cnt < arr.length) {
int r = (int)(Math.random()*45) + 1;
// 랜덤 수 생성 후 중복확인
// iscontain == true 중복되었다는 뜻
if(!isContain(arr, r)) {
arr[cnt] = r;
cnt ++;
}
}
}
// lotto, user 출력
public static void printArray(int arr[]) {
for (int i = 0; i < 6; i++) {
System.out.print(arr[i] + " ");
}
if (arr.length > 6) {
int bonus = arr[arr.length-1];
System.out.print("[ " + bonus + " ]");
}
}
// 등수 확인 메서드(중복 확인 메서드를 활용)
public static int lottoRank(int lotto[], int user[]) {
// lotto = 7개 / user 6개
// 배열이 잘못들어오면 오류
if(lotto.length <= user.length) {
return -1;
}
int cnt = 0; // 일치하는 개수를 세기 위한 변수(보너스 제외)
for (int i = 0; i < user.length; i ++) {
if(isContain(user, lotto[i])) {
cnt ++;
}
}
// System.out.println("---일치 개수---");
// System.out.println(cnt);
switch(cnt) {
case 6: return 1;
case 5:
if(isContain(user, lotto[lotto.length - 1])) {
return 2;
} else {
return 3;
}
case 4: return 4;
case 3: return 5;
default: return -1;
}
}
public static void main(String[] args) {
int lotto[] = new int[7];
int user[] = new int[6];
randomArray(lotto);
randomArray(user);
printArray(lotto);
System.out.println();
printArray(user);
System.out.println();
System.out.println("--------결과---------");
int rank = lottoRank(lotto, user);
if (rank == -1) {
System.out.println("꽝");
} else {
System.out.println(rank + " 등입니다.");
}
}
◎ 문제 2번
public class Exam01 {
public static void main(String[] args) {
int comNum[] = new int[3];
int myNum[] = new int[3];
// 사용자 번호 입력받기
Scanner scan = new Scanner(System.in);
System.out.println("야구 게임 (중복 금지)");
randomArray(comNum); // 랜덤 수 생성 (중복 X)
while(true) {
System.out.println("숫자 3개 입력 (1 ~ 9까지,중복 금지)"); // 숫자 입력
String msg = scan.next();
String num[] = msg.split(""); // 3개의 문자로 나누기
for (int i = 0; i < myNum.length; i ++) {
myNum[i] = Integer.parseInt(num[i]); // 3개의 문자(숫자)를 숫자로 변환
}
// 결과 출력
if (strikeCount(comNum, myNum) > 0) {
System.out.println(strikeCount(comNum, myNum) + " strike");
}
if (ballCount(comNum, myNum) > 0) {
System.out.println(ballCount(comNum, myNum) + " ball");
}
if (strikeCount(comNum, myNum) == 0 && ballCount(comNum, myNum) == 0) {
System.out.println("out");
}
if (strikeCount(comNum, myNum) == 3) {
System.out.println("정답! 게임종료");
break;
}
}
scan.close();
}
// 중복 확인
public static boolean isContain (int arr[], int random) {
for(int i = 0; i < arr.length; i ++) {
if(arr[i] == random) {
return true;
}
}
return false;
}
// 랜덤 생성 (중복 X)
public static void randomArray (int arr[]) {
int cnt = 0;
while(cnt < arr.length) {
int r = (int)(Math.random()*9) + 1;
if (!isContain(arr, r)) { // static = 클래스 메서드 호출 -> 클래스명.메서드명 (ex : Meathod06.isContain(arr,r))
arr[cnt] = r;
cnt ++;
}
}
}
// Strike 개수
public static int strikeCount(int arr1[], int arr2[]) {
int Strike = 0;
for(int i = 0; i < arr1.length; i ++) {
for(int j = 0; j < arr2.length; j ++) {
if((arr1[i] == arr2[j]) && i == j) {
Strike ++;
}
}
}
return Strike;
}
// Ball 개수
public static int ballCount(int arr1[], int arr2[]) {
int Ball = 0;
for(int i = 0; i < arr1.length; i ++) {
for(int j = 0; j < arr2.length; j ++) {
if((arr1[i] == arr2[j]) && i != j) {
Ball ++;
}
}
}
return Ball;
}
}
※ static
: 다른 클래스의 메서드를 클래스명.메서드명으로 호출할 수 있다. (ex: Method.isContain(arr,r))
4. 느낀점
오늘 예제 문제 1번 로또 생성하는 문제를 원활하게 해결하지 못했고 문제를 푸는 도중에 문제를 풀 수 있는 방법이 너무 어렵게 느껴졌다. 특히 랜덤값을 중복없이 채우게 하는 방법에 대해 잘 몰랐기에 이 부분에 대해서 집중적으로 복습하고 공부해야겠다고 생각하게 되었다.
'Java' 카테고리의 다른 글
Java 기초(static) - AWS 풀스택 과정 8일차 (0) | 2024.07.24 |
---|---|
Java 기초(Class) - AWS 풀스택 과정 7일차 (0) | 2024.07.23 |
Java 기초(String, Method) - AWS 풀스택 과정 5일차 (0) | 2024.07.19 |
Java 기초(배열) - AWS 풀스택 과정 4일차 (0) | 2024.07.18 |
Java 기초(While, Do ~ While) - AWS 풀스택 과정 3일차 (0) | 2024.07.17 |