Backend/Java

[java] System/Data/Calendar/Random/Array 클래스

해로몬 2024. 10. 22. 17:35

[복습]

  • jar : 압축
    • 패키지
      • 클래스
  • 내장 라이브러리
    • Oracle
      • java.lang 패키지
        • import(x)
        • Object
          • toString()
          • equal()
          • String Buffer/ String/ StringBuilder
          • Math
          • Wrapper
            • 형변환
              • Integer.parseInt
              • Double.parserDouble
              • Auto Boxing / UnBoxing
                • 기본자료형 <->참조 객체화 개념

[오늘 내용 정리]

  • 시간, 날짜 관련 => 달력
    • Date / Calendar
  • 문자열
    • StringTokenizer      => split
    • StringJoiner            => join
  • 난수
    • Random                  =>Math.random()

 


is-a(상속)관계와 has-a(구성)관계

[is -a]

  • 객체 간의 관계를 설명 : 상속과 구성을 구분하는 데 사용
  • 재사용성, 구조 설계, 계층 구조를 정의하는 데 매우 중요
  • 특징
    • 상속을 이용해 하위 클래스가 상위 클래스의 속성과 행동을 물려받음.
    • 하위 클래스는 상위 클래스의 모든 동작과 속성을 재사용하거나 오버라이딩 함.
    • 하위 클래스 상위 클래스의 특수한 유형
class Animal {
    void eat() {
        System.out.println("This animal is eating.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("The dog is barking.");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.eat();  // 상위 클래스인 Animal의 메서드 사용
        dog.bark(); // Dog 클래스의 메서드 사용
    }
}
//비유 a는 b의 일종이다 -> a is a b

[has-a]

  • 한 클래스가 다른 클래스의 객체를 포함하는 관계의미
  • 한 객체가 다른 객체를 소유하거나 구성 요소로 포함
  • 특징
    • 클래스 a가 클래스 b의 인스턴스를 속성으로 가짐.
    • 포함된 클래스의 동작을 사용 but 상속관계❌
    • 클래스 간의 협력
class Engine {
    void start() {
        System.out.println("Engine started.");
    }
}

class Car {
    private Engine engine;  // Car 클래스가 Engine 객체를 가짐 (has-a 관계)

    Car() {
        engine = new Engine();  // Car 생성자에서 Engine 인스턴스 생성
    }

    void drive() {
        engine.start();  // Engine 객체의 메서드를 호출
        System.out.println("Car is driving.");
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.drive();  // Engine이 포함된 Car가 작동
    }
}
//비유 a는 b를 가지고 있다 -> a has a b
특징 is-a 관계(상속) has-a관계(구성)
관계의 의미 하위 클래스는 상위 클래스의 일종 한 클래스가 다른 클래스의 구성요소를 포함
구현 방법 상속 구성
목적 상위 클래스의 동작을 상속 -> 재사용 및 확장 기능 분리 및 객체 협력을 통해 동작 구현
클래스 간 결합도 높음 낮음
의존성 하위 클래스는 상위 클래스에 강하게 의존 덜 의존적
주로 사용 되는 예 클래스 계층에서 공통 동작을 상속받아 확장할 때 특정 클래스가 다른 클래스의 기능을 사용할 때
  Dog is a Animal
Car is a Vehicle
Car has a Engine
Computer has aProcessor

 

[Java.Lang.System Class]

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/System.html

1. 입출력 (Input/Output)

1) System.out

  • System.out은 표준 출력 스트림을 가리킵니다. 주로 콘솔에 출력할 때 사용
  • 가장 자주 사용하는 메서드: System.out.println()

2) System.in

  • System.in은 표준 입력 스트림을 가리킵니다. 주로 키보드 입력을 처리할 때 사용
  • 입문자들이 자주 사용하는 방식은 Scanner 클래스와 함께 사용하는 것

3) System.err

  • System.err는 표준 에러 스트림을 가리킵니다. 에러 메시지를 출력할 때 사용
  • System.out과 같은 방식으로 콘솔에 출력하지만, 에러 처리에 주로 사용

 

2. 시스템 정보 및 종료

1) System.currentTimeMillis()

  • 이 메서드는 1970년 1월 1일 자정 이후 경과한 밀리초(ms)를 반환
  • 주로 성능 측정이나 시간 관련 작업을 할 때 사용
public class Main {
    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();  // 현재 시간 측정
        // 작업 실행
        long endTime = System.currentTimeMillis();
        System.out.println("Execution time: " + (endTime - startTime) + "ms");
    }
}


2) System.exit(int status)

  • 이 메서드는 프로그램을 종료합니다. status 값에 따라 종료 상태를 설정 가능
  • 프로그램이 종료될 때 JVM이 모든 리소스를 해제하고 종료
public class Main {
    public static void main(String[] args) {
        System.out.println("Program will exit now.");
        System.exit(0);  // 정상 종료
        System.out.println("This line will never be printed.");  // 출력되지 않음
    }
}

 

3. 환경 변수 및 시스템 속성

1) System.getenv(String name)

  • 이 메서드는 운영체제의 환경 변수를 반환
  • 예를 들어, PATH, JAVA_HOME 같은 환경 변수 값을 얻을 수 있음.
public class Main {
    public static void main(String[] args) {
        String path = System.getenv("PATH");
        System.out.println("PATH: " + path);  // 시스템의 PATH 변수 값 출력
    }
}


2) System.getProperty(String key)

  • 시스템의 속성을 반환 (자바 버전, 운영체제 종류, 파일 경로 구분자 등)

ProcessBuilder

ProcessBuilder를 사용하여 자바에서 텍스트 에디터를 실행 (Mac)

import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        // 텍스트 파일 경로를 지정
        String filePath = "/Users/username/Documents/myfile.txt";

        // ProcessBuilder를 통해 TextEdit 실행
        ProcessBuilder processBuilder = new ProcessBuilder("open", "-a", "TextEdit", filePath);

        try {
            // 프로세스 실행
            Process process = processBuilder.start();
            process.waitFor();  // 프로세스가 종료될 때까지 대기
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

[java.util.Data 와 Calendar]

1.Data 클래스 : 날짜와 시간을 표현. (날짜와 시간을 밀리초 단위로 저장)

2. Date 객체 생성 방법

1) 현재 날짜와 시간 생성

import java.util.Date;
//Date 객체를 생성하면 현재 시스템의 날짜와 시간을 반환
public class Main {
    public static void main(String[] args) {
        Date currentDate = new Date();  // 현재 날짜와 시간
        System.out.println(currentDate);
    }
}

2) 지정된 시간으로 날짜 객체 생성

        // 생성
        Date date3 = new Date(2024-1900, 10-1, 0);
        // date를 0으로 주게 된다면? 이전 달의 마지막 날이 출력
        System.out.println(date3.toLocaleString());

 

3. Date 클래스의 주요 메서드

1) getTime()

Date currentDate = new Date();
long timeInMillis = currentDate.getTime();  // 현재 시간의 밀리초
System.out.println(timeInMillis);


3. Date 클래스 사용 시 주의점
Date 클래스는 시간이 지나면서 설계의 문제점API의 혼란으로 인해 몇 가지 단점이 있습니다.

  • 월(Month) 값의 혼란: getMonth() 메서드는 0부터 11까지의 값을 반환하여, 0은 1월, 11은 12월을 나타냅니다. 
  • 연도 값의 혼란: getYear() 메서드는 1900년을 기준으로 한 연도를 반환합니다. 예를 들어, getYear()가 121을 반환하면 이는 2021년을 의미합니다.
  • Date 클래스는 불변하지 않음: Date 객체는 변경 가능(mutable)하므로, 동일한 객체를 여러 곳에서 참조할 경우 문제가 발생할 수 있습니다.
  • 부족한 시간대 지원
  • 오래된 설계로 인해 많은 메서드가 Deprecated되었습니다.,

[java.util.Calendar 클래스]

 

1. Calendar 클래스의 기본 개념

  • 추상 클래스이기 때문에 직접 객체를 생성할 수 없으며, getInstance() 메서드를 사용하여 하위 클래스의 인스턴스를 얻습니다.
  • 날짜와 시간을 필드 단위로 조작할 수 있으며, 연도, 월, 일, 시, 분, 초 등 개별적으로 설정하거나 가져올 수 있습니다.
import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();  // 현재 날짜와 시간 가져오기

        int year = calendar.get(Calendar.YEAR);      // 연도 가져오기
        int month = calendar.get(Calendar.MONTH);    // 월 가져오기 (0부터 시작)
        int day = calendar.get(Calendar.DAY_OF_MONTH); // 일 가져오기
        int hour = calendar.get(Calendar.HOUR_OF_DAY); // 시간 가져오기 (24시간 형식)
        int minute = calendar.get(Calendar.MINUTE);  // 분 가져오기

        System.out.println("Year: " + year);
        System.out.println("Month: " + (month + 1));  // 월은 0부터 시작하므로 1을 더해줌
        System.out.println("Day: " + day);
        System.out.println("Hour: " + hour);
        System.out.println("Minute: " + minute);
    }
}

 

2. Calendar의 상수 필드

  • Calendar.YEAR: 연도
  • Calendar.MONTH: 월 (0 ~ 11: 0 = 1월, 11 = 12월)
  • Calendar.DAY_OF_MONTH: 일
  • Calendar.HOUR: 12시간 형식의 시간
  • Calendar.HOUR_OF_DAY: 24시간 형식의 시간
  • Calendar.MINUTE: 분
  • Calendar.SECOND: 초
  • Calendar.MILLISECOND: 밀리초


3. Calendar 클래스의 메서드

1) 날짜/시간 필드 설정
Calendar 객체는 특정 날짜나 시간으로 설정할 수 있습니다. set() 메서드를 사용해 연도, 월, 일 등을 직접 설정합니다.

  • set(int field, int value): 특정 필드를 설정합니다. 예를 들어, 연도, 월, 일, 시간을 설정할 수 있습니다.
  • 월 설정 시 주의: **Calendar.MONTH**는 0부터 시작하므로, 12월은 Calendar.DECEMBER 또는 11로 설정해야 합니다.


2) 날짜/시간 더하기
날짜나 시간을 더하거나 빼는 기능은 add() 메서드를 통해 제공합니다.

  • add(int field, int amount)
  • 월말이나 연도 말 등의 경계를 넘는 경우도 자동으로 계산됩니다.
import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

        // 날짜를 2024년 12월 25일로 설정
        calendar.set(Calendar.YEAR, 2024);
        calendar.set(Calendar.MONTH, Calendar.DECEMBER);  // 11 = 12월
        calendar.set(Calendar.DAY_OF_MONTH, 25);

        System.out.println(calendar.getTime());  // 설정된 날짜 출력
    }
}

 

import java.util.Calendar;

public class Main {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();

        // 현재 날짜에서 10일 더하기
        calendar.add(Calendar.DAY_OF_MONTH, 10);
        System.out.println("10일 후: " + calendar.getTime());

        // 현재 날짜에서 2개월 빼기
        calendar.add(Calendar.MONTH, -2);
        System.out.println("2개월 전: " + calendar.getTime());
    }
}


3) 날짜 비교
Calendar 객체의 날짜를 비교할 때는 before(), after() 등의 메서드를 사용할 수 있습니다.

  • before(Calendar when): 해당 날짜가 인자로 전달된 날짜보다 이전인지 확인합니다.
  • after(Calendar when): 해당 날짜가 인자로 전달된 날짜보다 이후인지 확인합니다.
Calendar calendar1 = Calendar.getInstance();
Calendar calendar2 = Calendar.getInstance();

// 5일 후 날짜 설정
calendar2.add(Calendar.DAY_OF_MONTH, 5);

System.out.println(calendar1.before(calendar2));  // true (현재 날짜는 5일 후보다 이전)
System.out.println(calendar1.after(calendar2));   // false (현재 날짜는 5일 후보다 이후가 아님)

 

3. Calendar 클래스 사용시 주의할 점

  • 월 값이 0부터 시작하는 등 몇 가지 혼란스러운 부분이 있으며, 시간대 처리가 불편합니다.

[StringTokenizer와 String.split()]

  StringTokenzier String.split()
도입 시기 자바 1.0 자바 1.4
구분자 처리 개별 문자로 처리 정규 표현식 사용 가능
빈 토큰 처리 무시 빈 토큰을 포함
성능 더 빠름 약간 느림
기능 경량화 된 기본 문자열 분리 정규식을 지원하여 더 많은 기능 제공
대체 여부 권장 ❌ 권장

+ StringJoiner : 문자열을 연결

//  StringJoiner를 이용한 문자열 연결
        StringJoiner sj = new StringJoiner(",");
        sj.add("사과").add("수박").add("딸기").add("참외");
        System.out.println(sj.toString());  // 출력: 사과,수박,딸기,참외

[java.util.Random 클래스]

1. Random 클래스 사용법

Random 클래스는 정수, 실수, 불리언 등 다양한 난수를 생성.

난수 생성의 기본은 내부적으로 시드 값에 따라 의사난수를 생성한다는 점입니다. 시드를 지정하지 않으면 현재 시간에 기반한 시드 값이 사용됩니다.

2. Random 클래스 생성자

1) Random()

  • 기본 생성자로, 현재 시간을 바탕으로 시드 값을 자동으로 생성

2) Random(long seed)

  • 사용자가 지정한 시드 값을 사용하여 Random 객체를 생성합.

3. 주요 메서드

1) nextInt()

  • 랜덤한 정수를 생성. 파라미터 없이 호출하면 모든 범위의 정수를 반환, 파라미터를 전달하면 0부터 n-1까지의 범위에서 정수를 반환

2) nextInt(int bound)

  • 0부터 bound - 1 사이의 정수를 생성. bound 값을 지정하면 그 값보다 작은 정수를 생성

3) nextDouble()

  • 0.0 이상 1.0 미만실수(double) 값을 생성

4) nextBoolean()

  • 랜덤한 불리언(boolean) 값을 생성. 즉, true 또는 false 

4. 난수 시드(Seed)

Random 클래스에서 생성되는 난수는 시드 값에 따라 결정됩니다. 같은 시드 값을 사용하면 항상 같은 난수 시퀀스가 생성됩니다.

  • 시드 값이 없는 경우: 기본적으로 현재 시간을 기준으로 시드를 생성하여 매번 다른 난수가 생성됩니다.
  • 시드 값을 지정한 경우: 지정한 시드 값에 따라 동일한 난수 시퀀스가 반복해서 생성됩니다. 이를 통해 테스트나 디버깅 시 같은 랜덤한 결과를 얻고 싶을 때 유용하게 사용됩니다.

예시: 같은 시드 값으로 동일한 난수 생성

5. Random 클래스의 주의사항

  • 멀티스레드 환경에서 Random 클래스는 스레드 안전하지 않음. 만약 멀티스레드 환경에서 난수를 생성해야 한다면, ThreadLocalRandom 클래스를 사용하는 것이 더 적합합니다.
  • 동일한 시드 값을 여러 번 사용하면, 항상 같은 난수 시퀀스가 생성되므로 테스트와 디버깅에서 유용하지만, 실제 난수를 사용해야 하는 경우에는 시드를 사용하지 않거나 랜덤한 시드를 사용해야 합니다.

[java.util.Arrays]

: 배열을 다루기 위한 유틸리티 메서드 제공하는 클래스

  • toString() : 배열 출력
  • fill() : 배열 내용 채우기
  • sort() : 베열 오름차순으로 정렬
  • equals() :배열 비교
String[] arrs1 = {"a", "b", "c"};
String[] arrs2 = {"a", "b", "c"};
System.out.println(arrs1 == arrs2);  // 출력: false (참조값 비교)
System.out.println(Arrays.equals(arrs1, arrs2));  // 출력: true (내용 비교)