본문 바로가기

웹 개발/Java

[Web_JAVA] 22

● 추상 클래스

- 필드 안에 구현이 안된 메소드가 선언되어 있는 클래스를 추상 클래스라고 한다.

- 이 때 구현되지 않은 메소드를 추상 메소드라고 부른다.

- 반드시 재정의를 통해 구현해야 메모리에 할당되기 때문에 "강제성"을 부여하기 위해서 추상 메소드로 선언한다.

 

※ 일반 메소드도 선언 가능하다.

 

 

 

● 추상 클래스 선언

abstract class 클래스명 {

    abstract 리턴타입 메소드명(자료형 매개변수, ...);

}

 


 

● 인터페이스 : 틀

- 추상 클래스를 고도화 시킨 문법

- 상수와 추상메소드만 존재한다.

- 구현은 인터페이스를 지정한 클래스에서 진행하고,

   인터페이스를 다른 클래스에 지정할 때에는 implements 키워드를 사용한다.

 


 

● 추상 클래스와 인터페이스 간의 관계

- 인터페이스를 클래스에 바로 지정하면 모든 메소드에 강제성이 부여되서 전부 다 구현해야 한다.

- 하지만 일반적인 상황에서는 모든 것이 아닌, 필요한 메소드를 골라서 재정의해야한다.

- 인터페이스를 직접 지정하지 않고 다른 클래스에 지정한 후 바디를 만들어 놓는다면 강제성이 소멸되고,

   이 클래스를 상속받아서 필드를 구현한다면, 골라서 재정의할 수 있게 된다.

- 이 때 중간에서 강제성을 없애주는 클래스를 추상 클래스로 선언하며,

   클래스 이름 뒤에 Adapter를 붙여서 목적을 알려준다.

 


 

● 다중 상속

- 여러 부모 클래스를 상속하는 것을 다중 상속이라고 한다.

- JAVA는 모호성 때문에 다중 상속을 지원하지 않는다.

- 하지만 JDK8버전 부터는 인터페이스에 default 메소드 선언을 허용하며,

   여러 개를 지정할 수 있는 인터페이스 특성 상 다중 상속을 지원하는 것이나 다름이 없다.

 

 


 

실습(추상 클래스)

1. 추상 클래스(Electronics.java)를 생성한다.

public abstract class Electronics {  // abstract : 추상 클래스
	
	// 추상메소드(선언 O, 구현 X) 
	abstract void on();
	abstract void off();
	
	// final -> 재정의하지 말아라 
	final void intro() {
		System.out.println("안녕 난 전자제품이야.");
	}
	
}

 

 

 

2. 추상 클래스를 상속받는 클래스를 생성하여 추상 메소드를 재정의한다.

- WashingMachine.java

public class WashingMachine extends Electronics{


	// 추상 클래스의 추상메소드 재정의
	@Override
	void on() {
		off(); 
	}
    
	// 추상 클래스의 추상메소드 재정의
	@Override
	void off() {
		System.out.println("전원 누르기");
	}
	
}

 

 

- Refrigerator.java

public class Refrigerator extends Electronics{

	@Override
	void on() {
		System.out.println("스위치를 올린다.");
	}

	@Override
	void off() {
		System.out.println("스위치를 내린다.");		
	} 
	
}

 

 

 

 

실습(인터페이스)

1. 인터페이스(Pet.java)를 생성한다.

public interface Pet { 
	
	final static int eyes = 2;  // final : 값을 변경할 수 없다.
	int nose = 1;  // 일반 변수
	
	abstract void sitDown();  // 추상 메소드
	void stop();  // 일반 메소드
	void poop();  // 일반 메소드
	void 빵야();  // 일반 메소드

}

 

 

 

2. 생성한 인터페이스를 사용하는 클래스를 생성하여 메소드를 재정의한다.

- Puppy.java

public class Puppy implements Pet { 

	@Override
	public void sitDown() {
		System.out.println("앉습니다.");
	}

	@Override
	public void stop() {
		System.out.println("기다립니다.");
	}

	@Override
	public void poop() {
		System.out.println("볼일을 보겠습니다.");
	}

	@Override
	public void 빵야() {
		System.out.println("총 맞은 것 처럼 눕습니다.");
	}

}

 

 

- Cat.java

public class Cat implements Pet{
	
	@Override 
	public void sitDown() {
		System.out.println("싫어");
	}

	@Override
	public void stop() {
		System.out.println("싫어");
	}

	@Override
	public void poop() {
		System.out.println("알아서 잘 한다.");
	}

	@Override
	public void 빵야() {
		System.out.println("손가락을 뭅니다.");
	}

}

 

 

 

 

실습(추상클래스(인터페이스의 강제성 제거))

1. 인터페이스(Pet.java)를 생성한다.

public interface Pet {
	final static int eyes = 2;
	int nose = 1;
	
	abstract void sitDown();
	void stop();
	void poop();
	void 빵야();
    
}

 

 

 

2. 생성한 인터페이스를 사용하는 추상 클래스를 생성하여 메소드를 재정의한다.

public abstract class PetAdapter implements Pet{ // 추상 클래스
	
	@Override
	public void sitDown() {
		
	}

	@Override 
	public void stop() {
		
	}

	@Override
	public void poop() {
		
	}

	@Override
	public void 빵야() {
		
	}
	
}

 

 

 

3. 위의 추상 클래스를 상속받는 클래스를 생성하여 일부 메소드만 재정의한다.

- 강제성이 사라졌으므로 일부만 재정의도 할 수 있게 된다.

public class Tiger extends PetAdapter{ 
	
	@Override
	public void poop() {
		System.out.println("알아서 한다.");
	}

}

 

 

 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 24  (0) 2022.03.10
[Web_JAVA] 23  (0) 2022.03.09
[Web_JAVA] 21  (0) 2022.03.07
[Web_JAVA] 20  (0) 2022.03.06
[Web_JAVA] 19  (0) 2022.03.05