● 모호성(ambiguity)
- 하나의 자식이 여러 부모를 상속받을 때 부모 필드에 동일한 이름의 필드가 있다면 어떤 부모의 필드인지 알 수 없다.
이를 모호성이라고 부른다.
● 모호성 해결 방법
1. 방법1
- 상황 : 두 개의 인터페이스 내에 같은 이름과 매개변수의 메소드가 선언되어 있다.
- 해결 : 자식 클래스에서 재정의하여 사용한다.
2. 방법2
- 상황 : 부모 클래스의 메소드와 인터페이스의 디폴트 메소드의 이름, 매개변수가 같다.
- 해결 : 부모 클래스의 메소드가 사용된다.
※ 인터페이스도 타입이다.
※ 인터페이스는 부모이며, 구현한 클래스가 자식이 된다.
● 마커 인터페이스(Marker Interface)
- 클래스들을 그룹화하기 위한 목적으로 사용한다.
- 인터페이스는 지정한 클래스의 부모이며, 모든 자식은 부모의 타입이므로 마커 인터페이스를 지정받은 클래스들이
하나의 타입으로 묶이게 된다.
● 내부 클래스(inner class)
- 하나의 클래스에서 a작업과 b작업이 있을 때에는 따로 분리하여 클래스로 만들지 않고,
클래스 안에 클래스를 선언하여 설계한다.
- 이 때 밖에 있는 클래스를 외부 클래스라고 하며, 안에 선언된 클래스를 내부 클래스라고 한다.
- 외부 클래스가 메모리에 할당되어야 내부 클래스를 객체화할 수 있기 때문에
클래스를 숨기기 위해서 내부 클래스를 사용하기도 하며, 이를 "캡슐화" 또는 "은닉화"라고 부른다.
- 내부 클래스는 외부 클래스의 필드이기 때문에 외부 클래스의 필드를 자신의 필드처럼 가져다 사용할 수 있게 된다.
※ 메소드 안에서 클래스를 선언할 수도 있다.
● 익명 클래스(Anonymous inner class)
- 이름이 없는 클래스이며 구현되지 않은 필드를 구현하기 위해 일회성으로 생성되는 클래스이다.
실습(모호성)
※ 인터페이스 생성
- InterA.java
public interface InterA {
default void printData() {
System.out.println("InterB");
}
}
- InterA.java
public interface InterB {
default void printData() { // void 앞에 아무것도 입력하지 않으면 abstract가 기본적으로 적혀있다.
System.out.println("InterB");
}
}
1. 상황 1
- 두 개의 인터페이스 내에 같은 이름과 매개변수의 메소드가 선언되어 있다.
public class ClassC implements InterA, InterB{
// 자식 클래스에서 재정의하여 사용한다.
@Override
public void printData() {
InterB.super.printData();
}
}
2. 부모 클래스의 메소드와 인터페이스의 디폴트 메소드의 이름, 매개변수가 같다.
- ClassA.java 생성
public class ClassA {
public void printData() {
System.out.println("ClassA");
}
}
- 자식클래스(ClassB.java) 생성
public class ClassB extends ClassA implements InterA{
public static void main(String[] args) {
// 부모 클래스가 우선순위가 높기 때문에 모호성으로 인해 부모 클래스의 메소드가 사용된다.
new ClassB().printData();
}
}
![](https://blog.kakaocdn.net/dn/9x6iV/btrvr9tKshA/AITmPtAkI46rKAk82YZ1xk/img.png)
실습(마커 인터페이스)
1. 마커 인터페이스 생성
- Herbivore.java
public interface Herbivore {
}
- Carnivore.java
public interface Carnivore {
}
2. 부모클래스(Animal.java) 생성
public class Animal {
}
3. 자식클래스 생성 및 인터페이스 구현
- Bear.java
public class Bear extends Animal implements Carnivore{
}
- Cow.java
public class Cow extends Animal implements Herbivore{
}
- Dog.java
public class Dog extends Animal{
}
- Tiger.java
public class Tiger extends Animal implements Carnivore{
}
3. Lab.java를 생성하여 실행
public class Lab {
public void checkKind(Animal[] animals) {
for (int i = 0; i < animals.length; i++) {
// 전달받은 각 동물의 종류
// 초식동물
if(animals[i] instanceof Herbivore) {
System.out.println("초식동물입니다.");
} else if(animals[i] instanceof Carnivore) {
// 육식동물
System.out.println("육식동물입니다.");
} else {
// 잡식동물
System.out.println("잡식동물입니다.");
}
}
}
public static void main(String[] args) {
Animal[] animals = {
new Cow(),
new Dog(),
new Tiger(),
new Bear(),
};
new Lab().checkKind(animals);
}
}
![](https://blog.kakaocdn.net/dn/cUDyJ2/btrvu2G13D3/qLLl5nLA3NdIwfi2sghLG0/img.png)
실습(익명 클래스(1))
1. 인터페이스(Soldier.java) 생성
public interface Soldier {
void eat();
void work();
}
2. Army 클래스(Army.java)에서 실행
public class Army {
public static void main(String[] args) {
// 익명클래스 : 중괄호 앞에 이름이 없다
// 익명 내부 클래스 : 메소드 안에서 선언되어있다.(ex - main 메소드)
Soldier han = new Soldier() { // 익명 클래스
@Override
public void work() {
System.out.println("열심히 일한다.");
}
@Override
public void eat() {
System.out.println("밥을 맛있게 먹는다.");
}
};
han.work();
han.eat();
}
}
![](https://blog.kakaocdn.net/dn/ctXScO/btrvtcRi43k/xDmpLLOdoy9unCJAgMFgKk/img.png)
실습(익명 클래스(2))
1. 인터페이스(Form.java) 생성
public interface Form {
public String[] getMenu();
public void sell(String order);
}
2. Nike.java에 실행할 메소드 생성
public class Nike {
public void register(Form form) {
String[] menus = form.getMenu();
System.out.println("=====상품 목록=====");
for (int i = 0; i < menus.length; i++) {
System.out.println(i + 1 + ". " + menus[i]);
}
form.sell("티셔츠");
}
}
3. DepartmentStore.java에서 익명클래스를 이용하여 실행
public class DepartmentStore{
public static void main(String[] args) {
Nike gangnam = new Nike();
gangnam.register(new Form() {
@Override
public void sell(String order) {
String[] menus = getMenu();
for (int i = 0; i < menus.length; i++) {
if(order.equals(menus[i])) {
System.out.println(order + " 판매 완료");
}
}
}
@Override
public String[] getMenu() {
String[] menus = {"티셔츠", "신발", "바지", "가방"};
return menus;
}
});
}
}
![](https://blog.kakaocdn.net/dn/bbfZeZ/btrvuP2qmyk/rnZf7FXH8pdP1GKZxtgz20/img.png)
'웹 개발 > Java' 카테고리의 다른 글
[Web_JAVA] 25 (0) | 2022.03.11 |
---|---|
[Web_JAVA] 24 (0) | 2022.03.10 |
[Web_JAVA] 22 (0) | 2022.03.08 |
[Web_JAVA] 21 (0) | 2022.03.07 |
[Web_JAVA] 20 (0) | 2022.03.06 |