brograming
[JAVA] 추상클래스, 인터페이스_Day10 본문
1. 추상클래스
추상 메서드를 1개라도 가지고 있으면 추상 클래스
클래스 abstract 키워드 사용
ㆍ완성이 안됐기 때문에 객체 생성 불가
ㆍ하위 클래스에 상속을 목적으로 함
ㆍ하위 클래스에 추상 메서드를 제공하여 각 하위 클래스마다 적합하게 재정의해 사용할 수 있도록 함
ㆍ하위 클래스에 아웃라인 제공
ㆍ추상클래스로부터 상속받은 모든 메서드를 사용해야 함. 사용하지 않을 경우 해당 클래스도 추상클래스가 됨
ㆍ모든 메서드가 추상메서드일 필요는 없음. 1개라도 가지고 있으면 추상클래스
ㆍ다형성 구현. 상속받은 클래스에 적합하게 오버라이딩 하도록 제공
package pocketmon;
public abstract class PocketMon2 {
protected String name;
protected int hp;
protected int exp;
protected int lv;
// 선언. 추상메서드
abstract public void eat(); // 추상메서드 : 메소드 구현없이 선언 / 하위 클래스에 상속이 목적. 구현은 하위클래스에서
abstract public void sleep();
abstract public boolean play(); // boolean 살았는지 죽었는지 확인
abstract public boolean exc();
abstract public void levelUp();
public void printStatus() {
System.out.println(name + "레벨체크");
System.out.println("hp : " + hp);
System.out.println("exp : " + exp);
System.out.println("lv : " + lv);
}
}
1)추상메서드
추상 메서드는 구현하지 않고 선언만 한 메서드
목적 : 하위클래스에 상속 및 제공
ㆍ구현은 하위클래스에서.
ㆍ메서드 abstract 키워드 사용
package Oop2;
// abstract 추상클래스
abstract class Parent{
// abstract 추상메서드 : 상속목적. 하위클래스가 자기한테 맞게 구현해서 사용하라
public abstract void f1(); // {}제외 : 구현하지 않음.
// 구현 메서드 포함 가능
public void f2() {
System.out.println("parent f2()");
}
}
class Child extends Parent{ // Child가 객체를 만드려면 상속받은 추상 메서드를 모두 구현
@Override
public void f1() {
// TODO Auto-generated method stub
System.out.println("Child에서 추상 메서드 구현");
}
public void f3() {
System.out.println("Child f3()"); //
}
}
public class ParentMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// Parent p = new Parent(); // 추상 클래스는 객체 생성 불가
Child c = new Child(); // 상속받은 추상 메서드 모두 구현 후 객체 생성 가능
c.f1();
c.f2();
c.f3();
Parent pc = new Child(); // 업캐스팅. 타입은 부모인테 메모리는 자식.
pc.f1(); // 재정의된 메서드 실행
pc.f2(); // f3()은 사용 불가
((Child)pc).f3(); // 다운 캐스팅 후 f3(); 사용 가능
}
}
2)추상클래스 예제
도형그리기
package Oop2;
//한개의 좌표
class Point {
int x;
int y;
public Point() {
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Point [x=" + x + ", y=" + y + "]";
}
}
//도형 그리기 클래스.
abstract class Shape { // 상속 목적으로 만들어진 추상 클래스
Point[] points; // 포함 관계
public abstract void draw(); // 하위 클래스에서 각 클래스(각 도형에 맞게끔)에 적합하게 구현
}
class Circle extends Shape {
int r; // 반지름
public Circle() {
points = new Point[1]; // 상속받은 포인트 배열을 생성
points[0] = new Point(5, 5); // 중심점
r = 10; // 반지름
}
// 파라미터로 받은 값으로 멤버변수 초기화
public Circle(Point[] arr, int r) {
points = arr;
this.r = r;
}
@Override
public void draw() {
System.out.println("원을 그림");
System.out.println("중심점 : " + points[0]);
System.out.println("반지름 : " + r);
}
}
class Triangle extends Shape {
public Triangle() {
points = new Point[] { new Point(1, 2), new Point(5, 6), new Point(9, 10) };
}
public Triangle(Point[] points) {
this.points = points;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("삼각형을 그림 \n3점의 좌표");
for (int i = 0; i < points.length; i++) {
System.out.println(points[i]);
}
}
}
class Rectangle extends Shape {
public Rectangle() {
points = new Point[] { new Point(3, 7), new Point(12, 56) };
}
public Rectangle(Point[] points) {
this.points = points;
}
@Override
public void draw() {
// TODO Auto-generated method stub
System.out.println("사각형을 그림 \n2점의 좌표");
for (int i = 0; i < points.length; i++) {
System.out.println(points[i]);
}
}
}
public class ShapeMain {
public static void main(String[] args) {
// Shape c1 = new Circle(); // default 생성자로 객체 생성
// c1.draw();
//
// // Point[] arr = new Point[] {new Point(6,9)}; // 초기화 해서 new Point[]객체 1개 생성.
// // ____________↓________________
// Shape c2 = new Circle(new Point[] {new Point(6,9)}, 7);
// c2.draw();
//
// Shape t1 = new Triangle();
// t1.draw();
// 각각의 도형객체를 만듬
Shape[] arr = { new Circle(), new Triangle(), new Rectangle(),
new Circle(new Point[] { new Point(4, 5) }, 8),
new Triangle(new Point[] { new Point(12, 23), new Point(45, 23), new Point(7, 9) }),
new Rectangle(new Point[] { new Point(5, 8), new Point(2, 7) }) };
for (int i = 0; i < arr.length; i++) {
arr[i].draw();
}
}
}
2. 인터페이스
interface 이름{
}
완전 추상 클래스
상수와 추상 메서드로만 구성
상속 키워드 : implements
ㆍ객체 생성 불가
ㆍ다중상속가능
ㆍ상속목적
ㆍ잭 역할 : 동일한 인터페이스를 상속받아서 다양한 형태로 구현한 객체들을 교체해서 사용하도록 연결. 이음매 역할을 함
ㆍ인터페이스를 상속받은 자식 클래스는 메서드를 모두 구현하여 객체 생성 가능
package Oop2;
interface InterTest{ // 모든 메서드는 추상메서드
public final static int MAX = 100; // 모든 멤버는 상수. 상수는 선언할 때 초기화 필요
int a = 234; // public final static이 없어도 상수로 처리 됨
void f1(); //public abstract 생략 가능
void f2();
void f3();
// public void f2() { // 구현 된 메서드는 에러가 남
// }
}
class InterTestImpl implements InterTest{
@Override
public void f1() {
// TODO Auto-generated method stub
System.out.println("f1()");
}
@Override
public void f2() {
// TODO Auto-generated method stub
System.out.println("f2()");
}
@Override
public void f3() {
// TODO Auto-generated method stub
System.out.println("f3()");
}
}
public class InterfaceTest {
public static void main(String[] args) {
InterTest t = new InterTestImpl(); // 업캐스팅해서 객체 생성
System.out.println("MAX : " + InterTest.MAX);
t.f1();
t.f2();
t.f3();
}
}
다중 상속 가능 예)
package Oop2;
interface A{
public void f1();
}
interface B{
public void f2();
}
// 인터페이스는 다중 상속 가능
class InterTest2 implements A, B{
@Override
public void f2() {
System.out.println("f1\2()");
}
@Override
public void f1() {
System.out.println("f1()");
}
}
public class InterTest2Main {
public static void main(String[] args) {
InterTest2 t = new InterTest2();
t.f1();
t.f2();
}
}
package Oop2;
import java.awt.Frame;
class Test extends Frame implements Runnable {
// @override
public void run() { // 쓰레드 실행 코드 작성
for (int i = 1; i <= 10; i++) {
//Frame
this.setTitle(i + "번째 타이틀");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class InterTest3Main {
public static void main(String[] args) {
Test t = new Test();
t.setSize(300, 200); // 윈도우 창 가로 세로 크기
t.setVisible(true); // 윈도우 보이기 설정
Thread th = new Thread(t); // 쓰레드 생성
th.start(); // 쓰레드 실행
}
}
'Kosta' 카테고리의 다른 글
| [Oracle]1 ~ 3장_Day14 (0) | 2023.03.06 |
|---|---|
| [JAVA] 예외처리, 입출력 스트림_Day12 (0) | 2023.03.02 |
| [JAVA] 컬렉션(Map)_Day11 (0) | 2023.02.28 |
| [JAVA] 반복자_Day11 (0) | 2023.02.28 |
| [JAVA] lang 패키지, 컬렉션(ArrayList)_Day10 (0) | 2023.02.27 |