[복습]
- jar : 압축
- 패키지
- 클래스
- 패키지
- 내장 라이브러리
- Oracle
- java.lang 패키지
- import(x)
- Object
- toString()
- equal()
- String Buffer/ String/ StringBuilder
- Math
- Wrapper
- 형변환
- Integer.parseInt
- Double.parserDouble
- Auto Boxing / UnBoxing
- 기본자료형 <->참조 객체화 개념
- 형변환
- java.lang 패키지
- Oracle
[오늘 내용 정리]
- 시간, 날짜 관련 => 달력
- 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 (내용 비교)
'Backend > Java' 카테고리의 다른 글
| [Java]Java IO(Exception/throw/File/스트림) (0) | 2024.10.24 |
|---|---|
| [Java] Collection (2) | 2024.10.23 |
| [java]java.lang 패키지 (0) | 2024.10.21 |
| [java]상속/은닉/다형성/추상클래스/interface (1) | 2024.10.18 |
| [java]객체 문법, 기본 자료형, 상속성, 은닉성 (1) | 2024.10.17 |