본문 바로가기

웹 개발/Java

[Web_JAVA] 23

● 모호성(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();

	}
}

 

결과

 

 

 

 

실습(마커 인터페이스)

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);
	}
	
}

 

결과

 

 

 

 

실습(익명 클래스(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();
		
	}
}

 

결과

 

 

 

 

실습(익명 클래스(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;
			} 
		});
		
	}
}

 

결과
 
 

 

 

'웹 개발 > 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