Java

Java 기초(객체 지향 언어) - AWS 풀스택 과정 6일차

awspspgh 2024. 7. 22. 18:23

오늘은 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. 객체 지향 언어

객체 지향 언어

 

객체 지향 언어의 특징

 

 

 

클래스와 객체

 

예시

 

생성 순서

 

구성요소 - 1

 

구성요소 - 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번 로또 생성하는 문제를 원활하게 해결하지 못했고 문제를 푸는 도중에 문제를 풀 수 있는 방법이 너무 어렵게 느껴졌다. 특히 랜덤값을 중복없이 채우게 하는 방법에 대해 잘 몰랐기에 이 부분에 대해서 집중적으로 복습하고 공부해야겠다고 생각하게 되었다.