본문 바로가기
학습/JAVA

11. 기본 API 클래스(2)

by Elfen Lied 2022. 10. 27.
반응형

- 객체비교

 

  • 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

댓글