개발 무지렁이

[Java] 인터페이스와 구현객체, Collections 본문

Backend/자바

[Java] 인터페이스와 구현객체, Collections

Gaejirang-e 2023. 4. 9. 18:08

인터페이스(Interface)
⚠️ 클래스가 아니다. 객체생성x, 상속x

추상 메서드(abstract method)만을 가지고 있는 형태
※ 단, 인터페이스 내부에는 디폴트 메서드, 정적 메서드가 올 수 있다.

🎯 목적:
✔️ 다중상속과 같은 효과를 낼 수 있다.
✔️ 소통을 위한 규격의 역할을 한다.
🧩 확장성 🧩 유지보수

> 🦔 인터페이스의 변수는 항상 앞에 public static final이 붙는다.(생략)
WHY?
인터페이스는 규격과 같은 역할을 한다.

static이 없다면?
구현객체마다 초기화값이 다르다. ➡️ 🗿 규격의 의미가 없어진다.

final이 없다면?
구현객체마다 변수의 값을 바꿀 수 있다. ➡️ 🗿 규격의 의미가 없어진다.

🗿 즉, 인터페이스가 만들어질 때, 한번 진정한 상수를 만들고,
이를 모든 구현객체가 공유해야 규격의 의미가 있다.

> 🦔 인터페이스의 메서드에는 public abstract가 붙는다.
WHY?
인터페이스는 규격과 같은 역할을 한다.

🗿규격을 위한 추상화가 목적이므로 BODY가 없다 ➡️ abstract

☁️ 인터페이스를 implements한 객체를 구현객체라 한다.
오버라이딩(Overriding)된 객체

Java는 Collection API를 인터페이스 형태로 제공한다, Collections
➡️ 이를 오버라이딩한 구현객체를 미리 만들어서 제공

✔️ List: 순서(index)가 있고, 중복이 가능하다.
  📍 ArrayList(비동기), Vector(동기), LinkedList (구현객체)

✔️ Set: 순서가 없고, 중복이 안된다.
  📍 HashSet, TreeSet(element를 정렬) (구현객체)

✔️ Map: keyvalue의 한쌍(entry)으로 이루어지며, 순서가 없다.
  📍 HashMap, TreeMap(key를 정렬), HashTable (구현객체)

> 🦔 Collection 객체는 객체만 저장할 수 있다.(기본 타입 값 저장 ❌)
때문에, Wrapper 객체가 기본 타입의 값을 감싼다.
🎯 목적: 단지, 객체로 생성하는데 목적이 있다.

📦 박싱
Wrapper 클래스 타입의 변수에 기본타입의 값이 대입될 때 발생

📦❌ 언박싱
기본 타입의 변수에 Wrapper 객체대입될 때 발생

⚠️ Wrapper 객체equals()를 통해 비교하는게 정확하다.

> 🦔 모든 Collection들의 데이터를 추출해주는 표준화된 인터페이스 Iterator
📌. HashSet()은 HashMap()구조로 설계되어있다. (map은 key는 순서를 보장하지 않는다.)
즉, Map과 Set의 데이터를 꺼낼때는 iterator

📌. 개선된 for는 내부적으로 iterator같은 역할을 한다

  public class HashMapExam {
      Map<Integer, String> map = new HashMap<>();
      public HashMapExam() {
          map.put(10, "희정");
          map.put(50, "나영");
          map.put(19, "미나");
          map.put(18, "영희");
          map.put(27, "지연");

          // 조회하기
          Set<Integer> keySet = map.keySet();
          Iterator<Integer> it = keySet.iterator();
          while(it.hasNext()) {
              int key = it.next();
              String value = map.get(key);
              System.out.println(key + ": " + value);
          }

          // Map.Entry<K,V>로 조회하기
          Set<Map.Entry<Integer, String>> set = map.entrySet();
          Iterator<Map.Entry<Integer, String>> iter = set.iterator();
          while(iter.hasNext()) {
              Map.Entry<Integer, String> entry = iter.next();
              System.out.println(entry.getKey() + " = " + entry.getValue());
          }

          // 개선된 for문으로 조회하기
          for(Integer key : map.keySet()) {
              String value = map.get(key);    
              System.out.println(key + ": " + value);
          }
      }
      public static void main(String[] args) {
          new HashMapExam();
      }
  }
Comments