본문 바로가기
수업 일지/JAVA

17일차 - [JAVA] 다형성/Comparator/Comparable 인터페이스

by 쿠쿠씨 2022. 1. 22.
반응형

 

앞으로 숫자 입력 받을 때  sc.nextInt(); 대신 Integer.parseInt(sc.nextLine()); 쓰기!

 

sc.nexInt() 다음에 sc.nextLine()이 있을 경우

sc.nextInt()는 enter 앞까지만 입력을 받기 때문에 숫자를 입력한 뒤 enter를 누르면

다음에 나오는 sc.nextLine()이 enter(개행 문자)를 가져간다.

sc.nextInt() 뒤에 sc.nextLine();를 하나 추가하거나,

Integer.parseInt(sc.nextLine());를 사용하면 이러한 문제를 해결할 수 있다.

 

객체의 다형성

 

객체의 실체는 1가지 그러나 여러가지 타입으로 참조할 수 있다.

 → 부모 클래스(추상 클래스 포함), 인터페이스 때문에 가능하다.

배열과 ArrayList, HashMap 등 자료 구조에 저장되는 데이터 형식으로 사용할 수 있다.

메소드 인자에도 사용될 수 있다.

다형성을 갖는 객체는 메소드를 오버라이딩(또는 구현)할 수 있다.

 → 메소드 이름은 1가지이지만 다른 동작을 하도록 한다.

  →  일반적인 상속에는 부모 클래스 메소드를 재정의

  →  추상 클래스 또는 인터페이스의 추상 메소드를 구현

 

인터페이스 예제1 : 리모콘

 

RemoteControl 인터페이스

 

5,6라인 상수 필드 MAX_VOLUME, MIN_VOLUME을 선언한다.

9,10라인 추상 메소드를 선언한다.(turnOnOff, setVoulme)

11라인 구현한 뒤 추상 메소드를 추가하면 구현 클래스에서 오류가 발생한다.

default 인스턴스 메소드

인터페이스를 구현한 클래스가 많은 상태에서 재정의할 수 있는 메소드를  추가하고 싶을 때,

 → 추상 메소드는 안되고 인스턴스 메소드는 가능하다.

 → 구현 클래스에서 재정의할 수 있다.

16라인 인스턴스 메소드 setMute를 선언한다. 

23라인 추상 메소드와 달리 인스턴스 메소드는 나중에 만들더라도 구현 클래스에서 오류가 발생하지 않는다.

27라인 static 메소드 changeBattery를 선언한다.

 

WebSearch 인터페이스

추상 메소드를 선언한다.(search, play)

 

SmartMachine 클래스

3라인 SmartMachine은 RemoteControl, WebSearch 인터페이스를 구현한 클래스이다.

4~6라인 필드 값을 선언한다.

10~18라인 WebSearch 인터페이스의 추상 메소드를 구현한다.

22~30라인 RemoteControl 인터페이스의 추상 메소드 turnOnOff를 구현한다.

30라인 ! 연산자로 toggle형식이 가능하다.

34라인 RemoteControl 인터페이스의 추상 메소드 setVolume을 구현한다.

35,36라인 volume 인자가 MAX_VOLUME 이상이면 MAX_VOLUME을 반환한다.

37,38라인 volume 인자가 MIN_VOLUME 이하이면 MIN_VOLUME을 반환한다.

39,40라인 volme 인자가 MIN_VOLUME 이상, MAX_VOLUME 이하라면 volume을 반환한다.

44~51라인 getter 메소드를 선언한다.

54,55라인 RemoteControl 인터페이스의 인스턴스 메소드 setBattery를 재정의한다.

 

MacBook 클래스

3라인 MacBook 클래스는 SmartMachine 클래스를 상속 받는다.

11,12라인 RemoteControl 인터페이스에 있는 인스턴스 메소드 setMute()를 재정의한다.

 

Day17App1 클래스

10라인 MacBook(자식 클래스) 참조 타입 mac1 변수에 MacBook 객체를 저장한다.

11라인 SmartMachine(부모 클래스) 참조 타입 mac2 변수에 MacBook 객체를 저장한다.

13라인 부모 타입인 mac2를 자식타입인 mac1로 참조할 수 없다.(강제 캐스팅 필요, 다운 캐스팅)

14라인 자식타입인 mac1을 부모 타입인 mac2로 참조할 수 있다.

16라인 RemoteControl 인터페이스의 구현 클래스가 SmartMachine이므로 mac1을 참조할 수 있다.

17라인 MacBook 타입으로 RemoteControl 타입 변수를 참조할 수 없다

19라인 MacBook은 SmartMachine 클래스에서 선언한 메소드를 호출할 수 있다.

23라인 RemoteControl 참조 타입 mac3 변수에 MacBook 객체를 저장한다.

24라인 Websearch 참조 타입 mac4 변수에 MacBook 객체를 저장한다.

26,27라인 mac1는 Macbook 참조 타입이므로 SmartMachine(부모) 클래스의 메소드를 호출할 수 있다.

29,30라인 mac3은 RemoteControl 참조 타입이므로 WebSearch 인터페이스의 search 메소드는 호출할 수 없다.

32,33라인 mac4는WebSearch 참조 타입이므로 RemoteControl 인터페이스의 setVolume 메소드는 호출할 수 없다.

36라인 temp와 mac4의 참조변수 주소는 같다.

39라인 Macbook타입을 Websearch 타입으로 참조할 수 있다. web과 temp의 참조변수 주소도 같다.(=mac4)

44라인 인터페이스의 static 메소드는 Interface로만 사용할 수 있다.

47라인 Websearch 타입으로 RemoteControl 타입의 인스턴스 메소드를 사용할 수 없다.

 

Comparator 인터페이스와 Comparable 인터페이스

 

Comparator, Comparable 인터페이스로 객체를 비교하여 정렬할 수 있다.

Comparator 인터페이스 Comparable 인터페이스
java.util 패키지에 존재한다. → import 필요 java.lang 패키지에 존재한다.
구현한 클래스는 정렬 규칙을 의미한다.
원하는 정렬 규칙으로 지정할 때 사용한다.
구현한 객체 스스로에게 한 가지 기본 정렬 규칙을 설정한다.
compare 메소드를 구현(재정의)하여 사용한다. compareTo 메소드를 구현(재정의)하여 사용한다.
compare 메소드는 두 매개변수 객체를 비교한다. 
ex) compare(a, b)
compareTo 메소드는 자기 자신과 매개변수를 비교한다. 
ex) a.compareTo(b)
a<b이면 음수 반환
a=b이면 0 반환
a>b이면 양수 반환
반환값이 양수(a>b)일 경우 두 객체의 자리가 바뀐다.(오름차순 정렬)
내림차순 정렬을 하려면 a와 b의 위치를 바꾼다. 
ex)compare(b,a) ex) b.compareTo(a)

 

인터페이스 예제2 : Comparator 인터페이스 구현하여 객체 정렬하기

 

Comparator 인터페이스의 구현 클래스를 생성하여 정렬 규칙을 지정한다.

 

MemberAgeAscending 클래스

3라인 Comparator 인터페이스를 구현한다.

9라인 compare 메소드를 재정의 하여 Member 객체의 비교 기준을 설정한다.(Age)

10,11라인 Member 객체의 Age 값을 불러와 변수 a, b에 저장한다.

12,13라인 Age가 같을 경우 Name값을 불러와 비교한다. (사전식 정렬) 

15라인 a와 b를 비교하여 a>b이면 양수를 반환하고 객체의 순서를 바꾼다.

 

MemberAgeDescending 클래스

12라인 MemberAgeAscending 클래스에서 a와 b의 위치만 바꾸면 내림차순 정렬이다.

 

MemberNameAscending 클래스

8라인 compare 메소드를 재정의 하여 Member 객체의 비교 기준을 설정한다.(Name)

9라인 o1 객체의 Name과 o2객체의 Name을 비교한다.

 

MemberNameDescending 클래스

9라인 o1과 o2의 위치만 바꾸면 내림차순 정렬이다.

9라인 Integer 타입을 저장하는 List 객체를 생성한다.

10라인 String 타입을 저장하는 List 객체를 생성한다.

12~16라인 list1에 데이터를 추가한다.

19라인 sort(null) 메소드로 값의 비교와 정렬이 가능하다. 오름차순으로 정렬한다.

22~26라인 list2에 데이터를 추가한다.

29라인 sort(null) 메소드로 값의 비교와 정렬이 가능하다. 오름차순(사전식)으로 정렬한다.

34~38라인 list3에 Member 객체를 추가한다.

객체의 비교는 sort(null) 메소드로 값의 비교가 불가능하다.

Comparator를 구현한 클래스로 비교 규칙을 설정하여 비교할 수 있다.

 

인터페이스 예제3 : Comparable 인터페이스 구현하여 객체 정렬하기

3라인 User 클래스에 Compearable 인터페이스를 구현한다.

 → User 클래스는 비교할 수 있는 객체가 된다. Comparator 구현제 없이 비교 가능하다.

16라인 compareTo 메소드를 재정의(구현)한다.

17~19라인 나이 순으로 오름차순 정렬한다. o1>o2일 경우 양수를 반환하여 자리를 바꾼다.

10~15라인 List 객체 ulist에 User 객체를 생성하여 저장한다.

18라인 User 타입은 비교 가능한 객체(Comparable인터페이스를 구현)로 sort(null) 메소드로 정렬할 수 있다.

  ↔  Member 타입은 비교 불가능한 객체로 sort할 때 Comparator(비교자)를 인자로 전달해야 한다.

반응형

댓글