내일 배움 캠프에서 실행하는 자바 언어주차의 팀 프로젝트를 어느정도 마무리 했기때문에
이젠 바꿀필요가 있는것만 바꾸고 나머지는 두기로 하였다.
CurrencyConverterProject
개인적으로 해보고싶은것들을 적용해볼수있는 프로젝트를 만들어보고싶어서
키오스크와 마찬가지로 개인적으로 해보는 환율계산기 프로젝트를 해보려한다.
내가 해보고 싶은거는 OpenAPI기술을 인텔리제이에 적용해보는것이다
그래서 https://quotation-api-cdn.dunamu.com/v1/forex/recent?codes=FRX.KRWUSD
이곳의 소스를 활용하여 해볼생각이다...
진짜 전혀 하는 방법을 몰라서 우선 구상부터 해봐야겠다
1.미국 달러가 한국 원으로 변환되는 환율계산기를 할것이다
(나중에 해보고 잘되면 한국 원을 미국 달러로도 바꿔보자)
2. 클래스를 분할한다!
3. 실시간 시간도 받아올수있어야한다.
4. API를 활용한다~!!!!!
엄청 복잡한 기능을 할것이 아니기 때문에 클래스는 3개로 나누려고한다
인터페이스를 담당할 CurrencyCalculator
클래스와
API를 사용하게 할수있는 APIFetcher
그리고 환율정보를 가지고있을 클래스인 ExchangeRate
클래스로 구성을 할것이다...
기본 적인 틀을 잡기 위해서 API는 조금 있다가 하고...
우선 API에서 어떤 정보들을 받아올것인지를 정해야한다...
내가 받아오려는 정보는 우선 basePrice,name: "미국 (USD/KRW)",date,time을 받아와서 활용을 할것이다.
ExchangeRate
클래스public class ExchangeRate {
private double krwRate;
로 지정을 해서 한국 돈을 저장해주는 변수를 생성해주는것이 시작이다!
public ExchangeRate() {
this.krwRate = APIFetcher.fetchUSDKRW();
}
이것을 통하여서 실시간 KRW 환율정보를 가져와 변수에 저장해줄수있다.
public double getConvertedAmount(double amount) {
return amount * krwRate;
}
변환하려는 금액(amount)을 인자로 받아서 주어진 amount 금액을 krwRate 환율로 변환하여 결과를 반환하게만 해주면 되는것이다.
이렇게 하면 클래스의 기틀이자 완성이라고 할수있을거 같다...
처음엔 API를 어떻게 활용해야하는지 몰랐는데 예전에 VS Code를 통해 활용한 경험 밖에 없었다.
그래서 이번에 인텔리제이로 활용하려고 구글링을 정말 열심히도 했다..
그러기위해서는 우선 라이브러리에 json을 추가해주고 org.json을 활용할수있어야했다....
그렇게 검색중에 내가 활용을 하려면 Maven프로젝트 설정 파일을 해줘야한다는 것을 알았고
의존성을 해줘야지만 API를 끌어올수있다는 사실을 알게 되었다.
그래서 pom.xml
파일을 생성해줘서 이제 의존성을 포함시켜주는것이다!
pom.xml
<!-- Maven 프로젝트 구성 파일 -->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Maven POM 파일의 버전 정보 -->
<modelVersion>4.0.0</modelVersion>
<!-- 프로젝트의 기본 정보 -->
<!-- 그룹 ID: 프로젝트 그룹 또는 조직을 식별하는 고유한 키 -->
<groupId>Yull's project</groupId>
<!-- 아티팩트 ID: 프로젝트의 고유 이름 또는 프로젝트 코드 -->
<artifactId>CCProject</artifactId>
<!-- 프로젝트의 현재 버전 정보 -->
<version>1.0-SNAPSHOT</version>
<!-- 프로젝트에서 사용하는 의존성 라이브러리 목록 -->
<dependencies>
<!-- org.json 라이브러리 의존성 정보 -->
<!-- 이 라이브러리를 통해 JSON 데이터를 처리. -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
<!-- 프로젝트에 필요한 추가 의존성을 이곳에 명시 -->
</dependencies>
</project>
이 기본적인 폼은 솔직하게 구글링으로 찾아와서 써줬다,.....
이게 있어야지 API가 구동한다는데 내가 이걸 어떻게 알수있는 방법도 없었단말이다!!!!!
이제 진짜 어려울거같은 클래스를 구현해보도록하자구
여기는 천천히 하나하나 뜯어보면서 설정을 해보자
// 환율 정보를 가져올 API의 URL
private static final String API_URL = "https://quotation-api-cdn.dunamu.com/v1/forex/recent?codes=FRX.KRWUSD";
우선 환율정보를 가져올 거를 설정해주고!
public static String fetchUSDDate() {
JSONObject jsonObject = fetchJSONObject();
return jsonObject.getString("date");
}
// API로부터 USD의 시간 정보를 가져오는 메서드
public static String fetchUSDTime() {
JSONObject jsonObject = fetchJSONObject();
return jsonObject.getString("time");
}
// API로부터 USD의 환율 정보를 가져오는 메서드
public static double fetchUSDKRW() {
JSONObject jsonObject = fetchJSONObject();
return jsonObject.getDouble("basePrice");
}
내가 원하는것들을 가져와야하니까 매서드들도 설정을 해준다!
이제 아래부터가 가장 어려웠는데
// API로부터 JSON 객체를 가져오는 private 메서드
// 모든 다른 메서드(fetchUSDDate, fetchUSDTime, fetchUSDKRW)는 이 메서드를 사용하여 필요한 정보를 추출
private static JSONObject fetchJSONObject() {
try {
// API의 URL을 연다
URL url = new URL(API_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// GET 요청을 사용하여 API에 연결
connection.setRequestMethod("GET");
// API 응답을 읽는 BufferedReader 객체를 생성
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
// API 응답을 한 줄씩 읽어서 content StringBuilder 객체에 추가
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
// 스트림을 닫는다
in.close();
// API 응답을 JSONArray로 변환
JSONArray jsonArray = new JSONArray(content.toString());
// 첫 번째 JSON 객체를 반환 (환율 정보는 첫 번째 JSON 객체에 포함되어 있음)
return jsonArray.getJSONObject(0);
} catch (Exception e) {
// 예외가 발생하면 스택 트레이스를 출력하고 null을 반환
e.printStackTrace();
return null;
}
각각의 주석으로 설명을 달아놨지만 요약하자만 API의 정보를 끌어와서 내가 사용할수있게끔 바꿔주는 작업을 한것이다.
이렇게 까지 했으면 뭘해야하겠는가!!!당연히!!!!!!!활용하기 위한 인터페이스도 만들어야하지 않겠는가?????
CurrencyCalculator
클래스import java.text.DecimalFormat;
import java.util.Scanner;
public class CurrencyCalculator {
// 현재 환율을 저장하는 변수
private static double KRW_RATE;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
// API로부터 실시간 USD -> KRW 환율 정보를 가져옴
KRW_RATE = APIFetcher.fetchUSDKRW();
// API로부터 현재 날짜 정보를 가져옴
String currentDate = APIFetcher.fetchUSDDate();
// API로부터 현재 시간 정보를 가져옴
String currentTime = APIFetcher.fetchUSDTime();
// 메인 메뉴 출력
System.out.println("------------------ 환율 계산기 ------------------");
System.out.println("현재 날짜와 시간: " + currentDate + " " + currentTime);
System.out.println("현재 USD -> KRW 환율: " + KRW_RATE);
System.out.println("1. 환율 계산하기");
System.out.println("2. 종료하기");
System.out.print("\n원하시는 메뉴 번호를 선택해주세요: ");
int choice = scanner.nextInt();
scanner.nextLine();
switch (choice) {
case 1: // 환율 계산 메뉴 선택 시
calculateCurrency(scanner);
break;
case 2: // 종료 메뉴 선택 시
System.out.println("환율 계산기를 종료합니다.");
return;
default: // 잘못된 메뉴 번호 입력 시
System.out.println("잘못된 선택입니다. 다시 선택해주세요.");
break;
}
}
}
// 환율 계산 메서드
private static void calculateCurrency(Scanner scanner) {
System.out.println("1. 한국 (KRW)");
System.out.print("수취 국가를 선택해주세요: ");
int countryChoice = scanner.nextInt();
System.out.print("송금액(USD)를 입력하세요: ");
double amount = scanner.nextDouble();
double result = 0;
switch (countryChoice) {
case 1: // 한국 선택 시 USD -> KRW 환율 적용
result = amount * KRW_RATE;
break;
default: // 잘못된 국가 선택 시
System.out.println("잘못된 선택입니다.");
return;
}
// 결과를 콤마와 소수점 두 자리까지 표시하는 형식으로 변환
DecimalFormat formatter = new DecimalFormat("#,##0.00");
System.out.println("변환된 금액은 | ₩ " + formatter.format(result) + " | 입니다.");
}
}
인터페이스는 이렇다 저렇다 할 설명보다는 그냥 한번읽어보면 이해가 가는부분이 대부분일것이다!!!!
좋아 이거 공부하면서 작성하니까 어머어마하게 걸리는구만 시간!!!
대신 나의 것으로 체득하는게 훨씬 중요한거 같으니까 천천히 해봐야지!!!!!
문제 설명
길이가 같은 두 문자열 str1과 str2가 주어집니다.
두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요.
제한사항
1 ≤ str1의 길이 = str2의 길이 ≤ 10
str1과 str2는 알파벳 소문자로 이루어진 문자열입니다.
StringBuilder result = new StringBuilder();
for (int i = 0; i < str1.length(); i++) {
result.append(str1.charAt(i));
result.append(str2.charAt(i));
}
return result.toString();
}
이게 문제가 한번씩 Lv.0인데도 터무니없이 어려울때가있고 꽤나 쉬울때가 있는데
이 문제는 꽤나 쉬운문제였다!
문자열을 받아서 for문으로 돌려가면서 섞어주기만 하면 되는 너무나 간단한 문제가 이렇게 되었다고한다!!!!
이런거 하나하나가 쌓이면서 내가 학습하는것이 되는거니까!
어느정도 팀프로젝트가 마무리되어버리고 하니 조금 마음이 뜨는경향이있지만
아직 모르는부분의 강의들이 가득하고 세상은 넓고 내가 모르는 지식은 많으니 정진해야지
내 목표는 프로젝트를 끝내는게 아니라 취업 또 더 나아가 스스로 학습에 잘 나아가는 개발자이니까
느리지만 꾸준한 거북이가 될 것이라고 마음먹었을때부터 내게 남은건 꾸준함 뿐이였음을 기억하며 오늘 배운내용 또한 잘 생각해두며 나아가자!