본문 바로가기
Programming Language/Java

[국비] Java 내용정리 Day16

by tpleehan 2021. 11. 28.

Math 클래스

  • 수학 관련 함수들을 제공하는 클래스다.
  • 모든 메서드는 static으로 구성되어 있다.

package api.lang.math;

public class MathExample {

	public static void main(String[] args) {

		// 올림
		int i = (int) Math.ceil(1.1);
		System.out.println(i);
		
		// 내림
		double d = Math.floor(1.5);
		System.out.println(d);
		
		// 반올림
		double d2 = Math.round(3.141592 * 100) * 0.01;
		System.out.println(d2);
	 	
		// 제곱
		double d3 = Math.pow(3.0, 4.0);
		System.out.println(d3);
		
		// 최대값
		int max = Math.max(2, 10);
		System.out.println(max);
		
		// 최소값
		int min = Math.min(24, 33);
		System.out.println(min);
		
	}

}

Math Quiz

Math를 이용해서
1 ~ 10이 전달되면 1이 반환되고
11 ~ 20이 전달되면 2가 반환되고
21 ~ 30이 전달되면 3이 반환되는
page 메서드 작성하기
package api.lang.math;

public class MathQuiz {
	
	public static int page(int num) {
		return (int) Math.ceil(num / 10.0);
	}

	public static void main(String[] args) {		
		System.out.println(page(34));
	}

}​

Wrapper 클래스

  • Wrapper 클래스는 자바의 기본타입 8가지를 객체로 포장한 클래스다.
  • Byte, Short, Integer, Long, Float, Double, Boolean, Character 총 8가지 종류를 말한다.
package api.lang.wrapper;

public class WrapperExample {

	public static void main(String[] args) {
		
		int a = 100;
		boolean b = false;
		char c = 'A';
		double d = 3.14;
		
		// boxing: 기본 데이터타입을 객체 타입으로 변환하는 과정 (권장x)
		Integer v1 = new Integer(50);
		Boolean v2 = new Boolean(b);
		Character v3 = new Character(c);
		Double v4 = new Double(d);
		
//		객체로 찾아가서 메서드를 호출 후 unboxing 사용
//		int i = v1.intValue();
		
		// autoboxing: 기본타입을 자동으로  객체형으로 변환
		Integer x1 = 400;
		Boolean x2 = true;
		Character x3 = c;
		Double x4 = d;
		
		// autoUnboxing: 객체 포장을 기본형으로 해제 가능
		int i = x1;
		double d2 = x4;

		// AutoBoxing 이후 wrapper 클래스는 문자열을
		// 기본형으로 변환하는데 많이 사용된다.
		String s1 = "10";
		String s2 = "3.14";
		System.out.println(s1 + s2);
		
		// 문자로 이루어진 정수를 실제 정수로 변환하는 메서드
		int num = Integer.parseInt(s1);
		// 문자로 이루어진 실수를 실제 실수로 변환하는 메서드
		double num2 = Double.parseDouble(s2);
		
		// 해당 타입으로 변환할 수 없는 문자열을 시도했을 경우
		// NumberFormatException 예외가 발생한다.
		System.out.println(num + num2);
		
	}

}

Parse Quiz

주민등록번호를 입력하면
입력된 정보를 확인해서 완성된 정보가 나오도록 출력한다.

주민번호 뒷자리의 첫 번째 숫자를 확인해서
1,2 - 남자로 표시하고,
3, 4 - 여자로 표시한다.

출력 예시)
입력: 211129-1234567
출력: 2021년 11월 29일 0세 남자
package api.lang.wrapper;

import java.util.Scanner;

public class ParseQuiz {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		
		char c;
		String ssn;
		while (true) {
			
			System.out.print("주민번호를 입력하세요: ");
			ssn = sc.next();
			
			if (ssn.indexOf("-") == -1) {
				System.out.println("주민등록번호는 하이픈을 포함 시켜야 합니다.");
				continue;
			} 
			
			c = ssn.charAt(7);
			
			if (!(c == '1' || c == '2' || c == '3' || c == '4')) {
				System.out.println("뒷자리 첫 번째 숫자는 1, 2, 3, 4 중 하나여야 합니다.");
				continue;
			}
			
			try {
				String test = ssn.substring(0, 6);
				String test2 = ssn.substring(7);
				
				Integer.parseInt(test);
				Integer.parseInt(test2);
				break;
			} catch (NumberFormatException e) {
				System.out.println("주민등록번호를 정수로 정확하게 입력해야 합니다.");
			}
				
		}
		
		ssn = ssn.replace("-", "");
		int year = Integer.parseInt(ssn.substring(0, 2));
		int month = Integer.parseInt(ssn.substring(2, 4));
		int day = Integer.parseInt(ssn.substring(4, 6));
//		char c = ssn.charAt(7);
		
		String gender;
		
		if (c == '1' || c == '3') {
			gender = "남자";
			
		} else {
			gender = "여자";
			
		}
		
		int birthYear;
		
		if (c == '1' || c == '2') {
			birthYear = year + 1900;

		} else {
			birthYear = year + 2000;
			
		}
		
		int age = 2021 - birthYear;
			
		System.out.printf("%d년 %d월 %d일 %d세 %s\n", birthYear, month, day, age, gender);
		
		sc.close();		
		
	}

}​

java.util 주요 클래스

  • java.util 패키지는 프로그램 개발의 유틸리티성 클래스들을 포함하고 있다.

package api.util.arrays;

import java.util.Arrays;

public class ArraysExample {

	public static void main(String[] args) {
		
		// 배열의 복사
		char[] arr = {'J', 'A', 'V', 'A'};
		char[] arr2 = Arrays.copyOf(arr, 4);
//		char[] arr2 = Arrays.copyOf(arr, arr.length);
		// copyOfRange(복사할 배열, 시작할 인덱스, 끝 인덱스(미만))
		char[] arr3 = Arrays.copyOfRange(arr, 1, 4);
		
		System.out.println(Arrays.toString(arr));
		System.out.println(Arrays.toString(arr2));
		System.out.println(Arrays.toString(arr3));
		
		// 배열의 탐색: binarySearch(배열, 검색할 값)
		// 반드시 정렬이 선행되어야 한다. 정렬이 안된 경우 판단하기 어렵다.
		
		int[] numbers = {1, 3, 5, 7, 9, 11, 13};
		System.out.println("5의 위치: " + Arrays.binarySearch(numbers, 5));
		
		// 배열의 정렬
		int[] nums = {41, 11, 35, 88, 34, 100};
		Arrays.sort(nums);
		System.out.println(Arrays.toString(nums));
		
		// 배열의 내부 요소가 동일한지 여부를 확인
		System.out.println(Arrays.equals(arr, arr3));
		
	}

}

Arrays Quiz

참가한 사람의 이름이 담긴 배열 participant와 완주한 사람의 이름이 담긴 배열
completion이 주어질 때 완주하지 못한 선수의 이름을 return하는 solution 함수를 완성한다.
package api.util.arrays;

import java.util.Arrays;

public class ArraysQuiz {

	public static String solution(String[] participant, String[] completion) {		
		Arrays.sort(participant);
		Arrays.sort(completion);
		
		
		for (int i = 0; i < completion.length; i++) {
			
			if (!participant[i].equals(completion[i])){
                return participant[i];    
            }
		}
		return participant[participant.length - 1];
	}
	
	public static void main(String[] args) {
		
		String[] participant = {"홍길동", "김길동", "김철수", "최철수", "박영희"};
		String[] completion = {"홍길동", "김길동", "박영희", "김철수"};
		
		System.out.println(solution(participant, completion));
		
	}

}​
package api.util.date;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateExample {

	public static void main(String[] args) {
		Date date = new Date();
		System.out.println(date);
		
		// 날짜를 원하는 형식의 서식 문자를 이용하여 출력을 도와주는 클래스
		SimpleDateFormat sdf;
		
		sdf = new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
		String dayInfo = sdf.format(date);
		System.out.println(dayInfo);
		
		sdf = new SimpleDateFormat("yy-MM-dd a hh:mm:ss");
		dayInfo = sdf.format(date);
		System.out.println(dayInfo);
		
		sdf = new SimpleDateFormat("오늘은 E요일입니다. 오늘은 1년 중 D번째 날입니다.");
		System.out.println(sdf.format(date));
		
	}

}
package api.util.random;

import java.util.Random;

public class RandomExample {

	public static void main(String[] args) {
		
		Random r = new Random();
		
		//실수 난수: 0.0 <= ~ < 1.0
		double d = r.nextDouble();
		System.out.println(d);
		
		//정수 난수: nextInt();
		int i = r.nextInt(); //int의 전체 범위
		System.out.println(i);
		
		//0 ~ 5까지의 정수 난수 생성 (끝값이 미만으로 인식됨)
		int j = r.nextInt(6);
		System.out.println(j);
		
		//10 ~ 100까지의 정수 난수 생성.
		int k = r.nextInt(91) + 10;
		System.out.println(k);
		
		boolean flag = r.nextBoolean();
		System.out.println(flag);

	}

}

Lotto Simulator Quiz

1. 1~45 범위의 난수 6개를 생성해서 lotto 배열에 넣어서 리턴한다.
2. 난수끼리는 중복이 발생하면 안되고, 난수를 생성한 후에 생성된 난수가
    이미 배열에 있는지 확인하고, 이미 존재한다면 다시 생성해서 검사하고 존재하지 않는다면 배열에 추가한다.
3. return 전에 배열을 정렬해서 리턴 (while으로 작성 for로 작성해도 된다.)
package api.util.random;

import java.util.Arrays;
import java.util.Random;

public class LottoSimulator {
	
	static Random r = new Random();
	
	static int prize1 = 0; //1등 당첨 횟수를 세어 줄 변수
	static int prize2 = 0; //2등 당첨 횟수를 세어 줄 변수
	static int prize3 = 0; //3등 당첨 횟수를 세어 줄 변수
	static int prize4 = 0; //4등 당첨 횟수를 세어 줄 변수 
	static int prize5 = 0; //5등 당첨 횟수를 세어 줄 변수
	static int failCnt = 0; //꽝 당첨 횟수를 세어 줄 변수
	
	public static int[] createLotto() {
		
		int[] lotto = new int[6];

		int i = 0; // lotto 배열의 인덱스
		
		while (i < lotto.length) {
			boolean flag = false; // 중복 여부를 알려주는 변수
			int rn = r.nextInt(45) + 1;
			
			for (int j = 0; j <= i; j++) {
				if (rn == lotto[j]) { // 중복 발생
					flag = true;
					break;
				}
			}
			
			if (!flag) { // 중복이 발생하지 않은 경우
				lotto[i] = rn;
				i++; // 다음 인덱스로 이동. 중복 발생 시에는 올라가지 않음
				
			}
		}
		
		Arrays.sort(lotto);
		return lotto;
	}

    // 보너스 번호를 생성하는 메서드
	public static int createBonusNum(int[] win) {
		/*
		 * - 매개값으로 전달되는 당첨번호들을 피해서
		 *   1 ~ 45 사이의 난수를 하나 리턴한다.
		 *   당첨번호와 중복된다면 중복되지 않을 때 까지 다시 뽑아주면 된다.
		 *   (boolean 변수를 활용하면 쉬움)
		 */
		
		int bonus = 0;
		
		while(true) {
			boolean flag = false;
			int rn =  r.nextInt(45) + 1;
			for (int i : win) {
				if (rn == i) { // 중복 발생
					flag = true;
					break;
				}
			}
			if (!flag) {
				bonus = rn;
				break;
			}
			
		}
		return bonus;
		
	}
	
	// 당첨 등수를 알려주는 메서드
	public static void checkLottoNumber(int[] myLotto, int[] win, int bonus) {
		
		/*
		 * 내 로또 번호와 당첨번호 배열을 비교하여 일치하는 횟수를 기억. 
		 * 일치하는 숫자만큼 위에 선언한 static 변수의 값을 올린다.
		 * 6개 일치 -> 1등 
		 * 5개 일치 + 보너스번호 일치 -> 2등
		 * 5개 일치 -> 3등
		 * 4개 일치 -> 4등
		 * 3개 일치 -> 5등 
		 * 나머지 -> 꽝
		 */
		int count = 0; // 내 로또번호와 당첨번호가 몇 개 일치하는지 세어줄 변수
		
		for (int i : myLotto) {
			for (int j : win) {
				if (i == j) {
					count++;
					break;
				}
			}
		}

		if (count == 6) {
			prize1++;
			
		} else if (count == 5) {
			boolean flag = false;
			
			for(int num : myLotto) {
				if (num == bonus) {
					prize2++;
					flag = true;
					break;
				} 
				
			}
			if (!flag) {
				prize3++;
				
			}
			
		} else if (prize4 == 4) {
			prize4++;
			
		} else if (prize5 == 3) {
			prize5++;
			
		} else {
			 failCnt++;
		}
		
	}
	
	public static void main(String[] args) {
		
		// 당첨번호 고정
		int[] win = createLotto();
		// 보너스번호 고정
		int bonus = createBonusNum(win);
		
		int paper = 0;
		long money = 0;
		
		/*
		System.out.println("당첨번호: " + Arrays.toString(win));
		System.out.println("보너스번호: " + bonus);
		
		int[] lotto = createLotto();
		System.out.println("내 로또번호: " + Arrays.toString(lotto));
		 */
		
		while (true) {
			int[] myLotto = createLotto();
			paper++;
			checkLottoNumber(myLotto, win, bonus);
			
			if (prize1 == 1) {
				money = paper * 1000;
				System.out.println("*** 1등에 당첨되었습니다. ***");
				System.out.println("------------------------");
				System.out.println("*** 1등에 당첨되는 동안 누적 당첨 횟수 ***");
				System.out.printf("2등 당첨 횟수: %d회\n", prize2);
				System.out.printf("3등 당첨 횟수: %d회\n", prize3);
				System.out.printf("4등 당첨 횟수: %d회\n", prize4);
				System.out.printf("5등 당첨 횟수: %d회\n", prize5);
				System.out.printf("꽝 당첨 횟수: %d회\n", failCnt);
				System.out.println("1등 한 번 당첨 되려고 사용한 금액: " + money + "원");
				break;
			} else {
				System.out.printf("로또 %d장 째 구매중...\n", paper);
			}
			
		}
		
	}

}​
 

컬렉션

  • 프로그램을 개발하다보면 다수의 객체를 저장해두고 필요할 때마다 꺼내서 사용하는 경우가 많다.
  • 배열을 이용해서 사용할 수 있지만, 크기가 고정되어 있고 불특정 수가 객체를 저장하기 때문에 알고리즘을 직접 만들어야 하는 불편함이 있다.
  • 불편함을 해결하기 위해 자료구조 API인 컬렉션을 사용한다.

이미지 출처: https://hanabie.tistory.com/36

  • 컬렉션 API는 java.util 패키지로 제공된다.
  • 여러가지 인터페이스를 지원하며, 대표적으로 List, Set, Map 인터페이스가 있다.

 List 컬렉션

  • List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있으며, 객체를 인덱스로 관리하기 때문에 배열과 유사한 점이 많다.
  • 실제로 List 인터페이스를 구현한 클래스 중 ArrayList는 배열자료구조 형태를 가지고 있다.
  • 대표적인 구현 클래스는 ArrayList, LinkedList, Vector가 있고 객체를 모음 저장과 함께 검색, 삭제, 수정기능을 사용할 수 있다.
  • 리스트는 동일한 주소를 가진 객체를 중복저장할 수 있다.

package collection.list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListExample {

	public static void main(String[] args) {
		
		List<String> nick = new ArrayList<>();
		
		String str = "야옹이";
		
		// add(객체): 리스트에 객체를 추가하는 메서드
		nick.add("댕댕이");
		nick.add(str);
		nick.add(new String("왕눈이"));
		nick.add("삐약이");
		nick.add("야옹이");
		System.out.println(nick);
		
		// add(인덱스, 객체): 특정 인덱스에 객체를 삽입하는 메서드
		nick.add(3, "호랭이");
		System.out.println(nick);
		
		// get(인덱스): 리스트 내부의 객체를 참조하는 메서드
//		String name = nick[3]; (x)
		String name = nick.get(3);
		System.out.println("3번 인덱스의 값: " + name);
		
		// size(): 리스트의 크기를 반환
		System.out.println("nick의 크기: " + nick.size());
		
		// set(인덱스, 수정할 객체): 리스트 내부의 객체를 수정
		nick.set(2, "꽥꽥이");
		System.out.println(nick);
		
		// remove(인덱스), remove(객체)
		nick.remove(5);
		System.out.println(nick);
		nick.remove(str);
		System.out.println(nick);
		
		// 리스트의 반복문 처리
		for (int i = 0; i < nick.size(); i++) {
			System.out.println(nick.get(i));
		}
		System.out.println("----------------------");
		
		// 향상 for문 (forEach)
		for (String n : nick) {
			System.out.println(n);
		}
		
		// contains(객체): 리스트 내에 객체의 존재 유무를 파악하는 메서드
		System.out.println(nick.contains("메뚜기"));
		System.out.println(nick.contains("삐약이"));
		
		// clear(): 리스트 내부 요소 전체 삭제
		nick.clear();
		System.out.println(nick);
		
		// isEmpty(): 리스트가 비어 있는지 여부 확인
		System.out.println(nick.isEmpty());
		
		// # 컬렉션 객체들은 Collections의 기능을 사용할 수 있다.
		//   Collections는 컬렉션 객체들의 부가 기능들을 지원한다.
		List<Integer> score = new ArrayList<>();
		score.add(65);
		
		// 한번에 객체 많이 추가하기
		Collections.addAll(score, 78, 100, 88, 79, 100, 21, 56, 100);
		System.out.println(score);
		
		// 컬렉션에서 등장 횟수 구하기
		System.out.println("100점 학생 수: " + Collections.frequency(score, 100));
		
		// 최대값, 최소값 구하기
		System.out.println("최대값: " + Collections.max(score));
		System.out.println("최대값: " + Collections.min(score));
		
		// 오름차순 정렬 (작은 값부터 순서대로 커지는 정렬)
		Collections.sort(score);
		System.out.println(score);
		
		// 내림차순 정렬 (큰 값부터 순서대로 작아지는 정렬)
//		Collections.sort(score, Collections.reverseOrder()); // 내림차순만 필요할 때
		Collections.reverse(score); // 역순 배치
		System.out.println(score);
		
		// 두 요소의 위치를 교체 - swap(리스트, index, index)
		Collections.swap(score, 3, 7);
		System.out.println(score);
		
		// 리스트 내의 요소를 무작위로 섞기
		Collections.shuffle(score);
		System.out.println(score);
		
		// 원하는 값으로 컬렉션 초기화
		Collections.fill(score, 100);
		System.out.println(score);
		
	}

}

'Programming Language > Java' 카테고리의 다른 글

[국비] Java 내용정리 Day18  (0) 2021.12.01
[국비] Java 내용정리 Day17  (0) 2021.11.29
[국비] Java 내용정리 Day15  (0) 2021.11.25
[국비] Java 내용정리 Day14  (0) 2021.11.24
[국비] Java 내용정리 Day13  (0) 2021.11.23

댓글