TIL(2022.02.18)

조지성·2022년 2월 18일
0

TIL

목록 보기
35/78
post-thumbnail

추상클래스

  • 추상적인 것 (new 할 수 없다)
  • 추상클래스는 추상메서드 와 일반메서드 모두 작성할 수 있다
  • 추상메서드는 자식 클래스에서 무조건 구현해야한다.
package ch05;


//추상클래스는 추상메서드 와 일반메서드 모두 작성할 수 있고 추상메서드가 잇으면 자식클래스에서 추상메서드는 무조건 구현해야한다.
abstract class Animal{
	abstract void speak(); //추상메서드 (몸체가 없다)
	
	void Hello() {
		System.out.println("!!!");
	}
}

class Dog extends Animal{
	// 오버라이드 (Animal의 speak가 무효화)
	void speak() {
		System.out.println("멍멍");
	}
}

class Cat extends Animal{
	void speak() {}
}

class Bird extends Animal{

	//추상메서드를 부모가 가지고 있으면 자식은 추상메서드를 반드시 구현해야한다.
	@Override
	void speak() {
		System.out.println("짹짹");
	}
	
}

public class OOPEx07 {
	public static void main(String[] args) {
		Animal a1 = new Dog();
		Animal a2 = new Cat();
		a1.speak(); // 동적바인딩 된다. 왜? 부모의 메서드가 무효화 되니까
		Animal a3 = new Bird();
		a3.speak();
		
	}
}

추상클래스 미완성 설계도

package ch05;

abstract class 육식동물{
	void 걷기(){
		System.out.println("걷다");
	}
	
	//공격하는 방법은 다르기 때문에 미완성하게 작성
	abstract void 공격();
}

classextends 육식동물{

	@Override
	void 공격() {
		System.out.println("독으로 공격");
	}
	
}

class 사자 extends 육식동물{

	@Override
	void 공격() {
		System.out.println("이빨로 공격");
	}
	
}

public class OOPEx08 {
	public static void main(String[] args) {
		육식동물 u1 = new();
		육식동물 u2 = new 사자();
		
		u1.공격();
		u1.걷기();
		u2.공격();
		u2.걷기();
	}
}

인터페이스

  • 넓은 관점 인터페이스
    1. 일방적인 약속 2. 갑과 을이 존재하는 약속
  • 자바에서 인터페이스
    행위에 대한 제약

인터페이스와 추상클래스의 차이

인터페이스 : 행위에 대한 제약
추상클래스 : 미완성된 설계도

package ch05;

interface MoveAble{ //행위의 제약
	// 앞에 public abstract가 생략
	
	void();
	
	void 아래();
	
	void 왼쪽();
	
	void 오른쪽();
}

interface MoveAble2{ //행위의 제약
	// 앞에 public abstract가 생략
	
	void();
	
	void 아래();
	
	void 왼쪽();
	
	void 오른쪽();
	
	void 숨기();
	
	
}

// 인터페이스 구현이 자식 클래스로 위임될 수 있어서 강제 안됨
abstract class 사나운동물 implements MoveAble{
	abstract void 공격(); // 미완성된 함수
	
	@Override
	public void() {
		System.out.println("위로 이동");
	}
	@Override
	public void 아래() {
		System.out.println("아래로 이동");
	}
	@Override
	public void 왼쪽() {
		System.out.println("왼쪽으로 이동");
	}
	@Override
	public void 오른쪽() {
		System.out.println("오른쪽로 이동");
	}
}
// 인터페이스 구현이 자식 클래스로 위임될 수 있어서 강제 안됨
abstract class 온순한동물 implements MoveAble2{

	abstract void 채집(); // 미완성된 메서드

	@Override
	public void() {
		System.out.println("위");
		
	}

	@Override
	public void 아래() {
		System.out.println("아래");		
	}

	@Override
	public void 왼쪽() {
		System.out.println("왼쪽");		
	}

	@Override
	public void 오른쪽() {
		System.out.println("오른쪽");		
	}

	@Override
	public void 숨기() {
		System.out.println("숨기");		
	}
	
	
}

class 원숭이 extends 온순한동물 implements MoveAble{

	@Override//어노테이션  = JVM이 실행시에 분석해서 확인 = JVM의 힌트 = JVM이 실행 시 처리
	void 채집() {
		System.out.println("바나나 채집");
	}
	
}

classextends 온순한동물 implements MoveAble{

	@Override
	void 채집() {
		System.out.println("풀 채집");
		
	}
	
}

class 호랑이 extends 사나운동물 implements MoveAble{

	@Override
	void 공격() {
		System.out.println("이빨로 공격");
		
	}
	
}

class 코뿔소 extends 사나운동물 implements MoveAble{

	@Override
	void 공격() {
		System.out.println("뿔로 공격");
	}
	
}


public class OOPEx09 {
	static void 조이스틱(온순한동물 u1) {
		u1.숨기();
		u1.();
		u1.아래();
		u1.오른쪽();
		u1.왼쪽();
	}
	
	static void 조이스틱(사나운동물 u1) {
		u1.();
		u1.아래();
		u1.오른쪽();
		u1.왼쪽();
	}
	
	 public static void main(String[] args) {
		소 u1 = new();
		조이스틱(u1);
		
		원숭이 u2 = new 원숭이();
		조이스틱(u2);
		
		호랑이 u3 = new 호랑이();
		조이스틱(u3);
		
		코뿔소 u4 = new 코뿔소();
		조이스틱(u4);
	}
}
profile
초보 개발자의 성장기💻

0개의 댓글