Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

brograming

[JAVA] 추상클래스, 인터페이스_Day10 본문

Kosta

[JAVA] 추상클래스, 인터페이스_Day10

brograming 2023. 2. 27. 10:04

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