1. Interface
1.1 인터페이스의 개념
- 서로 다른 두 객체를 연결해주는 역할을 한다.
- 같은 형식으로 선언된 메소드여도 구현객체에 따라 다른 결과 값을 가져온다.
- 이러한 특징으로 인해 다형성을 구현할 수 있다.
1.2 인터페이스의 선언
- 인터페이스를 선언 한다는 것은 구현객체가 어떤 형식에 영향을 준다.
public interface 인터페이스명{
public 상수필드
public 추상메소드
public 디폴트메소드
public 정적메소드
public 메소드
private 정적메소드
}
1.3 구현메소드의 선언
- 구현 객체는 인터페이스에서 선언된 추상메소드을 오버라이딩을 통해 구체적인 실행 코드가 들어있다.
public class B implements 인터페이스명{}
1.4 상수필드
- 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
[public static final] 타입 상수명 = 값;
1.5 추상메서드
- 추상메서드는 함수의 시그니처만 사용하여 나타낸다.
- 기본적으로 public abstarct을 사용하여, 생략시 컴파일시 자동으로 생성된다.
- 구현클래스에서는 추상메서드에 대한 오버라이딩(public 타입으로) 을 시행하여야 한다.
[public abstract] 리턴타입 메소드명(매개변수,...);
1.6 디폴트메서드
- 인터페이스내에 완전한 실행코드를 사용하려면 디폴트 메서드를 사용해야한다.
- 디폴트 메서드는 인터페이스내에서 상수필드와 추상메소드를 호출할 수 있다.
- 디폴트 메서드는 구현 객체가 필요한 메서드 이다.
- 추상메소드 호출 시, 오버라이딩된 구현객체의 메서드에게 매개변수를 전달한다.
- 구현 객체에서 디폴트 메서드를 새로정의할 수있다.
[public] default 리턴타입 메소드명(매개변수,....) {....}
1.7 정적메서드
- 구현객체가 없어서도 인터페이스만으로도 호출 할 수 있는 메서드이다.
- 상수필드 제외한 메서드들을 호출 할 수 없다.
- 정적메소드는 메인에서 인터페이스 명으로 호출 가능하다.
[public|(private)] static 리턴타입 메서드명(매개변수...){ 상수필드 o, 메서드들 x}
1.8 private메서드
- public 말고 private 형으로도 메서드 선언이 가능하다.
- default (non-static, static), static(static) 메소드 호출이 가능하다.
2. 실습프로젝트
2.1 ArrayList와 LinkedList
- 두개의 클래스는 동일한 기능을 하는 메서드들이 있다.
- add(), remove() .... 등
- 하나의 인터페이스로 묶어서 관리하는 것이 편리하다.
- 인터페이스에서는 추상화메서드로 메서의 원형만 선언해준다.
- 인터페이스를 따르는 클래스에는 클래스명 뒤에 implements 인터페이스명 을 붙인다.
package bitcamp.myapp2.util;
public interface List {
void add(Object obj);
Object remove(int index);
Object get(int index);
Object[] toArray();
int indexOf(Object obj);
int size();
}
package bitcamp.myapp2.util;
import bitcamp.myapp2.vo.User;
import java.util.Arrays;
public class ArrayList extends AbstracList {
private static final int MAX_SIZE = 100;
private Object[] list = new Object[MAX_SIZE];
private void grow() {
int oldSize = list.length;
int newSize = oldSize + (oldSize >> 1);
Object[] arr = new Object[newSize];
System.arraycopy(list, 0, arr, 0, oldSize);
list = arr;
}
@Override
public void add(Object obj) {
if (size == list.length) {
int oldSize = list.length;
int newSize = oldSize + (oldSize >> 1);
list = Arrays.copyOf(list, newSize);
grow();
}
list[size++] = obj;
}
@Override
public Object get(int index) {
if (index < 0 || index >= size) {
return null;
}
return list[index];
}
@Override
public Object remove(int index) {
if (index < 0 || index >= size) {
return null;
}
Object deletedObj = list[index];
for (int i = index + 1; i < size; i++) {
list[i - 1] = list[i];
}
list[--size] = null;
return deletedObj;
}
@Override
public Object[] toArray() {
Object[] arr = new Object[size];
System.arraycopy(list, 0, arr, 0, size);
return arr;
}
@Override
public int indexOf(Object obj) {
for (int i = 0; i < size; i++) {
if (list[i].equals(obj)) {
return i;
}
}
return -1;
}
public boolean contain(User user) {
return indexOf(user) != -1;
}
}
2.2 추상화클래스 생성
- ArrayList와 LinkedList 클래스에는 size가 중복된다.
- 이 경우 추상화 클래스를 생성하여 인터페이스로 받고 이후 상속을 한다.
package bitcamp.myapp2.util;
public abstract class AbstractList implements List {
protected int size;
@Override
public int size() {
return size;
}
}
package bitcamp.myapp2.util;
import bitcamp.myapp2.vo.User;
import java.util.Arrays;
public class ArrayList extends AbstractList {
private static final int MAX_SIZE = 100;
private Object[] list = new Object[MAX_SIZE];
@Override
public void add(Object obj) { //생략 }
@Override
public Object get(int index) { //생략 }
@Override
public Object remove(int index) { //생략 }
@Override
public Object[] toArray() { //생략 }
@Override
public int indexOf(Object obj) { //생략 }
public boolean contain(User user) { //생략 }
}
package bitcamp.myapp2.util;
public class LinkedList extends AbstractList {
Node first;
Node last;
@Override
public void add(Object value) { //생략 }
@Override
public Object get(int index) { //생략 }
@Override
public Object remove(int index) { //생략 }
@Override
public Object[] toArray() { //생략 }
@Override
public int indexOf(Object value) { //생략 }
public static class Node {
Object value;
Node next;
public Node(Object value) {
this.value = value;
}
}
}
'개발자 꿈나무의 하루 > 01_Boot Camp' 카테고리의 다른 글
(네이버클라우드 부트캠프) 26일차 - Java프로그래밍 기초(상속) (0) | 2024.07.01 |
---|---|
(네이버클라우드 부트캠프) 24_25일차 - 미니프로젝트 가계부만들기 (0) | 2024.07.01 |
(네이버클라우드 부트캠프) 22일차 - Java프로그래밍 기초(String, Wrapper),실습프로젝트(LinkedList) (0) | 2024.06.25 |
(네이버클라우드 부트캠프) 21일차 - Java프로그래밍 기초(Object 클래스) (1) | 2024.06.24 |
(네이버클라우드 부트캠프) 19일차 - 실습프로젝트(Static필드, High Cohesion) (0) | 2024.06.20 |