📖 추상클래스 Abstract class 예제
package day14;
// 추상클래스
abstract class Super{ // 부모클래스
abstract void add(); // 추상메소드 (메소드의 선언부; 로 구성되며 구현부 없음)
int a = 10; // 인스턴스 변수
void ddd() { //선언부 // 메소드
// 구현부
}
}
class Sub extends Super{ // a, ddd(), @add()
void add() {} // 구현부를 작성하여 abstract 키워드 삭제
}
public class AbstEx01 {
public static void main(String[] args) {
//Super s = new Super(); // 추상클래스 객체 생성 불가
Sub s = new Sub();
System.out.println(s.a);
s.add(); // 오류 없이 실행 됨
}
}
🖥️ console 출력 화면
🔈 추상메소드가 클래스에 하나라도 있으면 추상클래스로 abstract 키워드를 붙여줘야한다. 상속받은 추상클래스안에 추상메소드를 구현하게 되면 일반클래스가 되어 abstract 키워드를 없애줘야 한다. 추상클래스 안에는 추상메소드 외에 일반 멤버(필드,메소드)를 같이 작성할 수 있다.
추상클래스는 객체 생성이 불가하지만 일반클래스로 상속받아 구현시킨 자식클래스는 객체 생성이 가능하고, 필드 실행이 가능하다.
📘 추상클래스, 상속 문제
추상클래스 Calculator를 상속받은 MyCalc 클래스를 구현하세요
package day14;
abstract class Calculator {
(public abstract) int add(int a, int b); // 두 정수의 합리턴
(public abstract) int substract(int a, int b); // 두 정수의 차를 리턴
(public abstract) double average(int[] a); // 배열에 저장된 정수의 평균값 리턴
//(publc abstract)는 생략가능
}
// 일반클래스로 상속받아서, 추상메소드 모두 구현시켜서 객체생성후 사용
class MyCalc extends Calculator{
// 추상메소드 전부 오버라이딩
public int add(int a, int b) {
return a+b; // 구현부 작성
}
public int substract(int a, int b) {
return a-b; // 구현부 작성
}
public double average(int[] a) {
int tot = 0; // 구현부 작성
for(int i = 0; i < a.length; i++) {
tot += a[i];
}
double avg = (double)tot/a.length;
return avg;
}
}
public class AbstEx02 {
public static void main(String[] args) {
MyCalc mycalc = new MyCalc(); // 자식클래스 객체 생성
//int [] calcArr = new int[]{1,2,3,4,5,};
System.out.println("두 수의 합: " + mycalc.add(10, 5));
System.out.println("두 수의 차: " + mycalc.substract(10, 5));
System.out.println("배열 평균: " + mycalc.average(new int[] {1,2,3,4,5})); // 베열 변수 선언하여 넣지않고 바로 객체 생성하여 넣은것
}
}
🖥️ console 출력화면
🔈 추상클래스를 전부 잘 구현하면 오류 없이 실행된다.
📖 인터페이스 interface 예제
package day14;
interface Test { // 인터페이스는 class가 아닌 interface 키워드를 사용하여 만듬
//public static final int NUM = 1; // 상수
//public abstract void add(); // 추상메소드
// 생략 가능
final int NUM = 1; // 상수
void add(); // 추상메소드
}
interface Test2{
void sub();
}
class A {}
class B {}
class Inter extends A implements Test, Test2 { // 다중구현도 되고 상속도 받을 수 있음, class니까 상속은 하나 받을 수 있음
public void add() { // 부모 Test interface의 추상메소드는 public 이기 때문에 public으로 오버라이딩
System.out.println("implements");
}
public void sub() {
System.out.println("Test2");
}
}
public class InterEx01 {
public static void main(String[] args) {
Inter i = new Inter();
i.add();
//System.out.println(i.NUM);
//System.out.println(Test.NUM); // 상수는 바로 사용 가능
// 다형성
Test t = new Inter();
Test t2 = new Inter();
A a = new Inter(); // 부모타입 변수에 넣어 객체 생성 가능
}
}
📘 상속 문제
#1. 아래 main()메소드 #1번과 아래 실행결과를 참고하여 TVClass를 상속받은 ColorTV클래스를 작성하세요.
실행결과 : 32인치 1024컬러
#2. 위 1번 문제를 푼후, main()메소드 #2번과 아래 실행결과를 참고하여 ColorTV를 상속받는 IPTV클래스를 작성하세요. 실행결과 : 나의 IPTV는 192.1.1.2 주소의 32인치 2048컬러
package day14;
class TVClass {
private int size;
public TVClass(int size) { this.size = size; }
protected int getSize() { return size; }
}
class ColorTV extends TVClass{
private int color;
ColorTV(int size, int color){
super(size);
this.color = color;
}
int getColor() { return color; }
void printProperty() {
System.err.println(getSize() + "인치 " + color + "컬러");
}
}
class IPTV extends ColorTV{
private String IPadress;
IPTV(String IPadress, int size, int color){
super(size, color);
this.IPadress = IPadress;
}
@Override
void printProperty() {
System.out.println("나의 IPTV는 " + IPadress + "주소의 " + "인치 " + getColor() + "컬러");
}
}
public class ClassTest10 {
public static void main(String[] args) {
//#1.
ColorTV myTV = new ColorTV(32, 1024);
myTV.printProperty();
//#2.
IPTV iptv = new IPTV("192.1.1.2 ", 32, 2048);
iptv.printProperty();
}
}
🖥️ console 출력
📘 추상클래스 문제 (1) 난이도 下
#1. Converter클래스를 상속받아 원화를 달러로 변환하는 Won2Dollar 클래스를 작성하세요.
main()메소드의 #1번 코드와 아래 콘솔 출력예를 참고하세요.
콘솔출력예)
원을 달라로 바꿉니다.
원을 입력하세요>> 24000 (<-사용자가 값 입력)
변환결과: 20.0달러 입니다
#2. Converter 클래스를 상속받아 Km를 Mile(마일)로 변환하는 Km2Mile 클래스를 작성하세요.
main()메소드 #2번 코드와 아래 콘솔 출력예를 참고하세요.
콘솔출력예)
Km을 mile로 바꿉니다.
Km을 입력하세요>> 30(<-사용자가 값 입력)
변환결과: 18.75mile입니다
package day14;
import java.util.Scanner;
abstract class Converter {
abstract protected double convert(double src); // 추상메소드
abstract protected String getSrcString(); // 추상메소드
abstract protected String getDestString(); // 추상메소드
protected double ratio; // 비율
public void run() {
Scanner scanner = new Scanner(System.in);
System.out.println(getSrcString() + "을 "+getDestString()+ "로 바꿉니다.");
System.out.print(getSrcString() + "을 입력하세요>> ");
double val = scanner.nextDouble();
double res = convert(val);
System.out.println("변환결과: "+res+getDestString()+"입니다");
scanner.close();
}
}
class Won2Dollar extends Converter{
Won2Dollar(int won){
this.ratio = won;
}
@Override
protected double convert(double src) {
return src / ratio;
}
@Override
protected String getSrcString() { // 입력받은 돈
return "원";
}
@Override
protected String getDestString() { // 바꿀 돈
return "달라";
}
}
class Km2Mile extends Converter{
Km2Mile(double mile){
ratio = mile;
}
@Override
protected double convert(double src) {
return src / ratio;
}
@Override
protected String getSrcString() {
return "Km";
}
@Override
protected String getDestString() {
return "mile";
}
}
public class ClassTest11 {
public static void main(String[] args) {
//#1. (실행시 #2 주석처리하고 실행할 것)
//Won2Dollar toDollar = new Won2Dollar(1200); // 1달러는 1200원
//toDollar.run();
//#2. (실행시 #1 주석처리하고 실행할 것)
//Km2Mile toMile = new Km2Mile(1.6); // 1마일은 1.6km
//toMile.run();
}
}
🖥️ console 출력
📘 상속, 생성자 문제 (1)
Point를 상속받아 색을 가진 점을 나타내는 ColorPoint 클래스를 작성하세요.
main()메소드 적힌 코드들을 포함하고 아래와 같은 실행결과 출력되게 만드세요.
실행결과: RED색의 (10,20)의 점입니다.
package day14;
class Point {
private int x, y; // 인스턴스변수
public Point(int x, int y) { this.x = x; this.y = y; } // 매개변수 두개를 받는 생성자
public int getX() { return x; } // int 타입의 메소드 : 리턴 x
public int getY() { return y; } // int 타입의 메소드 : 리턴 y
protected void move(int x, int y) { this.x = x; this.y = y; } // 같은클래스&자식클래스 접근 가능 메소드 return 없음
}
class ColorPoint extends Point{
private String color;
ColorPoint(int x, int y, String color){
super(x,y);
this.color = color;
}
void setXY(int x, int y){
move(x,y);
}
void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return color +"색의 ("+ getX() + "," + getY() + ")의 점";
}
}
public class ClassTest12 {
public static void main(String[] args) {
ColorPoint cp = new ColorPoint(5, 5, "Yellow");
cp.setXY(10,20);
cp.setColor("RED");
String str = cp.toString();
System.out.println(str+"입니다.");
}
}
🖥️ console 출력
📘 상속, 생성자 문제 (2)
Point1를 상속받아 색을 가진 점을 나타내는 ColorPoint1 클래스를 작성하세요.
main()메소드 적힌 코드들을 포함하고 아래와 같은 실행결과 출력되게 만드세요.
실행결과: BLACK색의 (0,0)의 점입니다.
RED색의 (5,5)의 점입니다.
package day14;
class Point1 {
private int x, y;
public Point1(int x, int y) { this.x = x; this.y = y; }
public int getX() { return x; }
public int getY() { return y; }
protected void move(int x, int y) { this.x = x; this.y = y; }
}
class ColorPoint1 extends Point1 {
private String color;
ColorPoint1(){
super(0,0);
setColor("BLACK");
};
ColorPoint1(int x, int y){
super(x,y);
}
void setXY(int x, int y) {
move(x,y);
}
void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return color + "색의 (" + getX() + "," + getY() +")의 점";
}
}
public class ClassTest13 {
public static void main(String[] args) {
ColorPoint1 zeroPoint = new ColorPoint1(); // (0,0) 위치의 BLACK 색 점
System.out.println(zeroPoint.toString() + "입니다.");
ColorPoint1 cp = new ColorPoint1(10,10); // (10,10) 위치의 BLACK 색 점
cp.setXY(5,5);
cp.setColor("RED");
System.out.println(cp.toString() + "입니다.");
}
}
🖥️ console 출력
📘 상속, 생성자 문제 (3)
Point2를 상속받아 3차원의 점을 나타내는 Point3D 클래스를 작성하세요.
main()메소드 적힌 코드들을 포함하고 아래와 같은 실행결과 출력되게 만드세요.
실행결과:
(1,2,3)의 점입니다.
(1,2,4)의 점입니다.
(10,10,3)의 점입니다.
(100,200,300)의 점입니다.
package day14;
class Point2 {
private int x, y;
public Point2(int x, int y) { this.x = x; this.y = y; }
public int getX() { return x; }
public int getY() { return y; }
protected void move(int x, int y) { this.x = x; this.y = y; }
}
class Point3D extends Point2{
private int z;
Point3D(int x, int y, int z){
super(x,y);
this.z = z;
}
void moveUp() {
this.z++;
return;
}
void moveDown() {
this.z--;
return;
}
@Override
protected void move(int x, int y) {
super.move(x, y);
}
protected void move(int x, int y, int z) {
super.move(x,y);
this.z = z;
}
@Override
public String toString() {
return "("+getX()+","+getY()+","+z+")의 점";
}
}
public class ClassTest14 {
public static void main(String[] args) {
Point3D p = new Point3D(1,2,3); // 1,2,3은 각각 x,y,z축의 값.
System.out.println(p.toString() + "입니다.");
p.moveUp(); // z 축으로 위쪽 이동
System.out.println(p.toString() + "입니다.");
p.moveDown(); // z 축으로 아래쪽 이동
p.move(10, 10); // x,y 축으로 이동
System.out.println(p.toString() + "입니다.");
p.move(100,200,300); // z, y, z 축으로 이동
System.out.println(p.toString() + "입니다.");
}
}
🖥️ console 출력
🔈
📘 상속, 생성자 문제 (4)
Point3를 상속받아 양수의 공간에서만 점을 나타내는 PositivePoint 클래스를 작성하세요. main()메소드 적힌 코드들을 포함하고 아래와 같은 실행결과 출력되게 만드세요.
실행결과:
(10,10)의 점입니다.
(10,10)의 점입니다.
(0,0)의 점입니다.
package day14;
class Point3 {
private int x, y;
public Point3(int x, int y) { this.x = x; this.y = y; }
public int getX() { return x; }
public int getY() { return y; }
protected void move(int x, int y) { this.x = x; this.y = y; }
}
class PositivePoint extends Point3{
static private int tmpx;
static private int tmpy;
PositivePoint() {
super(0,0);
}
PositivePoint(int x, int y) {
super(tmpx+x,tmpy+y);
}
@Override
protected void move(int x, int y) { // 접근자가 동일하거나 좁아야함
if(x < 0 || y < 0) {
}else {
tmpx = getX() + x;
tmpy = getY() + y;
super.move(tmpx, tmpy);
return;
}
}
@Override
public String toString() {
return "("+getX()+","+getY()+")의 점";
}
}
public class ClassTest15 {
public static void main(String[] args) {
PositivePoint p = new PositivePoint();
p.move(10, 10);
System.out.println(p.toString() + "입니다.");
p.move(-5, 5); // 객체 p는 음수 공간으로 이동되지 않음
System.out.println(p.toString() + "입니다.");
PositivePoint p2 = new PositivePoint(-10, -10);
System.out.println(p2.toString() + "입니다.");
}
}
🖥️ console 출력
🔈
📘 인터페이스 문제
Stack 인터페이스를 상속받아 문자열을 저장하는 StringStack 클래스를 구현하세요.
아래와 같은 실행결과가 나오도록 main()을 참고하여 작성하세요.
실행결과: 총 스택 저장 공간의 크기 입력 >> 3 (사용자가 입력)
문자열 입력 >> hello
문자열 입력 >> sunny
문자열 입력 >> smile
문자열 입력 >> happy 스택이 꽉 차서 푸시 불가!
문자열 입력 >> 그만
스택에 저장된 모든 문자열 팝 : smile sunny hello
🖥️ console 출력
🔈
📘 추상 클래스 (2) 난이도 上
아래와 같이 4개의 멤버(필드와 메소드)를 가진, 4개의 클래스 Add,Sub,Mul,Div 를 작성하세요.
- int타입의 a, b 필드 : 2개의 피연산자 저장할 변수
- void setValue(int a, int b) : 피연산자 값을 객체 내에 저장
- int calculate() : 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
그런데, 각각의 클래스마다 공통된 필드와 메소드가 존재하는 구조이므로,
Calc라는 이름의 추상클래스를 작성하여 Calc를 상속받아 각 4개의 클래스를 작성해보세요.
그리고, main()메소드에서 실행예시와 같이 2개의 정수와 연산자를 입력받은 후,
4개의 클래스중 적합한 연산을 처리할 수 있는 객체를 생성하고 메서드 호출하여
그 결과 값을 화면에 출력하게 작성 해보세요.
실행 예시 :
두 정수와 연산자를 입력하세요 >> 5 7 + 12
🖥️ console 출력
🔈
'basic > java 실습' 카테고리의 다른 글
day 15 예제 및 문제 - 예외처리 Exception handling (0) | 2021.05.13 |
---|---|
day 15 예제 및 문제 - 싱글톤Singleton, 내부클래스 inner class (0) | 2021.05.12 |
day 13 예제 및 문제- 상속과 생성자, 메소드 오버라이딩 (0) | 2021.05.10 |
day 12 연습문제(2) - class(지금까지 배운 것 전부 활용)(난이도중하) (0) | 2021.05.07 |
day 12 연습문제(1) - 상속, final 키워드 (0) | 2021.05.07 |