언어/Java

[Java] interface, exception, collections

차가운오미자 2021. 6. 25. 17:51

interface

선언: interface (keyword)

interface는 class의 특별한 케이스이다. 
- field는 존재할 수 있다. 

  • interface라고 명시된 케이스에서 필드는 무조건 상수로 표현 (public static final 이 붙음)
  • public 어디서든 접근 가능, static 인스턴스 없이 사용 가능, final 상수 필드

- method 존재

  • 인터페이스의 모든 method는 abstract method (선언만, 정의x) ( public abstract 가 붙음)
  • abstract method가 있어서 abstract 하기 때문에 인스턴스를 만들 수 없음         
  • 대신 interface를 구현해서 class를 만듬

- 다중 구현(implement)이 가능, 클래스는 다중 상속(extend) 불가한데
- interface구현과 함께 class 상속도 가능

인터페이스가 필요한 이유:

현업에서 업무는 협업으로 이루어진다. 여러 회사, 개발자들이 하나의 프로젝트를 만들 때, 이들 간에 변수, 기능 상 오류 등을 통일하기 위해 interface를 사용한다. 

예를 들어, A회사와 B회사가 협업을 하는 경우, 둘이 별개의 파트를 맡아서 프로그래밍을 했는데, 둘다 같은 move()라는 함수를 각자 다르게 정의했다고 하자. 그럼 둘이 한 프로젝트를 합치는 과정에서 혼란스럽다. 

동일한 기능에 대해 같은 method명을 사용하도록 강제하되, 내부 구현을 A, B회사가 알아서 구현할 수 있도록 하기 위해 인터페이스를 사용한다. 

하나의 표준을 부여하기 위해 사용한다고 보면 된다. 

 

오류 처리

자바는 오류를 두 가지로 구분한다. (Runtime 오류 - 실행 시 오류)
1. error : 복구가 불가능한 오류 > 우리가 제어할 수 없는 오류
2. exception (예외): 복구가 가능한 오류 
  - exceptiong handling 이 가능하다 (java에 있는)

예를 들어, 0으로 나눴을 경우: 
ArithmeticException => class로 표현된다. 

 

Try & Catch

try {
	// 하고자하는, exception이 발생할 수 있는 코드
} catch() {
	// exception 발생시 실행하는 코드

}

 

 

  • exception handling 하는 코드이다.
  • 일단 try안에 있는거 해보고 안되면 catch 해서 catch 뒤에 있는 코드를 통해 예외상황을 처리한다.
  • 문제가 없으면 catch문은 건너뜀
  • try문에서 예외가 발견되면 catch로 넘어가서 catch안을 처리하고 아예 try ~ catch 부분을 넘어간다.

자바 클래스의 상속관계

Object - Exception -ArithmeticException .... (계속 확장) 
Exception class는 예외 상황에 대한 최상위 클래스이다. 
is-a 관계에 의해 ArithmeticException 은 Exception이다. (ArithmeticException이 Exception을 상속받은 것)
catch문은 여러 개가 있을 수 있다.

try{
	// 실행하고자 하는 코드
}
catch(ArithmeticException ae){
	// arithmetic exception이 발생할 경우 어떻게 처리할 것인지 
}
catch(Exception e){
	// all kinds of exception이 발생할 경우 어떻게 처리할 것인지 
}


근데 위의 코드랑 다르게 첫 catch문에 Exception e 가 인자로 되어 있으면 아래로 내려가지 못한다. Arithmetic Exception항목이 밑에 있기 때문이다. 따라서 제일 상위 클래스 exception이 더 위에 있으면 안된다. 
 

Collections (자료구조)

자바에서 기본으로 사용되는 자료구조는 배열이다. 

배열

- 배열이 가지는 특징: 사이즈 고정, 배열안에 들어가는 데이터의 자료구조는 같은 데이터 타입
  => 고정되어 있어서 불편
 

- collection 3가지 

(모두 인터페이스, 여러가지 클래스 제공)

  • Set 계열
  • Map 계열
  • List 계열: Link list, array list 등 여러가지 클래스가 제공됨
1. Set계열

가장 대표적인 class가 HashSet이다.

HashSet은 하나의 커다란 주머니처럼 생각하면 된다.

여러개의 데이터를 set안에 넣을 수 있지만, 순서가 없고, 중복을 허용하지 않는다. 

 

- 선언: 

HashSet set = new HashSet();

 

- HashSet class에 있는 메소드를 이용해서 요소를 넣고 뺄 수 있다. 


 - 넣기: add(e)

 

- set 안에는 instance만 들어갈 수 있다. primitive data type은 넣을 수 없다. 
만약 primitive data type이 들어가면, 이걸 자동으로 객체로 바꿔버린다. wrapper class라는걸 이용해서 instance로 바꾼 다음 셋에 넣게 된다. 

//1.Set 계열의 collection중 가장 흔한 class를 이용해보기
HashSet set = new HashSet();
set.add(1);

// primitive data type은 이렇게 넣는다!
int a = 1; // a: primitive data type을 저장하기 위한 변수
Integer haha = new Integer(a); // haha: integer 객체를 가리키는 참조변수, Integer = wrapper
set.add(haha);


- 연습문제

난수 중복없이 저장 후 출력해보자. -> set을 이용하면 간단

HashSet set = new HashSet();
Random r = new Random();
while(set.size() != 10) {
    // set.size: set에 몇개의 instance가 들어가있는지 알 수 있음
    int k = r.nextInt(30) +1;
    set.add(k);
}
System.out.println(set);


2. Map 계열 

대표적 클래스로 HashMap이 있다. 
 - HashMap: key 와 value의 쌍으로 데이터를 저장하고 추출하는 자료구조 (key로 value를 넣었다 뺐다 하는거)
 - 예시: 

HashMap map = new HashMap ();
map.put("1", "홍길동"); // map은 넣을때 put!
map.put("2", 1000);
map.put("3", new Car());

map.get("key");


3. List 계열

- 배열과 같으나, 사이즈가 고정적이지 않음( 늘어났다 줄었다 할 수 ㅇ)
- 순서 있음, 객체만 들어감
- 대표적 클래스: arraylist

ArrayList list = new Arrarylist();
list.add(10); // 첫 칸에 interger 객체 10이 입력
list.addAll("하하하"); //두번째 칸에 string 객체 하하하 입력
list.add(new Car()); //Car클래스의 인스턴스 입력 (정확히는 인스턴스를 가리키는 주소가)

list.get(0); //get(index)