클래스는 다중상속이 불가능하다. 오로지 단일 상속만 가능.(다중상속 금지.)
하나의 부모와 여러개의 자식은 가능. 반대는 불가능.
안되는 이유는 부모의 메소드중 어떤 것을 사용해야될지 알 수 없기 때문에
그치만 인터페이스는 다중상속이 가능하다.
인터페이스는 클래스를 통해서 “구현”을 한다.
package kr.s23.object.inter;
//인터페이스
interface A1{
//변수 X 상수O (앞에 다 fianal 같은 것이 생략되어있는것)
public static final int W = 10; //원형
int X = 20;
static int Y = 30;
final int Z = 40;
}
public class InterfaceMain01 {
public static void main(String[] args) {
//interface는 객체 생성이 불가능
//A1 ap = new A1();
//상수이기 때문에 변경이 불가능
//A1.X = 50;
System.out.println("W : "+ A1.W);
System.out.println("X : "+ A1.X);
System.out.println("Y : "+ A1.Y);
System.out.println("Z : "+ A1.Z);
}
}
W : 10
X : 20
Y : 30
Z : 40
package kr.s23.object.inter;
//인터페이스 -> 형식만 있고 내용이 없음.
//추상메서드만 선언가능. Java 8부터 인터페이스는 default 메서드와 static 메서드를 가질 수 있게 됨.
interface A2{
//추상메서드
public abstract void abc(); //원형 (public abstract은 생략가능) 중괄호가 없는 점.
void def();
}
//interface안에 추상메서드가 있기 때문에 클래스안에 자식 메서드를 구현해야됨. (추상 클래스는 일반 객체에 사용가능?)
//"B2 클래스는 A2 인터페이스를 구현한다" 즉 인터페이스를 구현하기 위한 보조역할.
class B2 implements A2 { //implements -> 클래스가 인터페이스를 구현하는 것을 선언하는 데 사용
//인터페이스의 추상메서드를 구현
@Override
public void abc() {
System.out.println("abc 메서드");
}
@Override
public void def() {
System.out.println("def 메서드");
}
}
public class InterfaceMain02 {
public static void main(String[] args) {
B2 bp = new B2();
bp.abc();
bp.def();
}
}
abc 메서드
def 메서드
package kr.s23.object.inter;
//인터페이스 : 형식만 있고 내용이 없음.
interface CookieMold{ //쿠키틀
//추상메서드
public abstract void makeStar();
public abstract void makeCircle();
public abstract void makeDiamond();
}
class Cookie implements CookieMold { //인터페이스의 추상메서드를 구현해주지 않으면 Cookie 의 빨간밑줄 즉, 에러가 생긴다.
//인터페이스가 형식을 제공하면 클래스에서 제공된 형식을 이용해 내용을 채운다.
//추상메서드를 구현
@Override
public void makeStar() {
System.out.println("별 모양의 쿠키를 만들다.");
}
@Override
public void makeCircle() {
System.out.println("원 모양의 쿠키를 만들다.");
}
@Override
public void makeDiamond() {
System.out.println("다이아몬드 모양의 쿠키를 만들다.");
}
}
public class InterfaceMain03 {
public static void main(String[] args) {
Cookie cookie = new Cookie();
cookie.makeCircle();
cookie.makeCircle();
cookie.makeDiamond();
}
}
원 모양의 쿠키를 만들다.
원 모양의 쿠키를 만들다.
다이아몬드 모양의 쿠키를 만들다.
package kr.s23.object.inter;
//인터페이스
interface I{
//추상메서드
public abstract void play();
}
//쿨래스
class Pianist implements I{ //implements가 아닌 extends를 쓰면 상속이 되는 것이기 때문에 아래처럼 구현을 못함.
@Override
public void play() {
System.err.println("피아노를 연주하다");
}
}
class Cellist implements I {
@Override
public void play() {
System.out.println("첼로를 연주하다");
}
}
class Stage {
public void autoPlay(I i) { //Object는 최상위기 때문에 두 개의 클래스를 모두 사용가능. 공통분모 Object O대신 I(interface) i를 사용
i.play();
}
}
public class InterfaceMain04 {
public static void main(String[] args) {
Stage a = new Stage();
a.autoPlay(new Pianist()); //Pianist -> I
//클래스타입 -> 인터페이스 타입으로 형변환이 됐다는 뜻
//자동적으로 형변환이 된 것
a.autoPlay(new Cellist()); //Cellist -> I
//클래스타입 -> 인터페이스 타입으로 형변환이 됐다는 뜻
//자동적으로 형변환이 된 것
}
}
피아노를 연주하다
첼로를 연주하다
package kr.s23.object.inter;
interface Inter1 {
public int getA();
}
interface Inter2 {
public int getB();
}
//인터페이스를 인터페이스에 상속 <implements를 쓰지않았기 때문에 Inter3에선 구현 불가>
interface Inter3 extends Inter1,Inter2{ //interface는 다중상속이 가능.
public int getData();//getA와 getB가 같이 들어와있는 것이라 생각.
}
interface Inter4 {
public String getMsg();
}
//인터페이스를 클래스에 다중 구현 가능
//클래스는 다중 상속 불가능(단일 상속만 인정)
public class InterfaceMain05 implements Inter3,Inter4{
@Override
public int getA() {
return 10;
}
@Override
public int getB() {
return 20;
}
@Override
public int getData() {
return 30;
}
@Override
public String getMsg() {
return "서울";
}
public static void main(String[] args) {
InterfaceMain05 it = new InterfaceMain05();
System.out.println(it.getA());
System.out.println(it.getB());
System.out.println(it.getData());
System.out.println(it.getMsg());
}
}
10
20
30
서울
'쌍용교육(JAVA) > JAVA' 카테고리의 다른 글
쌍용교육 -JAVA 수업 12일차 Member내부클래스 (0) | 2024.04.11 |
---|---|
쌍용교육 -JAVA 수업 12일차 enum (0) | 2024.04.11 |
쌍용교육 -JAVA 수업 11일차 Abstract추상클래스 (0) | 2024.04.11 |
쌍용교육 -JAVA 수업 11일차 StringTokenizer (0) | 2024.04.11 |
쌍용교육 -JAVA 수업 11일차 Calendar,Date (0) | 2024.04.11 |