반응형
- 객체비교
- compare(T , T , Comparator<T>)
public class Member {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
'
'
// Getter & Setter 생성
'
'
@Override
public String toString() {
return "Member [id=" + id + ", name=" + name + "]";
}
}
===========================================================
import java.util.Comparator;
//Member 객체의 정렬 기준 정의 : id를 기준으로 오름차순
public class MemberAscById implements Comparator<Member>{
@Override
public int compare(Member o1, Member o2) {
// 오름차순 : 첫번째 매개값 - 두번째 매개값 (양수)
// 내림차순 : 두번째 매개값 - 첫번째 매개값 (음수)
// ID기준 오름차순 정렬
return o1.getId() - o2.getId();
}
}
-----------------------------------------------------------
import java.util.Comparator;
//Member 객체의 정렬 기준 정의 : id를 기준으로 내림차순
public class MemberDescById implements Comparator<Member>{
@Override
public int compare(Member o1, Member o2) {
return o2.getId() - o1.getId();
}
}
===========================================================
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MemberMain {
public static void main(String[] args) {
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member(21, "홍길동"));
memberList.add(new Member(12, "박길동"));
memberList.add(new Member(34, "이길동"));
memberList.add(new Member(17, "차길동"));
// 정렬 전 출력
System.out.println(memberList);
// 정렬
// @param1 : 정렬대상(컬렉션) @param2 : 정렬기준
// Collections.sort(null, null);
// 오름차순
Collections.sort(memberList, new MemberAscById());
System.out.println(memberList); // ID 기준 정렬
// 내림차순
Collections.sort(memberList, new MemberDescById());
System.out.println(memberList); // ID 기준 정렬
}
}
- 정렬기준 익명구현 객체로 전달
위에 있는 코드블럭에서 메인 메소드만 수정함
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MemberMain2 {
public static void main(String[] args) {
// 정렬기준 익명구현 객체로 전달
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member(21, "홍길동"));
memberList.add(new Member(12, "박길동"));
memberList.add(new Member(34, "이길동"));
memberList.add(new Member(17, "차길동"));
// 오름차순
Collections.sort(memberList, new Comparator<Member>() {
@Override
public int compare(Member o1, Member o2) {
return o1.getId() - o2.getId();
}
});
System.out.println(memberList);
System.out.println();
// 내림차순
Collections.sort(memberList, new Comparator<Member>() {
@Override
public int compare(Member o1, Member o2) {
return o2.getId() - o1.getId();
}
});
System.out.println(memberList);
}
}
값
[Member [id=12, name=박길동], Member [id=17, name=차길동], Member [id=21, name=홍길동], Member [id=34, name=이길동]]
[Member [id=34, name=이길동], Member [id=21, name=홍길동], Member [id=17, name=차길동], Member [id=12, name=박길동]]
Collections.sort(memberList, new Comparator<Member>() {} 부분에서
new Comparator<Member>() 에 Member 타입을 주고 ctrl + 1 눌러서 몸체를 만들어준다.(@Override 부분)
- 람다 식으로 변형
메인메소드2번에 있는 Comparator<T> 부분에서 ctrl+1 눌러서 변경.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MemberMain3 {
public static void main(String[] args) {
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member(21, "홍길동"));
memberList.add(new Member(12, "박길동"));
memberList.add(new Member(34, "이길동"));
memberList.add(new Member(17, "차길동"));
// id 기준 내림차순 - 람다식 변환
Collections.sort(memberList, (o1, o2) -> o1.getId() - o2.getId());
System.out.println(memberList);
System.out.println();
// id 기준 내림차순 - 람다식 변환 (a,b)는 파라미터라서 o1, o2 아니라도 무관
Collections.sort(memberList, (a, b) -> b.getId() - a.getId());
}
}
- 이름을 기준으로 정렬
Member 클래스에 implements Comparable<T> 를 추가 후 ctrl + 1 눌러서 오버라이딩 해줌
public class Member implements Comparable<Member> {
private int id;
private String name;
public Member(int id, String name) {
this.id = id;
this.name = name;
}
'
'
// Getter & Setter 생성
'
'
@Override
public String toString() {
return "Member [id=" + id + ", name=" + name + "]";
}
// 여기가 추가됨
@Override
public int compareTo(Member member) {
// return member.getName().compareTo(this.name); // 역순 정렬
return this.name.compareTo(member.getName()); // 사전 정렬
}
}
===================================================================
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class MemberDemo {
public static void main(String[] args) {
List<Member> memberList = new ArrayList<Member>();
memberList.add(new Member(21, "홍길동"));
memberList.add(new Member(12, "박길동"));
memberList.add(new Member(34, "이길동"));
memberList.add(new Member(17, "차길동"));
Collections.sort(memberList);
System.out.println(memberList);
}
}
값
[Member [id=12, name=박길동], Member [id=34, name=이길동], Member [id=17, name=차길동], Member [id=21, name=홍길동]]
- Objects.equals(Object, Object)
import java.util.Objects;
public class Member {
private String name;
public Member(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Member other = (Member) obj;
return Objects.equals(name, other.name);
}
}
==========================================================
import java.util.Objects;
public class MemberMain {
public static void main(String[] args) {
Member member1 = new Member("홍길동");
Member member2 = new Member("홍길동");
Member member3 = new Member("김길동");
Member member4 = null;
Member member5 = null;
System.out.println(member1.equals(member2)); // true
System.out.println(member2.equals(member3)); // false
System.out.println(Objects.equals(member1, member2)); // true
// member4.equals(member1); // NullPointerException
// null객체와 null이 아닌 객체 비교 : false
System.out.println(Objects.equals(member4, member1)); // false
// 두 객체 모두 null인 경우 true 반환
System.out.println(Objects.equals(member4, member5)); // true
}
}
- Objects.deepEquals(Object, Object)
위 코드에 메인클래스만 변경
import java.util.Arrays;
import java.util.Objects;
public class DeepEqualsMain {
public static void main(String[] args) {
int[] arr1 = {1,2,3};
int[] arr2 = {1,2,3};
int[] arr3 = {1,2};
System.out.println(Arrays.equals(arr1, arr2)); // 요소값 비교 true
System.out.println(Objects.equals(arr1, arr2)); // 참조값 비교 false
System.out.println(Objects.deepEquals(arr1, arr2)); // 요소값 비교 true
}
}
- Objects.requireNonNull(Object)
- Objects.requireNonNull(Object, String)
import java.util.Objects;
public class Member {
private String name;
private Address address;
public Member() {}
public Member(String name, Address address) {
this.name = name;
this.address = Objects.requireNonNull(address, "Address에 Null값 할당함");
}
@Override
public String toString() {
return "Member [name=" + name + ", address=" + address + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
===================================================================================
public class Address {
private String state;
public Address(String state) {
this.state = state;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
===================================================================================
public class MemberMain {
public static void main(String[] args) {
// Member member = new Member();
Member member = new Member("홍길동", null);
System.out.println(member);
printInfo(member);
}
private static void printInfo(Member member) {
System.out.println("이름 : " + member.getName());
System.out.println("이름 : " + member.getAddress().getState()); // 예외발생
}
}
Member 클래스의 생성자에 코드를 작성
==> 작성하지 않았을때 오류 메세지
두가지가 실행되고 NullPointer 예외를 띄움.
==> requireNonNull 그냥 참고 정도로만 알아놓기 (편의성)
- 객체 문자 정보
- 잘 사용안함 (잘 쓰면 좋다)
- Objects.toString(Object)
- Objects.toString(Object, String)
import java.util.Objects;
public class ToStringDemo {
public static void main(String[] args) {
String name = null;
System.out.println(name);
// System.out.println(name.toString()); // 예외발생
// 이것은 null 일때 기본값을 지정해서 쓸수 있다.
System.out.println(Objects.toString(name));
System.out.println(Objects.toString(name, "기본값 지정"));
}
}
값
null
null
기본값 지정
- 현재 시각 읽기
- System.currentTimeMillis()
public class SystemDemo {
public static void main(String[] args) {
// UTC기준 : 1970년 1월 1일 0시0분0초0밀리초 ~ 현재까지
long curTime = System.currentTimeMillis();
System.out.println(curTime);
curTime /= 1000;
System.out.println(curTime + "초");
curTime /= 60;
System.out.println(curTime + "분");
curTime /= 60;
System.out.println(curTime + "시");
curTime /= 24;
System.out.println(curTime + "일");
curTime /= 365;
System.out.println(curTime + "년");
}
}
값
1666841844324
1666841844초
27780697분
463011시
19292일
52년
이것을 이용해 성능 테스트
public class SystemDemo2 {
public static void main(String[] args) {
// 1부터 200,000,000까지의 합을 구하는데 걸리는 시간
long start = System.currentTimeMillis();
int sum = 0;
for (int i = 1; i < 200000000; i++) {
sum += i;
}
long end = System.currentTimeMillis();
System.out.println("소요시간 : " + (end - start) + "밀리초");
}
}
값
소요시간 : 63밀리초
- Class 객체 얻기
- 클래스와 인터페이스의 메타 데이터를 Class 클래스로 관리
- 메타 데이터 : 클래스이름, 생성자, 메서드, 필드 정보
- getClass()
- Class.forName()
public class Member {
private int id;
private String name;
public Member() {}
public Member(int id, String name) {
this.id = id;
this.name = name;
}
protected Member(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
==============================================================
public class MemberMain {
public static void main(String[] args) throws ClassNotFoundException {
// Member클래스의 Class객체 정보 얻기
Class<?> clazz = Class.forName("exam17.Member");
System.out.println("클래스 이름 : " + clazz.getName());
System.out.println("패키지를 제외한 클래스 이름 " + clazz.getSimpleName());
// 둘이 같음
System.out.println("패키지 이름 : " + clazz.getPackage().getName());
System.out.println("패키지 이름 : " + clazz.getPackageName());
System.out.println("========================================");
// 인스턴스 메소드 사용 getClass()
Member member = new Member();
Class<?> clazz2 = member.getClass();
System.out.println("클래스 이름 : " + clazz2.getName());
System.out.println("패키지를 제외한 클래스 이름 " + clazz2.getSimpleName());
System.out.println("패키지 이름 : " + clazz2.getPackage().getName());
System.out.println("패키지 이름 : " + clazz2.getPackageName());
}
}
값
클래스 이름 : exam17.Member
패키지를 제외한 클래스 이름 Member
패키지 이름 : exam17
패키지 이름 : exam17
========================================
클래스 이름 : exam17.Member
패키지를 제외한 클래스 이름 Member
패키지 이름 : exam17
패키지 이름 : exam17
- 리플렉션
위의 멤버 클래스 그대로 사용
- getDeclaredConstructors()
import java.lang.reflect.Constructor;
import java.util.Arrays;
public class ReflectionConstructor {
public static void main(String[] args) {
Member member = new Member();
Class<?> clazz = member.getClass();
// 생성자 정보
Constructor<?>[] constructors = clazz.getDeclaredConstructors();
System.out.println(Arrays.toString(constructors));
// 각 생성자의 파라미터 개수
System.out.println("첫번째 생성자 : " + constructors[0].getParameterCount());
System.out.println("두번째 생성자 : " + constructors[1].getParameterCount());
System.out.println("세번째 생성자 : " + constructors[2].getParameterCount());
// 각 생성자의 파라미터 타입
Class<?>[] parameterTypes = constructors[0].getParameterTypes();
System.out.println("첫번째 생성자의 파라미터 타입 " + Arrays.toString(parameterTypes));
Class<?>[] parameterTypes2 = constructors[1].getParameterTypes();
System.out.println("두번째 생성자의 파라미터 타입 " + Arrays.toString(parameterTypes2));
Class<?>[] parameterTypes3 = constructors[2].getParameterTypes();
System.out.println("세번째 생성자의 파라미터 타입 " + Arrays.toString(parameterTypes3));
}
}
값
[protected exam17.Member(java.lang.String), public exam17.Member(int,java.lang.String), public exam17.Member()]
첫번째 생성자 : 1
두번째 생성자 : 2
세번째 생성자 : 0
첫번째 생성자의 파라미터 타입 [class java.lang.String]
두번째 생성자의 파라미터 타입 [int, class java.lang.String]
세번째 생성자의 파라미터 타입 []
- getDeclaredFields()
import java.lang.reflect.Field;
import java.util.Arrays;
public class ReflectionField {
public static void main(String[] args) {
Member member = new Member();
Class<?> clazz = member.getClass();
Field[] fields = clazz.getDeclaredFields();
System.out.println(Arrays.toString(fields));
// 필드 이름
for(Field f : fields) {
String name = f.getName();
System.out.println(name);
}
// 필드 타입
for(Field f : fields) {
String type = f.getType().getName();
System.out.println(type);
}
for(Field f : fields) {
String type = f.getType().getName();
System.out.println(type);
}
}
}
===============================================================
import java.lang.reflect.Method;
import java.util.Arrays;
public class ReflectionMethod {
public static void main(String[] args) {
Member member = new Member();
Class<?> clazz = member.getClass();
Method[] methods = clazz.getDeclaredMethods();
System.out.println(Arrays.toString(methods));
for(Method m : methods) {
System.out.println("=====================");
System.out.println("메소드 이름 : " + m.getName());
System.out.println("파라미터 개수 : " + m.getParameterCount());
Class<?>[] parameterTypes = m.getParameterTypes();
for(Class type : parameterTypes) {
System.out.println("파라미터 타입 : " + type.getName());
}
}
}
}
값
[public java.lang.String exam17.Member.getName(), public void exam17.Member.test(java.lang.String,int,java.lang.String), public void exam17.Member.setName(java.lang.String), public int exam17.Member.getId(), public void exam17.Member.setId(int)]
=====================
메소드 이름 : getName
파라미터 개수 : 0
=====================
메소드 이름 : test
파라미터 개수 : 3
파라미터 타입 : java.lang.String
파라미터 타입 : int
파라미터 타입 : java.lang.String
=====================
메소드 이름 : setName
파라미터 개수 : 1
파라미터 타입 : java.lang.String
=====================
메소드 이름 : getId
파라미터 개수 : 0
=====================
메소드 이름 : setId
파라미터 개수 : 1
파라미터 타입 : int
- 리플렉션 활용
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class MemberDispatcher {
// 역할 : 사용자로부터 요청을 받아, 받은 요청을 컨트롤러에 전달
MemberController controller = new MemberController();
public void run() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Scanner scan = new Scanner(System.in);
System.out.println("프로그램 실행");
while (true) {
System.out.print(">>메뉴선택");
String command = scan.nextLine();
if (command.equals("0")) {
System.out.println("프로그램종료");
System.exit(0);
}
// MemberController에 선언된 메소드 정보를 Method[]타입으로 받아옴
Method[] methods = controller.getClass().getDeclaredMethods();
Method findMethod = null;
for (Method method : methods) {
// 메소드에 선언된 RequestMapping 타입의 어노테이션
RequestMapping requestMapping = method.getDeclaredAnnotation(RequestMapping.class);
if (requestMapping != null) {
String value = requestMapping.command();
if (command.equals(value)) {
findMethod = method;
}
}
}
if (findMethod != null) {
findMethod.invoke(controller);
}
} // while end
} // run end
}
===================================================================================
public class MemberController {
@RequestMapping(command = "1")
public void proceedFindAll() {
System.out.println("모든회원찾기");
}
@RequestMapping(command = "2")
public void proceedFindById() {
System.out.println("번호로 조회");
}
@RequestMapping(command = "3")
public void findByName() {
System.out.println("이름으로 조회");
}
@RequestMapping(command = "hello")
public void hello() {
System.out.println("hello??!!");
}
}
===================================================================================
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestMapping {
String command();
}
===================================================================================
import java.lang.reflect.InvocationTargetException;
public class AppMain {
public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
MemberDispatcher dispatcher = new MemberDispatcher();
dispatcher.run();
}
}
값
프로그램 실행
>>메뉴선택1
모든회원찾기
>>메뉴선택2
번호로 조회
>>메뉴선택3
이름으로 조회
>>메뉴선택0
프로그램종료
실행 시키면 Scanner 작동
1, 2, 3, 0 해당 번호를 입력하면 각 명령이 실행됨.
** 아직 이것이 어떻게 적용될지는 잘 모름 **
반응형
'학습 > JAVA' 카테고리의 다른 글
13. List 인터페이스 (ArrayList) (0) | 2022.11.07 |
---|---|
11. 기본 API 클래스(3) (0) | 2022.10.31 |
11. 기본 API 클래스(1) (0) | 2022.10.26 |
10. 예외처리 (0) | 2022.10.25 |
9. 중첩 클래스와 중첩 인터페이스 (0) | 2022.10.24 |
댓글