


package ch12.sec03.exam01;
public class Member {
public String id;
// 생성자
public Member(String id) {
this.id = id;
}
// Object 클래스의 equals 메소드 재정의
// Object 타입의 매개변수를 가짐
@Override
public boolean equals(Object obj) {
// Object 객체를 Member(현재 객체) 객체의 타입으로 변환이 가능하면 강제 형변환 실행
// Object는 모든 클래스의 부모와 같은 존재 : 변환이 가능
if(obj instanceof Member target) {
if(id.equals(target.id)) {
// id와 입력받은 문자열이 같은지!
return true;
}
}
return false;
}
}
package ch12.sec03.exam01;
public class EqualsExam {
public static void main(String[] args) {
Member obj1 = new Member("이동주");
Member obj2 = new Member("이동주");
Member obj3 = new Member("야호");
// equals : 문자열 동일 여부 확인
if(obj1.equals(obj2)) {
System.out.println("두 문자열 동일");
}
else {
System.out.println("두 문자열 동일하지 않음");
}
// equals : 문자열 동일 여부 확인
// obj1과 obj3의 문자열이 다름
if(obj1.equals(obj3)) {
System.out.println("두 문자열 동일");
}
else {
System.out.println("두 문자열 동일하지 않음");
}
}
}
package ch12.sec03.exam02;
import java.util.Objects;
public class Student {
private int no;
private String name;
// 생성자
public Student(int no, String name) {
this.no = no;
this.name = name;
}
// getNo() = no 필드 값
public int getNo() {
return no;
}
// getName() = name 필드 값
public String getName() {
return name;
}
// Object 객체의 hashCode() 메소드를 재정의
// 객체의 주소를 나타내는 코드
@Override
public int hashCode() {
int hashCode = no + name.hashCode();
// no에 입력된 필드와 name의 객체 번지(주소)를 더한 값
return hashCode;
}
// Object 객체의 equals() 메소드를 재정의함
@Override
public boolean equals(Object obj) {
// Object 타입을 Student 타입으로 변환 가능하면 target 참조변수에 저장
if(obj instanceof Student target) {
if(no == target.getNo() && name.equals(target.getName())) {
// no 필드값과 getNo의 값이 같거나, name 필드와 getName의 문자열이 같을 때
// 숫자와 문자열의 비교를 연산자로 처리할 때 숫자 연산자를 먼저 처리해줘야 함
return true;
}
}
return false;
}
}
package ch12.sec03.exam02;
public class HashCodeExample {
public static void main(String[] args) {
Student s1 = new Student(1, "홍길동");
Student s2 = new Student(1, "홍길동");
// 해시코드가 동일한지 (객체의 내부의 값이 같은지) 검사함 (숫자 형태로 반환되기 때문에 == 연산자 써줌)
if(s1.hashCode() == s2.hashCode()) {
// s1과 s2의 문자열이 같은지 검사
if(s1.equals(s2)) {
System.out.println("동등 객체입니다");
}
else {
System.out.println("데이터가 다르므로 동등 객체가 아닙니다");
}
}
else {
System.out.println("해시코드가 다르므로 동등 객체가 아닙니다.");
}
}
}
hashSet
package ch12.sec03.exam02;
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
// HashSet : 중복된 데이터를 저장하지 않음
Student s1 = new Student(1, "이동주");
hashSet.add(s1);
// .add : HashSet에 값을 추가해줌
System.out.println("저장된 객체 수: " + hashSet.size());
// .size : HashSet에 저장된 해당 값의 갯수를 반환함
Student s2 = new Student(1, "이동주");
hashSet.add(s2);
// s1과 같은 값이 들어갔기 때문에 중복 데이터가 저장이 되지 않는 HashSet 특성상
// 데이터가 저장되지 않음
System.out.println("저장된 객체 수: " + hashSet.size());
// 위의 값과 동일함
Student s3 = new Student(2, "이동주");
hashSet.add(s3);
// 동일한 값이 없으므로 HashSet에 값이 저장됨
System.out.println("저장된 객체 수: " + hashSet.size());
}
}
package ch12.sec03.exam03;
public class Dongju {
private String name;
private int age;
public Dongju(String name, int age) {
this.name = name;
this.age = age;
}
// String 클래스의 toString() 메소드를 재정의함
@Override
public String toString() {
return "이름: " + name + " 나이: " + age;
// 객체의 문자 정보를 리턴함
// 형태는 클래스명@16진수해시코드
// 해당 메소드를 사용함으로써 위와 같은 형태를 문자열로 반환함
}
}
package ch12.sec03.exam03;
public class ToStringExam {
public static void main(String[] args) {
Dongju dj = new Dongju("이동주", 26);
String strdj = dj.toString();
System.out.println(strdj);
System.out.println(dj);
}
}
package ch12.sec03.exam04;
public record Member(String id, String name, int age) {
// class 대신 record를 사용하며, 데이터를 읽는 용도로 사용
// getter와 개념이 비슷함
}
package ch12.sec03.exam04;
public class RecordExample {
public static void main(String[] args) {
Member m = new Member("dj", "이동주", 25);
// record 객체 생성도 객체 생성하는 방식과 똑같음
// 매개값을 .으로 나누어 메소드로 만듦
System.out.println(m.id()); // dj
System.out.println(m.name()); // 이동주
System.out.println(m.age()); // 25
System.out.println(m.toString());
// record에 저장된 모든 값을 합쳐서 문자열 형태로 필드명과 같이 출력
Member m1 = new Member("hong", "홍길동", 30);
Member m2 = new Member("hong", "홍길동", 30);
// 같은 매개값을 가지는 객체 2개를 생성
System.out.println("m1.hashCode(): " + m1.hashCode());
System.out.println("m2.hashCode(): " + m2.hashCode());
// m1과 m2의 해시코드를 출력, 두 객체의 값이 모두 같기 때문에
// 해시코드도 동일하게 나옴
System.out.println("m1.equals(m2): " + m1.equals(m2));
// m1과 m2의 매개값이 동일한지 여부를 확인
// 동일함
}
}
롬복 어노테이션
설치
package ch12.sec10;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String[] args) {
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
// \d : 숫자
// {a,b} : 길이(a자리 또는 b자리)
String data = "02-123-4567";
boolean result = Pattern.matches(regExp, data);
// Pattern.matches : 정규 표현식 (전화번호나 이메일 등을 주로 사용)
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
// chatgpt로 만들기!! ㅋ
regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
// \w : 영문자, 숫자 포함
// + : 한 개 이상
// . : .이 있음
// ? : 없어도 있어도 됨
data = "angel@mycompanycom";
result = Pattern.matches(regExp, data);
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
}
}
package ch12.sec03.exam05;
public class LombokExam {
public static void main(String[] args) {
Member m1 = new Member();
System.out.println(m1);
// 생성자에 아무 값도 넣지 않았기 때문에 모두 null 값이 나옴
Member m2 = new Member("dj", "이동주", 26);
System.out.println(m2);
// 생성자에 매개값을 타입과 개수를 알맞게 넣어줬기 때문에
// 정상적으로 값이 나옴
System.out.println("id= " + m2.getId());
System.out.println("name= " + m2.getName());
System.out.println("age= " + m2.getAge());
// 매개값을 나누어 각각의 메소드로 생성하였음
// 따라서 get 메소드를 통해 값을 받아올 수 있음
Member m3 = Member.builder()
.id("djdj")
.name("이똥주")
.age(25).build();
// builder 메소드
// @Builder 어노테이션을 생성하면 자동적으로 만들어지는 메소드
// 메소드 내에 새로운 값을 넣어 객체를 다시 생성함
// 구조 : 클래스명.builder().매개변수1().매개변수2().build();
// 마지막에 build()를 넣어야 함
System.out.println(m3);
}
}

err
package ch12.sec04;
public class ErrExample {
public static void main(String[] args) {
try {
int value = Integer.parseInt("1oo");
}
catch(Exception e) {
System.err.println("에러 내용");
System.err.println(e.getMessage());
}
// err : 콘솔에 빨간 글씨 출력
}
}
exit()
package ch12.sec04;
public class ExitExam {
public static void main(String[] args) {
for(int i=0;i<10;i++) {
System.out.println(i);
if(i==5) {
System.out.println("프로세스 강제 종료");
System.exit(0);
// exit(0) : 정상 종료
// exit(1)/ exit(-1) : 비정상종료
}
}
}
}
GetProperty
package ch12.sec04;
public class GetPropertyExam {
public static void main(String[] args) {
int a = Integer.parseInt(System.getenv("DJ_A"));
int b = Integer.parseInt(System.getenv("DJ_B"));
// .getenv : 환경 변수 안의 값을 불러옴
// 환경변수 설정 후에는 eclipse를 재시작하기
System.out.println(a + b);
// System.getProperty : 운영체제 및 사용자 정보 출력 메소드
System.out.println(System.getProperty("os.name"));
// os.name : 운영체제 정보 출력
System.out.println(System.getProperty("user.name"));
// user.name : 사용자 계정 출력
System.out.println(System.getProperty("user.home"));
// user.home : 사용자 계정 경로 출력
}
}
nanoTime
package ch12.sec04;
public class MeasureRunExam {
public static void main(String[] args) {
long time1 = System.nanoTime();
int sum = 0;
for(int i=1;i<100000;i++) {
sum += i;
}
long time2 = System.nanoTime();
// .nanoTime() : 현재 시간을 나노초 단위로 표현
// 밀리초 단위인 .currentTimeMillis()를 사용할 수 있지만 정밀성이 떨어짐
System.out.println("합= " + sum);
System.out.println("계산하는데 소요된 시간(나노초)= " + (time2-time1));
}
}
package ch12.sec05;
import java.util.Arrays;
public class StringExam {
public static void main(String[] args) throws Exception{
// 예외는 던짐
String data = "자바";
// 문자열을 byte 타입의 배열로 변환
byte[] arr1 = data.getBytes();
// 문자열의 각 문자들을 하나의 byte형태의 숫자로 쪼개 배열의 형태로 표현
System.out.println(Arrays.toString(arr1));
// byte 타입의 배열에서 문자열로 변환 (UTF-8 인코딩)
String str1 = new String(arr1);
System.out.println(str1);
// 문자열을 byte 타입의 배열로 변환 (EUC-KR 인코딩)
byte[] arr2 = data.getBytes("EUC-KR");
// 문자열의 각 문자들을 하나의 byte형태의 숫자로 쪼개 배열의 형태로 표현
// EUC-KR로 인코딩할 때에는 getBytes 메소드에 반드시 "EUC-KR" 입력
System.out.println(Arrays.toString(arr2));
// utf-8보다 바이트수가 작기 때문에 출력 숫자도 적음
// byte 타입의 배열을 문자열로 변환 (EUC-KR 인코딩)
String str2 = new String(arr2, "EUC-KR");
// EUC-KR 인코딩의 경우 String 생성자 두 번째 인자에 "EUC-KR"를 넣어줘야함
System.out.println(str2);
// "EUC-KR"를 선언하지 않을 씨 문자가 깨짐
String str3 = new String(arr2);
System.out.println(str3);
}
}
package ch12.sec05;
public class StringBuilderExam {
public static void main(String[] args) {
// StringBuilder : 잦은 문자열 변경 작업을 위한 클래스
String data = new StringBuilder()
.append("나가라")
// append : 문자열을 끝에 추가함
.insert(0, "종신감독 이숭용 ")
// insert(a,b) : 문자열 b를 a번째에 삽입
.delete(0,5)
// delete(a,b) : a번째부터 b번째 앞까지의 문자열을 삭제
.toString();
// toString() : 위의 구문을 통해 조합한 문자열을 리턴함
System.out.println(data);
// 이숭용 나가라 (제발)
}
}

package ch12.sec05;
import java.util.StringTokenizer;
public class StringTokenizerExam {
public static void main(String[] args) {
String data1 = "SSG=LG/키움=kt/SSG=LG/키움=kt";
// split() : 해당 문자로 문자열을 구분지음
// = 또는 /의 문자로 구분
// 배열로만 문자열을 나누는 기능만 가지고 있음
String[] arr1 = data1.split("=|/");
for(String token : arr1) {
System.out.print(token + " ");
}
System.out.println();
String data2 = "SSG/LG/키움/kt/SSG/LG/키움/kt";
// StringTokenizer : split과 같이 문자열을 특정 문자로 나누는 역할을 함
// StringTokenizer(a,b) : 문자열 a를 b의 문자를 기준으로 나눔
// java.util 내에 클래스가 존재하므로 사용시 import 해주기
StringTokenizer st = new StringTokenizer(data2, "/");
// .hasMoreTokens() : 더 가져올 문자가 있는지 확인
while(st.hasMoreTokens()) {
// nextToken() : 나눈 문자들이 저장됨
String token = st.nextToken();
System.out.println(token);
}
}
}

package ch12.sec06;
public class BoxingUnBoxingExam {
public static void main(String[] args) {
// Boxing
// int 타입의 값을 Integer 객체에 직접 저장
Integer obj = 100;
// .기본타입Value() (char제외) : 해당 타입의 객체 내부의 값을 리턴
System.out.println(obj.intValue());
// UnBoxing
int value = obj;
System.out.println(value);
// UnBoxing 연산
int result = obj + 100;
System.out.println(result);
}
}
package ch12.sec06;
public class ValueCompareExample {
public static void main(String[] args) {
//-128~127 초과값일 경우
// 객체를 별도로 생성하기 때문에 참조하는 객체가 달라짐
// == : 참조하는 객체 비교, equals : 내용 비교
// (int) 형태로 형변환하면 정수형으로 변환되기 때문에 ==으로 비교하면 값이 같아짐
Integer obj1 = 300;
Integer obj2 = 300;
System.out.println("==: " + (obj1 == obj2));
System.out.println("equals(): " + obj1.equals(obj2));
System.out.println();
//-128~127 범위값일 경우
// 1byte 내외의 값은 == 이나, equals의 비교값은 모두 같음
Integer obj3 = 10;
Integer obj4 = 10;
System.out.println("==: " + (obj3 == obj4));
System.out.println("equals: " + obj3.equals(obj4));
}
}

package ch12.sec08;
import java.text.*;
import java.util.*;
public class DateExample {
public static void main(String[] args) {
Date now = new Date();
String strNow1 = now.toString();
System.out.println(strNow1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd a HH:mm:ss");
// 중간에 a : 오전, 오후
String strNow2 = sdf.format(now);
System.out.println(strNow2);
}
}
package ch12.sec08;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class CalendarExample {
public static void main(String[] args) {
Calendar now = Calendar.getInstance();
// Calendar는 추상클래스임
// getInstance() 메소드를 통해 정보를 얻어옴
// 현재 시간이 나옴
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH) + 1;
int day = now.get(Calendar.DAY_OF_MONTH);
int week = now.get(Calendar.DAY_OF_WEEK);
String strWeek = null;
switch(week) {
case Calendar.MONDAY: strWeek = "월"; break;
case Calendar.TUESDAY: strWeek = "화"; break;
case Calendar.WEDNESDAY: strWeek = "수"; break;
case Calendar.THURSDAY: strWeek = "목"; break;
case Calendar.FRIDAY: strWeek = "금"; break;
case Calendar.SATURDAY: strWeek = "토"; break;
default: strWeek = "일";
}
int amPm = now.get(Calendar.AM_PM);
String strAmPm = null;
if(amPm == Calendar.AM) {
strAmPm = "오전";
} else {
strAmPm = "오후";
}
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
System.out.print(year + "년 ");
System.out.print(month + "월 ");
System.out.println(day + "일 ");
System.out.print(strWeek + "요일 ");
System.out.println(strAmPm + " ");
System.out.print(hour + "시 ");
System.out.print(minute + "분 ");
System.out.println(second + "초 ");
// 이 방법을 더 많이 씀
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss");
String strNow2 = sdf.format(now.getTime());
System.out.println(strNow2);
}
}

package ch12.sec08;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
public class DateTimeOperationExample {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
// Date now = new Date();
// Calendar now = Calendar.getInstance()
// 모두 현재 시간을 알려주는 구문
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");
System.out.println("현재 시간: " + now.format(dtf));
LocalDateTime result1 = now.plusYears(1);
System.out.println("1년 덧셈: " + result1.format(dtf));
LocalDateTime result2 = now.minusMonths(2);
System.out.println("2월 뺄셈: " + result2.format(dtf));
LocalDateTime result3 = now.plusDays(7);
System.out.println("7일 덧셈: " + result3.format(dtf));
}
}

package ch12.sec08;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class DateTimeCompareExample {
public static void main(String[] args) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy.MM.dd a HH:mm:ss");
// 이것을 많이 씀 (년, 월, 일, 시, 분, 초)
LocalDateTime startDateTime = LocalDateTime.of(2021, 1, 1, 0, 0, 0);
System.out.println("시작일: " + startDateTime.format(dtf));
LocalDateTime endDateTime = LocalDateTime.of(2021, 12, 31, 0, 0, 0);
System.out.println("종료일: " + endDateTime.format(dtf));
if(startDateTime.isBefore(endDateTime)) {
System.out.println("진행 중입니다.");
} else if(startDateTime.isEqual(endDateTime)) {
System.out.println("종료합니다.");
} else if(startDateTime.isAfter(endDateTime)) {
System.out.println("종료했습니다.");
}
long remainYear = startDateTime.until(endDateTime, ChronoUnit.YEARS);
long remainMonth = startDateTime.until(endDateTime, ChronoUnit.MONTHS);
long remainDay = startDateTime.until(endDateTime, ChronoUnit.DAYS);
long remainHour = startDateTime.until(endDateTime, ChronoUnit.HOURS);
long remainMinute = startDateTime.until(endDateTime, ChronoUnit.MINUTES);
long remainSecond = startDateTime.until(endDateTime, ChronoUnit.SECONDS);
System.out.println("남은 해: " + remainYear);
System.out.println("남은 월: " + remainMonth);
System.out.println("남은 일: " + remainDay);
System.out.println("남은 시간: " + remainHour);
System.out.println("남은 분: " + remainMinute);
System.out.println("남은 초: " + remainSecond);
}
}
package ch12.sec08;
import java.util.Calendar;
import java.util.TimeZone;
public class LosAngelesExample {
public static void main(String[] args) {
TimeZone timeZone = TimeZone.getTimeZone("America/Los_Angeles");
// 국가/도시명
Calendar now = Calendar.getInstance( timeZone );
// LA의 시간
int amPm = now.get(Calendar.AM_PM);
String strAmPm = null;
if(amPm == Calendar.AM) {
strAmPm = "오전";
} else {
strAmPm = "오후";
}
int hour = now.get(Calendar.HOUR);
int minute = now.get(Calendar.MINUTE);
int second = now.get(Calendar.SECOND);
System.out.print(strAmPm + " ");
System.out.print(hour + "시 ");
System.out.print(minute + "분 ");
System.out.println(second + "초 ");
}
}
시간 출력 가능한 국가 알아보기
package ch12.sec08;
import java.util.TimeZone;
public class PrintTimeZoneID {
public static void main(String[] args) {
String[] availableIDs = TimeZone.getAvailableIDs();
// 사용 가능한 국가 ID
for(String id : availableIDs) {
System.out.println(id);
}
}
}

package ch12.sec09;
import java.text.DecimalFormat;
public class DecimalFormatExample {
public static void main(String[] args) {
double num = 1234567.89;
DecimalFormat df;
//정수 자리까지 표기
df = new DecimalFormat("#,###");
System.out.println( df.format(num) );
//무조건 소수 첫째 자리까지 표기
//반올림 기능이 있음
df = new DecimalFormat("#,###.0");
System.out.println( df.format(num) );
}
}
package ch12.sec09;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SimpleDateFormatExample {
public static void main(String[] args) {
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println( sdf.format(now) );
sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
System.out.println( sdf.format(now) );
sdf = new SimpleDateFormat("yyyy.MM.dd a HH:mm:ss");
System.out.println( sdf.format(now) );
sdf = new SimpleDateFormat("오늘은 E요일");
System.out.println( sdf.format(now) );
sdf = new SimpleDateFormat("올해의 D번째 날");
System.out.println( sdf.format(now) );
sdf = new SimpleDateFormat("이달의 d번째 날");
System.out.println( sdf.format(now) );
}
}
package ch12.sec10;
import java.util.regex.Pattern;
public class PatternExample {
public static void main(String[] args) {
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
// \d : 숫자
// {a,b} : 길이(a자리 또는 b자리)
String data = "02-123-4567";
boolean result = Pattern.matches(regExp, data);
// Pattern.matches : 정규 표현식 (전화번호나 이메일 등을 주로 사용)
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
// chatgpt로 만들기!! ㅋ
regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
// \w : 영문자, 숫자 포함
// + : 한 개 이상
// . : .이 있음
// ? : 없어도 있어도 됨
data = "angel@mycompanycom";
result = Pattern.matches(regExp, data);
if(result) {
System.out.println("정규식과 일치합니다.");
} else {
System.out.println("정규식과 일치하지 않습니다.");
}
}
}