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)
'언어 > Java' 카테고리의 다른 글
[Java] this, super, overriding, final, 추상 클래스, 다형성, dynamic binding (0) | 2021.06.25 |
---|---|
[Java] 접근 제어자, 상속, is-a관계 (0) | 2021.06.25 |
[Java] Java란? (0) | 2021.06.25 |