유블로그

[Java] Abstract, Interface 본문

Java

[Java] Abstract, Interface

yujeong kang 2020. 8. 12. 10:52

추상 - abstract, 구현이 안된 것

abstract 키워드 : 클래스(O), 메서드(O), 변수(X. 변수에는 '구현이 되었다 / 안되었다' 라는 개념이 없음)
abstract class 클래스명 : 추상클래스
abstract method : 추상메서드

추상 클래스는 객체 생성(new)이 불가능, 상속(자식클래스)을 이용해서 활용
추상클래스 객체변수 = ?? (new 추상클래스 (X))
추상클래스 객체변수 = ?? (new 추상클래스를 상속한 자식클래스 (O))

추상클래스는 일반 메서드 + 추상메서드 로 구성될 수 있다. -> 인터페이스와 가장 큰 차이점. 인터페이스는 일반 메서드 선언 불가능
추상메서드는 메서드의 구현부를 정의하면 안된다(바디 : {})
ex > void print(); (X - { } 없음)
abstract void print(); (O - 추상메서드는 { } 없어야 한다.)
abstract void print(){} (X - 아예 괄호가 없어야 됨. 괄호유무로 구현여부 판단)


추상클래스를 상속하는 자식 클래스가 반드시 처리해야 하는 일

: 부모클래스의 추상(구현안된것)메서드를 "오버라이딩"!!

 

 

abstract class AbsSuper {	// 구현 안 된 클래스(추상클래스)
	String name = "AbsSuper";
	
//	abstract int v;		// 에러발생 : 변수와 함께 사용 불가능
	public void call() {//구현 된 일반 메서드
		System.out.println("Parent call()");
	}
//	public void print();	// 에러발생 : 메서드 바디 필요함(일반 메서드)
	public abstract void print();	// 추상메서드
//	public abstract void test(); {}	// 에러발생 : 메서드 바디 삭제 필요함(추상메서드)
}

class AbsSub extends AbsSuper {
	String name = "AbsSub";
	
	@Override
	public void print() {	//   AbsSuper의 추상메서드를 여기서 구현
		System.out.println("자식 클래스의 PRINT()");
	}
	
	public void eat() {
		System.out.println("식사하다");
	}
		
}
public class Test01 {
	public static void main(String[] args) {
//		AbsSuper as = new AbsSuper();	// 불가능
		AbsSuper as = new AbsSub();		// 자식 클래스에 가능
		// 부모 = 자식 -> 업캐스팅, 묵시적형변환
		
		System.out.println(as.name);	// AbsSuper 나옴..  변수는 무조건!!! 내거!!!!!!!!!!!!! 원래 타입이 AbsSuper니까 AbsSuper의  name!!! 호출됨!!!!!!
		as.call();		// call 함수 AbsSuper 에만 있으니까 !!!! AbsSuper의 call 호출!
		as.print();		// Abs.print 실행됨
//		as.eat();		// 에러남. AbsSuper에는 eat 없으니까!!
		
	}
}

 


인터페이스에 선언되는 모든 변수는 상수로 인식 

- public static final 키워드 자동 추가됨.

인터페이스에 선언되는 메서드는 추상메서드로 인식
- public abstract 키워드 자동 추가됨.

 

interface ServerInfo {
	/*public static final*/ String IP = "192.168.0.110";
	/*public abstract*/ void call();	// 자동으로 추상메서드 되기 때문에 구현부 없어도 에러 안남. 다른 클래스에서 이 메서드를 구현할 때 public 필수
//	void call() {}	// 에러발생 : 인터페이스에는 '구현된 메서드' 불가능
}

public class Test02 {
	public static void main(String[] args) {
		System.out.println(ServerInfo.IP);// 'Server.'으로 호출 가능하다는 것은 static 의 성질
		
//		ServerInfo.IP = "122";	// 값을 변경할 수 없다는 것으로 final 성질 확인
		
	}
}

 

- 인터페이스는 객체 생성이 불가능
- 인터페이스를 활용하기 위해서는 자식 클래스 이용
- 자식클래스는 인터페이스의 메서드를 재정의 해야 한다. (static - 재정의 불가능, default - 메서드 선택)

 

interface A{
	void a();
}
interface B{
	void b();
}
interface C extends A, B{
	void c();
}

class Child implements C {	// 구현되지 않은 모든 메서드를 필수로 구현해야 한다.
//	void c() {}	// 에러 발생 : public 있어야 한다! (interface에는 "public abstract void c();" 라고 되어있기 때문)
	public void a() { System.out.println("A 메서드"); }
	public void b() { System.out.println("B 메서드"); }
	public void c() { System.out.println("C 메서드"); }
}

public class Test03 {
	public static void main(String[] args) {
//		C c = new C();	// 에러 발생 : 인터페이스는 객체 생성 X

		/*
		 	기억해야할 것은
		 	부모 A , 자식 B일때
		 	A a = new B()	라고 했다면 
		 	a.~~ 하면
		 	변수는 무조건 A 거 쓰고
		 	함수는 B에 오버라이딩 되어있을 경우 B거 사용, 오버라이딩 안되어 있을 경우 A거 사용
		 */
		
		A a = new Child();
		a.a();	// 메서드 1개. 
		
		B b = new Child();
		b.b();	// 메서드 1개
		
		C c = new Child();
		c.a();	// 메서드 3개
		c.b();
		c.c();
	}
}
interface AIMachine {
	void work();
	void tell();
	default void music() {	// java8부터 지원. 오버라이딩 필수 X
		System.out.println("아직 지원되지 않는 기능입니다.");
	}
	static void common() {	// java8부터 지원.
		System.out.println("인터페이스에서 공통으로 사용하는 기능 정의");
	}
}

class AIMachine01 implements AIMachine {
	@Override
	public void work() {	}

	@Override
	public void tell() {	}
	
	@Override
	public void music() {	}
}

class AIMachine02 implements AIMachine {	// 여기에는 void music() 없는데도 오류 안 남!
	@Override
	public void work() {	}

	@Override
	public void tell() {	}
}

public class Test04 {
	public static void main(String[] args) {
    		AIMachine.common();	// 인터페이스명으로 바로 접근 가능.
		
		AIMachine ai = new AIMachine02();
		ai.music();	// 클래스에 정의안하고도 default 접근 가능.
	}
}

'Java' 카테고리의 다른 글

[Java] 내부 클래스  (0) 2020.08.12
[Java] final  (0) 2020.08.12
[Java] 예외(Exception)  (0) 2020.08.11
[Java] Iterator  (0) 2020.08.11
[Java] Collections (+Generic)  (0) 2020.08.11