728x90
반응형

class 자식클래스 extends 부모추상클래스 (){}

 

상속케이스(확장,실체화)

1) Chc [extends] PaC

2) Chc [extends] PaAC

3) Chc [implements] PaI

4) ChI [extends] PaI

5) ChAC [ implements ] PaI

Color.java
package interfaceex;

class Triangle implements Color { //상속받은 자식클래스에서 재정의, 접근제어자 public 
	int color = 0; //변수. interface내 상수와 혼동x
	
	@Override
	public int getColor() {
		return color;
	}
	
	@Override
	public void setColor(int c) {
		color = c;
	}
}

public class ColorInterEx03 {
	public static void main(String[] args) {
		Triangle ref = new Triangle();
		ref.setColor(Color.RED);
		switch (ref.getColor()) {
		case 1:
			System.out.print("  빨간색");
			break; //switch케이스문의 종료
		case 2:
			System.out.print("  초록색");
			break;
		case 3:
			System.out.print("  파란색");
			break;
		}
		System.out.println(" 삼각형");
	}

}​
package interfaceex;

public interface Color {
	// public static final 생략된 것이므로 상수
	int RED = 1;
	int GREEN = 2;
	int BLUE = 3;
	
	// public abstract 생략된 것이므로 추상메소드
	void setColor(int c); 
	int getColor();

}​
  빨간색 삼각형​

 

 

POJO(Plain Old Java Object)

: 기존의 순수한 자바 객체
<조건>
1. 멤버필드가 (권장) private처리되어야 한다.
2. 멤버필드의 값을 설정하거나, 얻어갈 수 있는 public getter, setter 메소드가 존재해야 한다.
3. 
[접근제어자] [기타제어자] class 클래스명 {
   private 자료형 필드명;
   ....
   public 리턴타입 getter메소드(){ return 값; }
   public void setter메소드(매개변수){ 멤버필드 초기화 명령문 기술
   //this.멤버필드명 = 매개변수명;}
}
private int cnt;

public int getCnt {return cnt;}
public void setCnt(int cnt){this.cnt = cnt;}

Test.java

package interfaceex;

//PaTest pt = new PaTest(); //인터페이스는 객체생성 불가
//PaTest pt = new Test(); 

interface PaTest {
	String KIND = "사람"; //public static final 생략가능
	
	void trueKind(); //public abstract 생략가능 ->자식클래스에서 재정의
	
	void falseKind(); //public abstract 생략가능 ->자식클래스에서 재정의
}

public class Test implements PaTest {
	private String name; //private로 접근불가
	private int age;
	
	//단축키 : Alt + Shift + s
	//마우스우버튼 Source > Generate Constructor using Fields...
	public Test() {
	}
	
	public Test(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	//단축키 : Alt + Shift + s + r
	//마우스우버튼 Source > Generate Getters and Setters
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public void trueKind() {
		System.out.println(KIND + "입니다.");
	}

	@Override
	public void falseKind() {
		System.out.println(KIND + "이 아닙니다.");
	}

}




XInterEx06.java
package interfaceex;

class InterfaceClass implements Z { //{}중괄호 이내 자식 Override 메소드 기술해야함
	
	public void xmeth1() {
		System.out.println("xmeth1() 메소드의 구현");
	} 
	public void xmeth2() {
		System.out.println("xmeth2() 메소드의 구현");
	} 
	public void ymeth1() {
		System.out.println("ymeth1() 메소드의 구현");
	} 
	public void zmeth1() {
		System.out.println("zmeth1() 메소드의 구현");
	} 
} 



public class XInterEx06 {
	public static void main(String[] args) {
		InterfaceClass ic = new InterfaceClass();
		
		ic.xmeth1();
		ic.xmeth2();
		ic.ymeth1();
		ic.zmeth1();
	}

}
package interfaceex;

public interface X {
	void xmeth1(); //{}몸체없음, public abstract
	void xmeth2();

}

interface Y {
	void ymeth1(); 
}

interface Z extends X, Y { //두 개의 인터페이스 상속하는 경우에는 override하지 않음
	void zmeth1();
}
xmeth1() 메소드의 구현
xmeth2() 메소드의 구현
ymeth1() 메소드의 구현
zmeth1() 메소드의 구현

 

static메소드는 Override 안 됨.

 

인터페이스의 static메소드 또한 오버라이드 되지 않으며, 반드시 인터페이스명으로만 접근 가능함.

인터페이스 자료형으로 만든 객체명으로 접근 불가

상속받은 자식에서 재정의하지 않아도 사용가능하다.

 

인터페이스에 선언된 default메소드는 접근제어자와는 조금 다른 의미를 지닌다.

실제로는 public default로 기술해야하며, 몸체를 구현할 수 있다는 의미를 가진다.

상속받은 자식에서 재정의하지 않아도 사용가능하다.

 

인터페이스의 private메소드는 상속불가, 재정의 불가하다.

따라서 동일한 메소드가 자식에 존재해도 별도의 독립적인 영역의 메소드로 인식한다.

AInterEx04.java

package interfaceex;

class A1 implements A {
	int a = 10;
	static final int CONS = 2;
	//public A1(){} 숨김
	@Override
	public void display(String s) {
		System.out.println("display 메소드 구현 " + s);
	}
	@Override
	public void imd() {
		System.out.println("imd메소드 재정의");
	}
	//Override x
	static int stmd(int c) {
		return CONS+c;
	}
	//Override x	
	void pmd() {
		System.out.println("A1인터페이스 안의 pmd: " + CONS);
	}
}

public class AInterEx04 {
	public static void main(String[] args) {
		//인터페이스 타입의 객체는 인터페이스에서 선언된 상수와 메소드(오버라이드 포함)에만 접근
		
		A ob = new A1(); //p-c케이스
		ob.display("테스트1");
		System.out.println("A의 상수 값은 " + ob.CONS);
//		System.out.println("A1의 a 값 출력" + ob.a);
		System.out.println("A.CONS: " + A.CONS);
//		ob.pmd(); //private으로 접근불가
		//인터페이스의 static메소드는 객체명으로 접근 불가, 오버라이드 불가
//		System.out.println(ob.stmd(5));//인터페이스명. 으로 접근
		
		A1 ob2 = new A1();//c-c
		ob2.display("테스트2");
		ob2.pmd();
		ob2.dfmd("하하하");
		System.out.println("A의 상수 값은 " + ob2.CONS);
		System.out.println("A1.CONS: " + A.CONS); //인터페이스명.으로 접근
		System.out.println("A1의 a 값 출력 " + ob2.a);
		System.out.println("ob2.stmd(8) 결과 : "+ ob2.stmd(8)); //static
		System.out.println("A.stmd(7) 결과 : " + A.stmd(7));
	}

}

 

package interfaceex;

public interface A {
	final int CONS = 5; //public static 생략됨. final도 생략가능. 상수
	public void display(String s); //{}몸체가 없음 abstract
	void imd(); //public abstract 키워드 생략된 것임
	
	//[public] default가 원래 기술형식임
	default void dfmd(String str) { 
		System.out.println("A인터페이스 안의 dfmd메소드의 str변수 값: " + str + "와 CONS의 값: " + CONS);
	}
	//@Override 기술을 통해 재정의 여부 확인가능
	static int stmd(int c) { return CONS+c; } //static키워드가 붙은 메소드는 Override안 됨
	
	private void pmd() { //자바 9버전 이상부터 가능 //인터페이스 내 private은 상속되지않는다.
		System.out.println("A인터페이스 안의 pmd");
	}
	
}
display 메소드 구현 테스트1
A의 상수 값은 5
A.CONS: 5
display 메소드 구현 테스트2
A1인터페이스 안의 pmd: 2
A인터페이스 안의 dfmd메소드의 str변수 값: 하하하와 CONS의 값: 5
A의 상수 값은 2
A1.CONS: 5
A1의 a 값 출력 10
ob2.stmd(8) 결과 : 10
A.stmd(7) 결과 : 12


AInterEx05.java

package interfaceex;

class C1 implements A {
	public void display(String s) {
		System.out.println("클래스 C1 객체 이용 : " + s);
	}
	public void imd() {
		System.out.println("imd메소드 재정의");
	}
}

class C2 implements A {
	public void display(String s) {
		System.out.println("클래스 C2 객체 이용 : " + s);
	}
	public void imd() {
		System.out.println("imd메소드 재정의");
	}
}

class C3 implements A {
	public void display(String s) {
		System.out.println("클래스 C3 객체 이용 : " + s);
	}
	public void imd() {
		System.out.println("imd메소드 재정의");
	}
	@Override
	public void dfmd(String str) {
		int a = 5;
		System.out.println("C3클래스 안의 dfmd메소드의 str변수 값: " 
		+ str + "와 CONS의 값: " + CONS + "와 a의 값: " + a);
	}
	public void dfmd() {System.out.println("dfmd()메소드 오버로딩");}
	static int stmd(int a) {return CONS+a;}
	//상속관계에서도 메소드 오버로딩 가능하다.
}


public class AInterEx05 {
	public static void main(String[] args) {
		A memo; //A인터페이스 자료형 선언만
		memo = new C1();
		memo.display("안녕하세요? ");
		memo = new C2(); //주소값이 바뀜
		memo.display("알기쉽게 해설한 자바.");
		memo = new C3();
		memo.display("자바를 자바봅시다.");
		memo.dfmd("\"안녕 자바\"");
		System.out.println(A.stmd(5) + C3.stmd(1)); //static
//		System.out.println(A.stmd(2) + memo.stmd(1)); //인터페이스내 static 메소드는 객체명으로 접근불가
		
	}

}
클래스 C1 객체 이용 : 안녕하세요? 
클래스 C2 객체 이용 : 알기쉽게 해설한 자바.
클래스 C3 객체 이용 : 자바를 자바봅시다.
C3클래스 안의 dfmd메소드의 str변수 값: "안녕 자바"와 CONS의 값: 5와 a의 값: 5
16

 

728x90
반응형

+ Recent posts