본문 바로가기
코딩/수업 정리

20.12.15 Tue [017] 인터페이스 상속(디폴트,static,instanceof,marker), 추상클래스, 예외처리

by 6^6 2020. 12. 15.
728x90
  • 인터페이스간 상속
  • 인터페이스의 디폴트 메소드
  • 인터페이스의 static 메소드
  • 인터페이스 instanceof 연산
  • marker 인터페이스
  • 추상클래스
  • 예외처리
  • 오늘의 문제

 

 

 

 

인터페이스간 상속

인터페이스에 메소드 2개넣으면 오류해결법↓

↓인터페이스간도 상속받을수있다! 매우 중요한 예제

 

↑자손 상속받으면 원래인터페이스, 상속받은 인터페이스 각각 오버라이드 다 만들어줘야한다.

package java_1215;

public class DriverMain {

	public static void main(String[] args) {
		String myDoc = "This is a report about...";

		// 삼성프린트 출력
		Printable prn = new SPrinterDriver();
		prn.print(myDoc);
		System.out.println();
		ColorPrintable prn1 = new Prn909Drv();
		prn1.print(myDoc);

	}

}

interface Printable {// 부모인터페이스
	void print(String doc);
}

interface ColorPrintable extends Printable {// Printable 상속받음
	void printCMYK(String doc);
}

class SPrinterDriver implements Printable {// Printable 상속받음-오버라이딩해야함
	@Override
	public void print(String doc) {
		System.out.println("From LG printer");
		System.out.println(doc);
	}
}

class Prn909Drv implements ColorPrintable {
	@Override
	public void print(String doc) {
		System.out.println("black&white ver");
		System.out.println(doc);
	}

	@Override
	public void printCMYK(String doc) {
		System.out.println("CMYK ver");
		System.out.println(doc);
	}
}

 

 

 

 

 

 

인터페이스의 디폴트 메소드

256개 인터페이스가 존재하면 하나하나 다넣어줘야함. 노가다.↓해결

앞에 default 붙이게되면 자손이 구현을 하든안하든 상관없다. 구현을 안해도 상관없다.

그래서 기존것도 살아있고 새로운것도 또 새롭게 정의내릴 수 있는것이다.

 

 

 

 

 

인터페이스의 static 메소드

그냥 이런게 있다. 라는것만 알아두기 (많이 사용x)

default붙이면 구현내요이 바로들어간다.

static 붙이면 구현내용이 바로 들어간다.

default랑 static 메소드 호출방법이 똑같다. 

(최신 문법이라 아직 많이 쓰이진않음)

 

 

 

 

★인터페이스도 instanceof 연산가능

ca주소찾아갔는데 Cake있나? = 형변환 가능하나? 같은말! - 모르겠으면 그림그려보기

 

 

 

인터페이스 instanceof 연산

//아이패드 그림그림그림

package java_1215;

interface Printable2{
	void printLine(String str);
}
class SimplePrinter2 implements Printable2{ 
	public void printLine(String str) {//함수 오버라이딩
		System.out.println(str);
	}
}

class MultiPrinter2 extends SimplePrinter2{
	public void printLine(String str) {
		super.printLine("start of multi...");
		super.printLine(str);
		super.printLine("end of multi");
	}
}

public class PrintMain2 {
	public static void main(String[] args) {
		Printable2 prn1 = new SimplePrinter2();
		Printable2 prn2 = new MultiPrinter2();
		
		if(prn1 instanceof Printable2)
			prn1.printLine("This is a simple printer.");
		System.out.println();
		
		if(prn2 instanceof Printable2)
			prn2.printLine("This is a multiful printer.");
	}

}

madplay.github.io/post/java-upcasting-and-downcasting ↑참조해보기

 

 

 

 

 

 

Marker 인터페이스

toUpperCase = 모든걸 대문자로 바꿔줌

 

Upper의 역할? Upper 가있으면 구현.

 

interface 이름 { } = 마커 인터페이스  - 가끔보임

-이걸 분류시키기 위해 분류함(위의 사진처럼)

-분류시키고(클래스로 분류시킴) 각각의 역할을 나눠서 기능을 구현함.

 

 

package java_1215;

interface Upper {
} // 마커 인터페이스

interface Lower {
} // 마커 인터페이스

interface Printable3 {
	String getContents();
}

class Report implements Printable3, Upper {
	String cons;

	Report(String cons) {
		this.cons = cons;
	}

	public String getContents() {
		return cons;
	}
}

class Printer {
	public void printContents(Printable3 doc) {
		if (doc instanceof Upper) {
			System.out.println((doc.getContents()).toUpperCase());
		} else if (doc instanceof Lower) {
			System.out.println((doc.getContents()).toLowerCase());
		} else
			System.out.println(doc.getContents());
	}
}

public class MarkerMain3 {
	public static void main(String[] args) {
		Printer prn3 = new Printer();

		Report doc = new Report("Simple funny News");
		prn3.printContents(doc);
	}

}//SIMPLE FUNNY NEWS

 

 

 

 

추상클래스

클래스앞에 abstract붙음 = 추상클래스

→abstract = 자손이 구현한다.

→추상클래스도 자손이 구현한다.

 

클래스 안에 추상메소드가 한개라도있으면 클래스앞에 abstract가 붙어야한다!!! (안붙으면 에러남)

추상클래스 역시 객체생성 불가능. 참조변수선언은 가능. (인터페이스랑 똑같다.)

 

인터페이스와 추상클래스 차이 - 면접에 나옴

 

예제

 

예제

package java_1215;

abstract class Car {
	public abstract void start();

	public abstract void stop();

	final public void run() {
		start();
		stop();
	}

}

class Genesis extends Car {

	@Override
	public void start() {
		// TODO Auto-generated method stub
		System.out.println("시동걸기");
	}

	@Override
	public void stop() {
		// TODO Auto-generated method stub
		System.out.println("제동걸기");
	}

}

public class PracMain4 {
	public static void main(String[] args) {
		Car car = new Genesis();

		car.run();

	}
}//시동걸기
//제동걸기

 

+ 인터페이스에서는 

public abstract void start();

public abstract void stop();

얘만 들어갈 수 있음

 

+absctract class 에서는 (근데 실무에선 잘안쓰임. 인터페이스가 더 많이 쓰임)

final public void run() {
start();
stop();

얘도 들어갈 수 있음

 

+근데 default가 나와서 경계 애매모호해짐

 

 

 

 

 

 

 

예외처리 (- 외울게 많다.) try catch finally

프로그램 잘짜는 사람이 예외처리를 잘한다.

예외처리는 자바에만 있는 것임

 

 

 

 

 

 

 

↓외워

 

 

 

예외도 객체다.

error와 exception은 객체가 다르다.

 

예외(exception) - 개발자가 못잡는 error

jvm에서 error가 뜸(사실 error는 아님)

코딩 상의 error가 아님, 시스템상의 오류임.

메모리가 꽉찼을때, 하드웨어의 오류일때 등..

 

 

예외(Exception) ‘예외적인 상황’을 줄여서 ‘예외’라 한다.

단순한 문법 오류가 아닌 실행 중간에 발생하는 ‘정상적이지 않은 상황’을 뜻한다.

예외처리 예외 상황에 대한 처리를 의미한다. 자바는 예외처리 메커니즘을 제공한다.

 

18-4

뻔한 예제

18-5

위 사진은 전부 런타임 에러다.

↑에러처리 정보출력은 누가 띄워줄까? JVM 

 

 

18-6      

 

unchecked , checked 반드시 기억!! 무조건 외우기 // 고슬링아저씨가 강제로 넣은것이기 때문.

빨간박스는 전부 런타임 exception

 

18-8

try~catch 의 예

 

try-catch없이 코드를 작성한다면?(지금까지 했던 방법)

a=2 b=0 넣으면 0으로 나눌수없어서 에러.

JVM 해당 에러에 대한 객체를 표시하고 죽어버림

 

try-catch라는 예외처리 구문을 넣는다면?

jvm이 해당 에러가 나는것에 대해서 메인을 가진 프로그램에게 해당 에러에대한 객체를 넘겨줌. 

왜쓰느냐? 안죽을라고.

catch가 JVM에게 에러객체를 받는쪽임. 

 

예제

package java_1215;

import java.util.Scanner;

public class trycatchMain {
	public static void main(String[] args) {

		Scanner kb = new Scanner(System.in);
		
		try {
			System.out.println("a/b...a? ");
			int n1 = kb.nextInt();
			System.out.println("a/b...b? ");
			int n2 = kb.nextInt();
			System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2);
		}

		catch (ArithmeticException e) {
			System.out.println(e.getMessage());
		}
		System.out.println("Good bye~~!");

	}
}

*깨알기본상식 nextInt(); int n1 = kb.nextInt();는 엔터,스페이스로도 다음값 넘겨받기가능.

 

 

문자넣으면 에러남 - 에러잡기

방법1

package java_1215;

import java.util.InputMismatchException;
import java.util.Scanner;

public class trycatchMain5 {
	public static void main(String[] args) {

		Scanner kb = new Scanner(System.in);

		try {
			System.out.println("a/b...a? ");
			int n1 = kb.nextInt();
			System.out.println("a/b...b? ");
			int n2 = kb.nextInt();
			System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2);
		}

		catch (ArithmeticException e) {
			System.out.println(e.getMessage());
		} catch (InputMismatchException e) {
			System.out.println(e.getMessage());
		}
		System.out.println("Good bye~~!");

	}
}

 

방법2-개발자들은 이 방법을 씀 - e.printStackTrace걸면 다 거를수 있다.

package java_1215;

import java.util.Scanner;

public class trycatchMain5 {
	public static void main(String[] args) {

		Scanner kb = new Scanner(System.in);

		try {
			System.out.println("a/b...a? ");
			int n1 = kb.nextInt();
			System.out.println("a/b...b? ");
			int n2 = kb.nextInt();
			System.out.printf("%d / %d = %d \n", n1, n2, n1 / n2);
		}

		catch (Exception e) { //★이것도 다형성(Polymorphism이다.)
			e.printStackTrace();
			// System.out.println(e.getMessage());
		}
		System.out.println("Good bye~~!");

	}
}

결과값↓ 이렇게 나와도 오류 아님 오류는 오륜데 오류 아님

 

 

 

 

18-9

 

★2.예외발생지점이 생기면 3. 은 실행하지 않고, jvm은 바로 catch로 가고 catch문부터 밑으로 실행.

 

 

18-12

try-catch는 남발하지 말자↓빨간부분처럼 처리하자.

 

 

 

 

 

18-13

 

static함수에서는 instatce 변수가(ex.String name;) 못들어간다.//static변수=클래스변수, 

static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다. 즉, 인스턴스(객체) 생성 없이 바로 사용가능 하다. 

↓설명꼭보기 

ifcontinue.tistory.com/2

 

18-14

말로 설명할 줄 알기

18-15

상식적으로 

catch에도 다형성이 적용된다. why? catch도 object처럼 예외처리 중 최상위임.

 

 

 

18-16

숫자는 3개인데 배열은 4개여서 나는 오류

 

 

18-17

↓이 오류나오는 이유 꼭 알기 무조건 알기

 

 

18-18

↓ 무조건 오류나오는 이유 알기! 

 

stack

push = 벽돌쌓기

pop = 양동이에 물퍼나르기

 

 

 

 

오늘의 문제

1.Maker 인터페이스에 대하여 설명하시오.

클래스를 분류하는 역할.

인터페이스만 있고 메소드가 없다.

 


2.추상클래스에 대하여 설명하시오.

클래스 안에 추상메소드가 한개라도있으면 클래스앞에 abstract가 붙어야한다!!! (안붙으면 에러남)

추상클래스 역시 객체생성 불가능. 참조변수선언은 가능. (인터페이스랑 똑같다.)


3.추상클래스와 인터페이스의 차이는?

인터페이스는 상수와 추상메소드 만 들어올 수 있다.

 

추상클래스에서는 일반클래스가 가진 것들을 가질 수 있다.

(클래스앞에 abstract붙음 = 추상클래스)

완성된 함수, 변수 다 가질 수 있다. 하지만 몸체가 없어서 객체생성이 불가하다.

함수 선언은 가능하다. (Printable p;), 변수 선언도 가능하다.

추상메소드가 들어있어야한다. (public abstract void 이름( );)

 

 
4.에러와 예외의 차이는?

에러는 문법적 오류(컴파일시 오류)

예외(exception)는 개발자가 못잡는 오류이다. jvm에서 에러가 뜨는데 이는 코딩상의 에러가 아닌 시스템상의 오류이다.(ex. 메모리가 꽉찼을때, 하드웨어의 오류일때 등)

 


5.unchecked 와 checked 예외의 차이는?

www.nextree.co.kr/p3239/

예외(exception)에는 uchecked Exception 과 checked Exception 두가지로 나뉜다.

Checked Exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 한다.  반면에 Unchecked Exception은 명시적인 예외처리를 하지 않아도 된다.

 

 


6.예외처리 UML를 그리시오.

 

 


7.사칙연산 계산기를 아래의 조건으로 짜시오.
-interface 를 활용할것
-예외처리 메커니즘을 적용할것.

 

package java_1215_pre;

import java.util.Scanner;

//사칙연산 계산기를 아래의 조건으로 짜시오.
//-interface 를 활용할것
//-예외처리 메커니즘을 적용할것.
interface ICalcul2 {
	int add(int x, int y);

	int sub(int x, int y);

	int mul(int x, int y);

	int div(int x, int y);
}

class Calculnum implements ICalcul2 {

	public void cal(int x, int y) {

	}

	@Override
	public int add(int x, int y) {

		return x + y;
	}

	@Override
	public int sub(int x, int y) {

		return x - y;
	}

	@Override
	public int mul(int x, int y) {

		return x * y;
	}

	@Override
	public int div(int x, int y) {

		return x / y;
	}

}

public class ICalcul {
	public static void main(String[] args) {
		System.out.println("두 정수를 입력하시오.");
		Calculnum cal = new Calculnum();
		Scanner sc = new Scanner(System.in);
		int x = sc.nextInt();
		int y = sc.nextInt();

		try {
			System.out.println(x + "+" + y + "=" + cal.add(x, y));
			System.out.println(x + "-" + y + "=" + cal.sub(x, y));
			System.out.println(x + "-" + y + "=" + cal.mul(x, y));
			System.out.println(x + "-" + y + "=" + cal.div(x, y));

		} catch (Exception e) {
			//e.printStackTrace();←이것보단 ↓이렇게 넣어야 사용자가 알 수 있음
			System.out.println("시스템 오류 발생. 정상종료합니다.");
        }
		System.out.println("계산 끝");
	}
}

 

 

반드시 외우기
8.다음 Stack 인터페이스를 상속받아 실수를 저장하는 StringStack 클래스를 구현하라.(구현할수 있도록 할것) [외우기]

interface Stack {
   int length(); // 현재 스택에 저장된 개수 리턴
 //이건x  int capacity(); // 스택의 전체 저장 가능한 개수 리턴
   String pop(); // 스택의 톱(top)에 실수 저장
   boolean push(String val); // 스택의 톱(top)에 저장된 실수 리턴
}
그리고 다음 실행 사례와 같이 작동하도록 StackApp 클래스에 main() 메소드를 작성하라.

총 스택 저장 공간의 크기 입력 >> 3
문자열 입력 >> hello
문자열 입력 >> sunny
문자열 입력 >> smile
문자열 입력 >> happy
스택이 꽉 차서 푸시 불가!
문자열 입력 >> 그만 F
스택에 저장된 모든 문자열 팝 : smile sunny hello 

 

 

package java_1216_;

interface Stack {
	int length(); // 현재 스택에 저장된 개수 리턴
	// int capacity(); // 스택의 전체 저장 가능한 개수 리턴
	String pop(); // 스택의 톱(top)에 실수 저장
	boolean push(String val); // 스택의 톱(top)에 저장된 실수 리턴
}

class StringStack implements Stack{
	private String stack[]; //탑=인덱스
	private int top;
	
	StringStack(int length){
		stack = new String[length];
		top = -1; //초기화 0 넣어도 상관x	
	}	
	@Override
	public int length() {
		
		return stack.length;
	}
//	@Override
//	public int capacity() {
//		
//		return 0;
//	}
	@Override
	public String pop() {
		if(top == -1)
			return "스택이 비어있습니다.";
		
		return stack[top--];		
	}

	@Override
	public boolean push(String val) {
	
		if(top == stack.length)
			return false;
		stack[++top] = val; //-1인상태이기 때문에 +1해서 0된후 그다음부터 진행됨
		
		return false;
	}	
}

public class StackApp {
	public static void main(String[] args) {
		StringStack stack = new StringStack(5);
		
		stack.push("A");
		stack.push("B");
		stack.push("C");
		stack.push("D");
		stack.push("E");
		
		System.out.println(stack.pop()); //E가 제일 먼저 출력
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
		System.out.println(stack.pop());
	}
}//E
//D
//C
//B
//A

 

↓최종풀이

package java_1216_;

import java.util.Scanner;

interface Stack {
	int length(); // 현재 스택에 저장된 개수 리턴
	String pop(); // 스택의 톱(top)에 실수 저장
	boolean push(String val); // 스택의 톱(top)에 저장된 실수 리턴
}

class StringStack implements Stack {
	private String stack[]; // 탑=인덱스
	private int top;

	StringStack(int length) {
		stack = new String[length];
		top = -1; // 초기화 0 넣어도 상관x
	}

	@Override
	public int length() {

		return stack.length;
	}

	@Override
	public String pop() {
		if (top == -1)
			return "스택이 비어있습니다.";

		return stack[top--];// 스택이 텅비어있다는 걸 표현
	}

	@Override
	public boolean push(String val) {

		if (top == stack.length - 1)
			return false;
		stack[++top] = val; // -1인상태이기 때문에 +1해서 0된후 그다음부터 진행됨

		return true;
	}
}

public class StackApp {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		System.out.print("총 스택 저장 공간의 크기 입력 >> ");
		int num = sc.nextInt();
		StringStack stack = new StringStack(num);

		while (true) {
			System.out.println("문자열 입력 >> ");
			String word = sc.next();

			if (word.equals("그만"))
				break;

			if (!stack.push(word)) {
				System.out.println("스택이 꽉 차서 푸시 불가!");
				break;
			}
		}
		System.out.println("스택에 저장된 모든 문자열 팝 : ");
		int len = stack.length();
		for (int i = 0; i < len; i++) {
			String s = stack.pop();
			System.out.println(s + " ");

		}
		sc.close();

	}
}

9. //다형성 문제
철수 학생은 다음 3개의 필드와 메소드를 가진 4개의 클래스 Add, Sub, Mul, Div를 작성하려고 한다

- int 타입의 a, b 필드: 2개의 피연산자
- void setValue(int a, int b): 피연산자 값을 객체 내에 저장한다.
- int calculate(): 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.
곰곰 생각해보니, Add, Sub, Mul, Div 클래스에 공통된 필드와 메소드가 존재하므로 새로운 추상 클래스 Calc를 작성하고 Calc를 상속받아 만들면 되겠다고 생각했다. 그리고 main() 메소드에서 다음 실행 사례와 같이 2개의 정수와 연산자를 입력받은 후, Add, Sub, Mul, Div 중에서 이 연산을 처리할 수 있는 객체를 생성하고 setValue() 와 calculate()를 호출하여 그 결과 값을 화면에 출력하면 된다고 생각하였다. 철수처럼 프로그램을 작성하라.

두 정수와 연산자를 입력하시오 >> 5 7 +
-

package java_1215;

import java.util.Scanner;

//사칙연산 계산기를 아래의 조건으로 짜시오.
//-interface 를 활용할것
//-예외처리 메커니즘을 적용할것.
interface Calc {
	int add(int a, int b);

	int sub(int a, int b);

	int mul(int a, int b);

	int div(int a, int b);
}

class Calclass implements Calc {
	private int i;
	private int j;
	private char oper;

	void setValue(int i, int j) {// 피연산자 값을 객체 내에 저장한다.
		this.i = i;
		this.j = j;
	}

	public Calclass(int i, int j,char oper) {// 클래스의 목적에 맞는 연산을 실행하고 결과를 리턴한다.

		int result = 0;

		switch (oper) {
		case '+': {
			result = i + j;
			break;
		}
		case '-': {
			result = i - j;
			break;
		}
		case '*': {
			result = i * j;
			break;
		}
		case '/': {
			result = i / j;
			break;
		}
		}
		System.out.println(result);
	}

	public void cal(int i, int j) {

	}

	@Override
	public int add(int i, int j) {

		return i + j;
	}

	@Override
	public int sub(int i, int j) {

		return i - j;
	}

	@Override
	public int mul(int i, int j) {

		return i * j;
	}

	@Override
	public int div(int i, int j) {

		return i / j;
	}

}

public class TestMain {
	public static void main(String[] args) {

		System.out.println("두 정수와 연산자를 입력하시오.");
		Scanner sc = new Scanner(System.in);
		int i = sc.nextInt();
		int j = sc.nextInt();
		char oper = sc.next().charAt(0);

		Calclass calc = new Calclass(i, j, oper);

	}
}

 

 

↓선생님 풀이

package java_1216_;

import java.util.Scanner;

abstract class Calc {
	protected int num1;
	protected int num2;

	public void setValue(int num1, int num2) {// 공통된거 따로 분리
		this.num1 = num1;
		this.num2 = num2;
	}

	abstract public int calculate();
}

class Add extends Calc {

	@Override
	public int calculate() {

		return num1 + num2;
	}

}

class Sub extends Calc {

	@Override
	public int calculate() {

		return num1 - num2;
	}

}

class Mul extends Calc {

	@Override
	public int calculate() {

		return num1 * num2;
	}

}

class Div extends Calc {

	@Override
	public int calculate() {

		return num1 / num2;
	}

}

public class CalcMain {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int result = 0;
		System.out.println("두 정수와 연산자를 입력하시오>> ");

		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		char op = sc.next().charAt(0);

		try {
			// 다형성구현
			Calc cal = null;
			switch (op) {
			case '+':
				cal = new Add(); // 이부분 다형성이 핵심
				break;
			case '-':
				cal = new Sub(); // 이부분 다형성이 핵심
				break;
			case '*':
				cal = new Mul(); // 이부분 다형성이 핵심
				break;
			case '/':
				cal = new Div(); // 이부분 다형성이 핵심
				break;
			default:
			}
			cal.setValue(num1, num2);
			System.out.println(cal.calculate());
		} catch (Exception e) {
			System.out.println("비정상 종료입니다.");
		}

		sc.close();
	}
}


12

 


13.연습문제 7-22 번을 푸시오.

 

package java_1215;

abstract class Shape {
	Point p;

	Shape() {
		this(new Point(0, 0));
	}

	Shape(Point p) {
		this.p = p;
	}

	abstract double calcArea(); // 도형의 면적을 계산해서 반환하는 메서드

	Point getPosition() {
		return p;
	}

	void setPosition(Point p) {
		this.p = p;
	}
}

class Point {
	int x;
	int y;

	Point() {
		this(0, 0);
	}

	Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {

		return "[" + x + "," + y + "]";
	}
}

////////////////////////////
class Circle extends Shape {
	private double r;

	public Circle(Point p, double r) {
		super(p);
		this.r = r;
	}

	public Circle(double r) {
		this.r = r;
	}

	@Override
	double calcArea() {// 도형의 면적을 계산해서 반환

		return r * r * Math.PI;
	}

}

class Rectangle extends Shape {

	private double width, heigh; // 멤버변수(전역변수)

	public Rectangle(Point p, double width, double heigh) {
		super(p);
		this.width = width;
		this.heigh = heigh;
	}

	public Rectangle(double width, double heigh) {
		this.width = width;
		this.heigh = heigh;
	}

	public boolean isSquare() {
		if (width == heigh)
			;
		// 0일때도 걸러주기
		return true;
	}

	@Override
	double calcArea() {// 도형의 면적을 계산해서 반환

		return width * heigh;
	}

}

 

 

 


14.연습문제 7-23 번을 푸시오.

public class ShapeMain2 {
	public static void main(String[] args) {
		Shape[] arr = { new Circle(5.0), new Rectangle(3, 4), new Circle(1) };

		System.out.println("면적의 합:" + sumArea(arr));
	}

	private static double sumArea(Shape[] arr) {

		double sum = 0;
		for (int i = 0; i < arr.length; i++)
			sum += arr[i].calcArea(); //이부분 헷갈렸음.다시 풀때도 좀 헤맴

		return sum;

	}
}

 

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

20.12.17 Thu [019]  (0) 2020.12.17
20.12.16 Wed [018] 예외처리, 가상머신  (0) 2020.12.16
20.12.14 Mon [016]  (0) 2020.12.14
질문,헷갈리는 거 정리  (0) 2020.12.13
20.12.11 Fri [015]  (0) 2020.12.11

댓글