본문 바로가기
Java

2022-09-13 자바 수업 (interface,implements)

by allwing12 2022. 9. 13.

 

interface = 자식 클래스에게 강제로 구현을 요구할 수 있음
interface 안에서는 추상메소드만 사용이 가능하다 완전 강제성을 띄는거라고 보면 된다.
그리고 상속인 extends 처럼 해당 클래스에 implements 를 통해서 사용이 가능하다.

 

이를 사용한게 자바에서는 다중상속이 되지 않기 때문에 이 부분을 해결하기 위해서 interface를 사용하는데
다중상속을 해결하기 위해서 interface를 사용해서 해결을 하지만 일단 extends 같은 상속처럼

메소드 공유를 하기 보다는 어차피 implements를 통해 받은 클래스에게 구현을 직접해줘야한다.

 

class Main {
    public static void main(String[] args) {
    사람 a사람 = new 홍길동();
    차 a차 = new 차 ();
  }
}

class 사람 {
	void 말하다 () {
    
    }
}
class 차 {

}
class 홍길동 extends 사람 {

}

 

예를 들어서 extends로 받는 홍길동은 사람의 void 말하다 라는 메소드를 기본적으로 내장하고 있을거다

그래서 위의 코드 안에서 홍길동이라는 class 안에는 메소드가 1개 기본 내장이 되어있다

하지만 위와 똑같은 상황이지만 interface 라면 메소드가 없다고 보면 되고 void 말하다 라는 메소드를

똑같이 또 써줘야 한다고 보면 된다.

 

class Main {
    public static void main(String[] args) {
        사람 a사람 = new 홍길동();
        변호사 a변호사 = (변호사)a사람;
        치과의사 a치과의사 = (치과의사)a사람;
        성화봉송자 a성화봉송자 = (성화봉송자)a사람;
    }
}
class 사람 {

}
class 홍길동 extends 사람 implements 성화봉송자, 치과의사, 변호사 {

}
interface 변호사 {

}
interface 치과의사 {

}
interface 성화봉송자 {

}

 

interface를 활용해서 다중상속을 하는 것을 푸는 큰 예시의 문제이다.

위 처럼 class 가 아닌 interface 변호사, interface 치과의사, interface 성화봉송자 등으로 사용할 수 있고

이 것들을 전부 상속하기 위해서는 implements 를 사용해서 상속을 할 수 있다.

하지만 아까 말한 것 처럼 메소드를 사용하기 위해서는 상속받는 class 인 홍길동에게도 메소드를

직접 구현을 해줘야 사용을 할 수 있다.

 

그렇다면 자바에서는 왜 다중상속이 안되는지 이유를 알아야 할텐데 그 이유는

 

class Main {
	public static void main(String[] args) {
		System.out.println("하이");
	}
}
class 사람 {
	void 말하다 () {
		System.out.println("말하다");
	}
	
}

class 변호사 {
	void 말하다 () {
		System.out.println("변호사가 말하다");
	}
}

class 홍길동 extends 사람,변호사 {
	
}

 

정말 만약 이게 되는 코드라고 가정을 했을 때 똑같은 void 말하다가 있어서 어떤 것을 실행해야하는지 모른다

그렇기 때문에 자바에서는 다중상속이 안되며 물론 자바에서 안되는거지 다중상속이 되는 언어도 있다고 한다.

하지만 그게 어떤건지는 내가 해본적이 없어서 모르겠다...

 

그렇기 때문에 이런 부분은 interface를 통해서 풀 수 있으며 그 부분은

 

class Main {
	public static void main(String[] args) {
		System.out.println("하이");
	}
}
class 사람 {
	void 말하다 () {
		System.out.println("말하다");
	}
	
}

interface 변호사 {
	void 말하다 () {
		System.out.println("변호사가 말하다");
	}
}

class 홍길동 extends 사람 implements 변호사{
	void 말하다 () {
		System.out.println("변호사가 말하다");
	}
}

 

 

아래와 같이 하여 풀 수 있다, 위에서 말한 것 처럼 interface 는 implements를 사용하여 상속처럼 사용할 수 있고

실행하려는 것을 개발자가 직접 구현을 해줘야하기 때문에 직접 구현한거다 물론 위의 코드는 실행하면

Main 클래스의 System.out.println 으로 출력한 하이가 나오며 위의 코드는 참고 차 작성한거다.

interface는 객체생성을 못한다 (사람 a사람 = new사람();) 이런것 처럼 객체 생성이 안된다.

 

댓글