2024-07-24 DAY11

보히·2024년 7월 24일

어제 마지막 코드

  • 랜덤한 숫자 5자리 인증번호를 출력하는 코드

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);
}

}

  1. String 클래스

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.valueOf() 메서드를 사용하여 각 기본 자료형 변수를 String 객체로 변환합니다. 이 메서드는 다양한 자료형에 대해 오버로드되어 있으며, 각 기본 타입을 문자열로 쉽게 변환할 수 있습니다.

  • 빈 문자열을 더하여 변환:

기본 자료형을 문자열로 변환하는 또 다른 방법은 해당 변수에 빈 문자열 ""을 더하는 것입니다. 이 방법은 간단하고 직관적입니다.

  • instanceof를 사용한 확인:

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 객체):

파일 경로를 나타내는 문자열 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: 탭 문자를 나타냅니다. 이 문자가 포함된 문자열은 탭만큼의 공백이 추가되어 출력됩니다.

0개의 댓글