어제 마지막 코드
package study.java.helper;
/*
기본적인 공통 기능들을 묶어놓은 클래스
이 클래스는 싱글톤 패턴을 사용하여 인스턴스를 하나만 생성하고, 랜덤 값을 생성하는 메서드를 제공합니다.
*/
public class Util {
// -----------------싱글톤 객체 생성 시작---------------------
// 클래스 내부에서 유일한 인스턴스를 저장할 변수
private static Util instance;
/**
* 싱글톤 패턴을 통해 유일한 인스턴스를 반환하는 메서드
* @return Util 클래스의 유일한 인스턴스
*/
public static Util getInstance() {
// 인스턴스가 존재하지 않는 경우 새로 생성
if (instance == null) {
instance = new Util();
}
return instance;
}
/**
* 싱글톤 인스턴스를 해제하는 메서드
* 인스턴스를 `null`로 설정하여 메모리에서 제거
*/
public static void freeInstance() {
instance = null;
}
// private 생성자 - 외부에서 인스턴스를 생성할 수 없도록 제한
private Util() {
super();
}
// 싱글톤 객체 생성 끝--------------
/**
* 범위를 갖는 랜덤값을 생성하여 리턴하는 메서드
* @param min - 범위의 최소값
* @param max - 범위의 최대값
* @return min과 max 사이의 랜덤 정수 값
*/
public int random(int min, int max) {
// 범위 내에서 랜덤 정수 생성
int num1 = (int)((Math.random() * (max - min + 1)) + min);
return num1;
}
}
내가 한 <main 메서드>
package math;
import study.java.helper.Util;
/**
Main01 클래스는 Util 클래스의 싱글톤 인스턴스를 사용하여
5자리의 랜덤 인증번호를 생성하고 출력하는 기능을 합니다.
*/
public class Main01 {
public static void main(String[] args) {
// Util 클래스의 싱글톤 인스턴스를 가져옵니다.
Util ut = Util.getInstance();
// 5자리 인증번호 생성 및 출력
System.out.println("인증번호 = " + ut.random(10000, 99999));
}
}
강사님이 한 <main 메서드>
package math;
import study.java.helper.Util;
public class Main02 {
public static void main(String[] args) {
String authNum = "";
for(int i =0; i<5; i++) {
authNum += Util.getInstance().random(0, 9);
}
System.out.println("인증번호 = "+ authNum);
}
}
package string;
public class Main01 {
public static void main(String[] args) {
// 문자열 선언
String str1 = "자바 Programming";
String str2 = new String("Java");
// 문자열 출력
System.out.println("str1 : " + str1);
System.out.println("str2 : " + str2);
System.out.println();
// 1. 문자열 길이를 조회
int str1_len = str1.length(); // str1의 길이를 가져옴
int str2_len = str2.length(); // str2의 길이를 가져옴
System.out.println("str1_len : " + str1_len);
System.out.println("str2_len : " + str2_len);
System.out.println();
// 2. 특정 문자열이 처음으로 나타나는 위치를 조회
int str1_pos = str1.indexOf(" "); // str1에서 첫 번째 공백의 위치를 찾음
int str2_pos = str2.indexOf("a"); // str2에서 첫 번째 'a'의 위치를 찾음
System.out.println("str1_pos : " + str1_pos);
System.out.println("str2_pos : " + str2_pos);
System.out.println();
// 3. 특정 문자열이 나타나는 마지막 위치를 조회
int str1_last_pos = str1.lastIndexOf(" "); // str1에서 마지막 공백의 위치를 찾음
int str2_last_pos = str2.lastIndexOf("a"); // str2에서 마지막 'a'의 위치를 찾음
System.out.println("str1_last_pos : " + str1_last_pos);
System.out.println("str2_last_pos : " + str2_last_pos);
System.out.println();
// 4. 문자열의 특정 문자를 다른 문자로 변경
String new_str1 = str1.replace(" ", "-"); // str1의 모든 공백을 하이픈으로 변경
String new_str2 = str2.replace("a", "A"); // str2의 모든 'a'를 'A'로 변경
System.out.println("new_str1 : " + new_str1);
System.out.println("new_str2 : " + new_str2);
System.out.println();
// 5. 대소문자 변경
String upper = new_str2.toUpperCase(); // new_str2의 모든 문자를 대문자로 변환
String lower = new_str2.toLowerCase(); // new_str2의 모든 문자를 소문자로 변환
System.out.println("upper : " + upper);
System.out.println("lower : " + lower);
System.out.println();
// 6. 문자열의 앞뒤 공백 제거
String input = " enjoy java programming "; // 앞뒤에 공백이 포함된 문자열
String output = input.trim(); // 문자열의 앞뒤 공백을 제거
String output2 = input.replace(" ", ""); // 모든 공백을 제거
System.out.println("input : " + input);
System.out.println("output : " + output);
System.out.println("output2 : " + output2);
System.out.println();
// 7. 문자열 비교
boolean isSame = str1.equals(str2); // str1과 str2가 동일한지 비교
if (isSame) {
System.out.println("같다!"); // 두 문자열이 동일할 경우
} else {
System.out.println("다르다!"); // 두 문자열이 다를 경우
}
System.out.println();
// 8. 문자열 자르기
// - 첫 번째 파라미터 : 시작 위치
// - 두 번째 파라미터 : 끝 위치 (끝 위치 전까지 자름)
// 두 번째 파라미터가 없는 경우 끝까지 자름
System.out.println(str1);
String sub_str1 = str1.substring(0, 2); // str1의 0번째부터 2번째 전까지 자름
System.out.println("sub_str1 : " + sub_str1);
String sub_str2 = str1.substring(3); // str1의 3번째부터 끝까지 자름
System.out.println("sub_str2 : " + sub_str2);
System.out.println();
// 9. 형식에 따른 문자열 출력을 위한 static 메서드 사용
/*
* - %d : 정수
* - %s : 문자열
* - %f : float형 소수
* - %3d : 숫자를 3자리로 맞춰서 출력 (자릿수가 부족하면 앞에 공백 추가)
* - %03d: 자릿수가 부족하면 0으로 채움
* - %3s : 문자열을 3자리로 맞춰서 출력 (자릿수가 부족하면 앞에 공백 추가)
* (%03s와 같은 형식은 사용 불가)
*/
int yy = 2024;
int mm = 7;
int dd = 4;
String gender = "남자";
// format의 갯수와 맞게 변수 입력해야 오류가 발생하지 않음
String result = String.format("%d년 %02d월 %02d일 %s", yy, mm, dd, gender);
System.out.println(result);
System.out.println();
// 10. 주어진 글자를 기준으로 잘라내어서 배열로 변환
String src = "Java/DBMS/JSP/SpringBoot/React"; // 슬래시('/')를 기준으로 문자열을 나눔
String[] data = src.split("/"); // '/'를 기준으로 문자열을 나누어 배열로 저장
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]); // 배열의 각 요소를 출력
}
}
}
str1과 str2 문자열을 선언하고, 이를 출력합니다.
str1과 str2의 길이를 조회하고 출력합니다.
특정 문자열이 처음으로 나타나는 위치를 조회하고 출력합니다.
문자열의 특정 문자를 다른 문자로 변경하고 출력합니다.
문자열을 대문자 및 소문자로 변환하고 출력합니다.
문자열의 앞뒤 공백을 제거하고, 모든 공백을 제거한 결과를 출력합니다.
두 문자열이 동일한지 비교하고 결과를 출력합니다.
문자열의 특정 부분을 자르고 출력합니다. substring 메서드를 사용하여 문자열을 자릅니다.
String.format 메서드를 사용하여 지정된 형식에 맞게 문자열을 출력합니다.
주어진 구분자를 기준으로 문자열을 나누어 배열로 저장하고, 배열의 각 요소를 출력합니다.
문제1.
package string;
public class Main02 {
public static void main(String[] args) {
// 이메일 주소에서 아이디와 도메인을 구별
// split 사용 금지
// student@java.com -> 변수로 선언
// 아이디 : student
// 도메인 : java.com
// 각각 출력
String email = "student55555555@java.com";
// "@"가 나타나는 위치
int i = email.indexOf("@");
// 처음부터 "@"가 나타나는 위치까지 자르기 -> 아이디
String iD = email.substring(0,i);
// "@"가 나타나는 위치 다음부터 끝까지 자르기 ->도메인
String domain = email.substring(i+1);
System.out.println("아이디 : " + iD );
System.out.println("도메인 : " + domain );
}
}
문제2.
package string;
public class Main03 {
public static void main(String[] args) {
/*
* 주민등록번호에서 생년월일과 성별을 추출합니다.
* 예를 들어, "0005033234567" -> 2000년 05월 03일 남자
* - 태어난 년도 판별: 1 또는 2는 1900년대, 3 또는 4는 2000년대
* - 성별 판별: 1 또는 3은 남자, 2 또는 4는 여자
*/
String num = "0005033234567"; // 예시 주민등록번호
// 주민등록번호를 년, 월, 일 단위로 각각 두 글자씩 자릅니다.
String yy = num.substring(0, 2); // 년도(뒤의 두 자리)
String mm = num.substring(2, 4); // 월(두 자리)
String dd = num.substring(4, 6); // 일(두 자리)
// 주민등록번호의 뒷부분 첫 번째 글자는 성별 코드입니다.
String gender_code = num.substring(6, 7); // 성별 코드(한 자리)
// 태어난 년도를 판별합니다.
if (gender_code.equals("1") || gender_code.equals("2")) {
yy = "19" + yy; // 1900년대 태어난 경우
} else {
yy = "20" + yy; // 2000년대 태어난 경우
}
// 기본 성별은 남자로 설정합니다.
String gender = "남자";
if (gender_code.equals("2") || gender_code.equals("4")) {
gender = "여자"; // 성별 코드가 2 또는 4일 경우 여자
}
// 형식에 맞춘 생년월일과 성별을 출력합니다.
// printf 메서드를 사용하여 포맷에 맞게 출력합니다.
System.out.printf("%s년 %s월 %s일 %s", yy, mm, dd, gender);
}
}
설명 :
주민등록번호에서 생년월일과 성별을 추출하는 방법과 판별 로직에 대한 설명을 포함합니다.
substring 메서드를 사용하여 주민등록번호에서 년도, 월, 일을 추출합니다.
주민등록번호의 뒷부분에서 성별 코드를 추출합니다.
성별 코드를 사용하여 태어난 년도를 1900년대 또는 2000년대로 판별하고, 적절한 연도로 수정합니다.
성별 코드를 사용하여 기본 성별을 남자로 설정한 후, 성별 코드에 따라 여자 또는 남자로 수정합니다.
printf 메서드를 사용하여 생년월일과 성별을 지정된 형식으로 출력합니다.
문제3.
package string;
public class Main04 {
public static void main(String[] args) {
// 기본 자료형을 선언
int a = 1; // 정수형 변수
float b = 3.14f; // 실수형(float) 변수
boolean c = true; // 불리언(boolean) 변수
double d = 123.4567; // 실수형(double) 변수
long e = 123456789123L; // 정수형(long) 변수
/*
* static 메서드 valueOf
* --------------------
* 기본 데이터형을 String 객체로 변환해 주는 메서드
* 다양한 자료형에 대하여 오버로드 되어 있다.
* - int, float, boolean, double, long 등 기본 타입들을 String으로 변환 가능
*/
// 기본 자료형을 문자열로 변환
String str1 = String.valueOf(a); // int를 String으로 변환
String str2 = String.valueOf(b); // float를 String으로 변환
String str3 = String.valueOf(c); // boolean을 String으로 변환
String str4 = String.valueOf(d); // double을 String으로 변환
// 문자열로 변환하는 가장 손쉬운 방법은 빈 문자열("")을 더하는 것
String str5 = "" + e; // long을 String으로 변환
// instanceof를 사용하여 변환된 값이 String인지 확인
System.out.println(str1 instanceof String); // true
System.out.println(str2 instanceof String); // true
System.out.println(str3 instanceof String); // true
System.out.println(str4 instanceof String); // true
System.out.println(str5 instanceof String); // true
}
}
설명 :
int, float, boolean, double, long 등의 기본 자료형을 선언합니다.
String.valueOf() 메서드를 사용하여 각 기본 자료형 변수를 String 객체로 변환합니다. 이 메서드는 다양한 자료형에 대해 오버로드되어 있으며, 각 기본 타입을 문자열로 쉽게 변환할 수 있습니다.
기본 자료형을 문자열로 변환하는 또 다른 방법은 해당 변수에 빈 문자열 ""을 더하는 것입니다. 이 방법은 간단하고 직관적입니다.
instanceof 연산자를 사용하여 변환된 객체가 실제로 String 타입인지 확인하고 결과를 출력합니다. 변환된 모든 변수는 String 타입이므로 true가 출력됩니다.
문제4.
package string;
public class Main05_1 {
/*
D:/photo/2024/travel/food.jpg 라는 파일이 있다.
이 파일의 경로를 data라는 객체로 생성한 뒤에 다음의 형태로 출력한다.
*
파일 이름 : food
확장자 : jpg
폴더명 : D:/photo/2024/travel
/
public static void main(String[] args) {
// 파일 경로를 나타내는 문자열 변수 생성
String data = "D:/photo/2024/travel/food.jpg";
// 파일 이름 추출
// 마지막 슬래시 이후부터 마지막 점(.) 이전까지의 문자열을 추출
String name = data.substring(data.lastIndexOf("/") + 1, data.lastIndexOf("."));
System.out.println("파일이름 : " + name); // "food" 출력
// 확장자 추출
// 마지막 점(.) 이후의 문자열을 추출
String ext = data.substring(data.lastIndexOf(".") + 1);
System.out.println("확장자 : " + ext); // "jpg" 출력
// 소스 파일의 폴더 이름 추출
// 문자열의 시작부터 마지막 슬래시 이전까지의 문자열을 추출
System.out.println("폴더명 : " + data.substring(0, data.lastIndexOf("/"))); // "D:/photo/2024/travel" 출력
}
}
설명 :
파일 경로를 나타내는 문자열 data를 생성합니다. 이 문자열은 파일의 전체 경로를 포함하고 있습니다.
substring 메서드를 사용하여 마지막 슬래시(/) 이후부터 마지막 점(.) 이전까지의 문자열을 추출합니다. 이는 파일 이름을 추출하기 위한 방법입니다.
data.lastIndexOf("/") + 1는 슬래시 이후의 첫 번째 문자 인덱스를 가져오며, data.lastIndexOf(".")는 확장자 앞까지의 문자열을 추출하는 끝 인덱스를 제공합니다.
substring 메서드를 사용하여 마지막 점(.) 이후의 문자열을 추출합니다. 이는 파일의 확장자를 얻기 위한 방법입니다.
data.lastIndexOf(".") + 1는 점 이후의 첫 번째 문자 인덱스를 의미하며, 이로부터 문자열의 끝까지의 부분 문자열을 가져옵니다.
substring 메서드를 사용하여 문자열의 시작부터 마지막 슬래시(/) 이전까지의 문자열을 추출합니다. 이는 파일이 포함된 폴더의 경로를 나타냅니다.
data.substring(0, data.lastIndexOf("/"))는 경로에서 폴더 이름을 추출하여 해당 위치까지의 문자열을 반환합니다.
<2>이스케이프 문자
package string;
public class Main06 {
public static void main(String[] args) {
/*
* 이스케이프 문자
* ---------------------------
* 프로그램의 문자열 안에 포함될 수 있는 특수 문자
* 예를 들어, 문자열 안에서 쌍따옴표를 표현하고자 하는 경우 사용합니다.
*/
String src = "JAVA";
// 문자열 안에 쌍따옴표 포함시키기
// \”는 문자열 안에 쌍따옴표를 넣기 위한 이스케이프 문자입니다.
// 결과: "JAVA"
System.out.println("\"" + src + "\"");
System.out.println("-------------------");
// 문자열 안에 홑따옴표 포함시키기
// \'는 문자열 안에 홑따옴표를 넣기 위한 이스케이프 문자입니다.
// 결과: 'JAVA'
System.out.println("\'" + src + "\'");
System.out.println("----------------------");
// 줄바꿈 문자
// \n은 줄바꿈을 위한 이스케이프 문자입니다. 문자열 다음 줄로 이동합니다.
// 결과: 줄바꿈 후 JAVA 출력
System.out.println("\n" + src);
System.out.println("-------------------");
// 탭키에 해당하는 문자
// \t는 탭을 위한 이스케이프 문자입니다. 문자열 앞에 일정한 공백을 삽입합니다.
// 결과: 탭 후 JAVA 출력
System.out.println("\t" + src);
}
}
이스케이프 문자: 문자열 리터럴 내에서 특수 문자를 표현하기 위해 사용됩니다. 예를 들어, 쌍따옴표(")를 문자열에 포함시키려면 \"로 표시합니다. 이스케이프 문자는 특정 문자가 문자 그대로 출력되도록 합니다.
\": 문자열 내에 쌍따옴표를 포함시키는 데 사용됩니다. 출력된 결과는 JAVA라는 문자열이 쌍따옴표로 감싸진 형태입니다.
\': 문자열 내에 홑따옴표를 포함시키는 데 사용됩니다. 출력된 결과는 JAVA라는 문자열이 홑따옴표로 감싸진 형태입니다.
\n: 줄바꿈 문자를 나타냅니다. 이 문자가 포함된 문자열은 줄이 바뀌어 출력됩니다.
\t: 탭 문자를 나타냅니다. 이 문자가 포함된 문자열은 탭만큼의 공백이 추가되어 출력됩니다.