티스토리 뷰

학습정리-10-27.txt
0.00MB

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

interface Upper{  }
interface Lower{  }

위 예시처럼 interface 안에 아무런 내용을 넣지 않은 형태를 Marker 인터페이스라고 한다. 

용도는 클래스에 특정 표시를 해두기 위해서이다. (마킹용)

활용 예시는 아래 처럼 마킹되어 있는 클래스별로 분류할 수 있다.

interface Sea {}
interface Ground {}

interface Locable {
	void printLive();
}

class Fish implements Locable, Sea {

	@Override
	public void printLive() {
		System.out.println("바다에 삽니다.");
	}

}

class Tigger implements Locable, Ground {

	@Override
	public void printLive() {
		System.out.println("밀림에 삽니다.");
	}

}

	public static void main(String[] args) {

		Locable loc1 = new Fish();
		Locable loc2 = new Tigger();
		
		Fish fish = new Fish();
		Tigger tigger = new Tigger();
		
		if(loc1 instanceof Sea) {
			System.out.println("바다에 삽니다.");
		}
		else if(loc1 instanceof Ground) {
			System.out.println("육지에 삽니다.");
		}
		else {
			System.out.println("하늘에 살겠지....");
		}
		// 바다에 삽니다.		
		
		System.out.println();
		checkLocation(loc1); // 바다에 삽니다.
		checkLocation(loc2); // 육지에 삽니다.
		
		checkLocation(fish); // 바다에 삽니다.
		checkLocation(tigger);  // 육지에 삽니다.
		
	}
}

 

 

 

 

 

2. 추상 클래스(abstract class)에 대하여 설명하시오.

abstract를 클래스나 함수 앞에 붙이면

함수 앞: 함수에 바디가 없어야 한다. 자손이 구현하라는 뜻이다.

만약 일반 클래스 안에 abstract가 붙은 함수가 있을 경우 오류가 나기 때문에 무조건 class 앞에도 abstract를 붙여줘야한다.

왜냐하면 일반 클래스 안에 abstract가 붙은 함수가 있을 경우 함수가 미완성 상태이기 때문에 해당 클래스로 객체 생성이 불가하다.

또한, 반드시 자손 클래스에서 해당 함수를 구현해주어야한다. 그래야 객체 생성이 가능하다.(자식을 통해서)

자기 자신의 객체를 생성하지는 못한다. 미완성이기 때문에....? 

→ 실무에서는 잘 쓰이지 않음. abstract 클래스를 만들지 말고 interface로 만들어서 사용하기!

 

 

 

 

 


3.Exception 에 대하여 설명하시오.

예외라는 뜻으로 오류의 일종이며 프로그램 실행시 오류를 발견하게 되면 불능상태를 만들어 버리는 것이다.

폴리몰티즘이 활용된 기능으로 c언어에는 없고, OOP에 있는 기능 중 하나이다.

 

 

 

 

 


4.에러를 내는 주체는?

JVM이 예외 객체를 먼저 올려 확인을 해서 실행 중간에 예외처리가 걸리게 되면(문법적인 오류가 아니라 실행되면서 실시간?으로 확인한다) 바로 그 자리에서 실행이 정지되고 오류 메세지를 띄운다. 예외 코드 아래는 결과값이 출력되지 않는다.

 

 

 

 



5. 아래의 소스코드를 참고 하여 중에 Main안에 있는 두개의
getAllArea 과 getArea 함수를 완성하시오.
================================
interface AreaGetable {
double getArea();

}

class Circle implements AreaGetable {
private double r;

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

@Override
public double getArea() {

return r * r * Math.PI;
}
}

class Rectangle implements AreaGetable {

private double width, height;

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

@Override
public double getArea() {
// TODO Auto-generated method stub
return width * height;
}
}

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

AreaGetable[] area = { new Rectangle(4, 5), new Circle(4), new Circle(4), new Circle(5), new Circle(5),
new Circle(6) ,new Rectangle(4, 5),new Rectangle(4, 5),new Rectangle(4, 5),};

// AreaGetable oneArea = new Circle(4);
System.out.println(getAllArea(area));
System.out.println(getArea(new Circle(10))); //314
System.out.println(getArea(new Rectangle(4, 5))); //20

// oneArea = new Rectangle(4,5);
// System.out.println(area.getArea());

}
}

package edu.kosmo.test.prac;

interface AreaGetable {
	double getArea();

}

class Circle implements AreaGetable {
	private double r;

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

	@Override
	public double getArea() {

		return r * r * Math.PI;
	}
}

class Rectangle implements AreaGetable {

	private double width, height;

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

	@Override
	public double getArea() {
		return width * height;
	}
}

class CondOp {
	
	public static double getAllArea(AreaGetable[] area) {
		double sum = 0;
		for (AreaGetable areaGetable : area) {
			sum += areaGetable.getArea();
		}
		
//		for(int i = 0; i < area.length; i++) {
//			sum += area[i].getArea();
//		}
		
		return sum;
	}
	
	public static double getArea(AreaGetable area) {
		return area.getArea();
	}
	
	
	public static void main(String[] args) {

		AreaGetable[] area = { new Rectangle(4, 5), new Circle(4), new Circle(4), new Circle(5), new Circle(5),
				new Circle(6), new Rectangle(4, 5), new Rectangle(4, 5), new Rectangle(4, 5), };

		// AreaGetable oneArea = new Circle(4);
		System.out.println(getAllArea(area));
		System.out.println(getArea(new Circle(10))); // 314
		System.out.println(getArea(new Rectangle(4, 5))); // 20

		// oneArea = new Rectangle(4,5);
		// System.out.println(area.getArea());

	}
}

 

 

 

 

 


6. 아래의 결과를 나타내는 사칙연산 계산기를 완성하시오.
-주의 잘못된 입력이 있으면 처음부터 다시 입력을 받도록 
예외처리 구문(try catch)을 넣을것

*** 계산기 ***
수1 : 10
수2 : 20
연산 : +
계산 결과 : 30
계속 하시겠습니까? 계속 : Y , 종료 : N
y
*** 계산기 ***
수1 : R
잘못된 입력입니다. 다시입력해 주세요
*** 계산기 ***
수1 : 10
수2 : 20
연산 : *
계산 결과 : 200
계속 하시겠습니까? 계속 : Y , 종료 : N
y
*** 계산기 ***
수1 : 90
수2 : 80
연산 : /
계산 결과 : 1
계속 하시겠습니까? 계속 : Y , 종료 : N
n
종료입니다.

package edu.kosmo.test.prac;

import java.util.InputMismatchException;
import java.lang.ArithmeticException;
import java.util.Scanner;

class CalculatorTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.println("*** 계산기 ***");

			try {
				System.out.print("수1 : ");
				int num1 = sc.nextInt();

				System.out.print("수2 : ");
				int num2 = sc.nextInt();

				System.out.print("연산 : ");
				String operator = sc.next();

				if (operator.equals("+")) {
					System.out.println("계산 결과 : " + (num1 + num2));
				} else if (operator.equals("-")) {
					System.out.println("계산 결과 : " + (num1 - num2));
				} else if (operator.equals("*")) {
					System.out.println("계산 결과 : " + (num1 * num2));
				} else if (operator.equals("/")) {
					System.out.println("계산 결과 : " + (num1 / num2));
				}
				else {
					System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
				}


			} catch (ArithmeticException | InputMismatchException e) {
				System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
			}
			
			System.out.println("계속 하시겠습니까? 계속 : Y , 종료 : N");
			String str = sc.next();
			if(str.charAt(0) == 'n' || str.charAt(0) == 'N') {
				System.out.println("종료입니다.");
				return;
			}
			

		}
		
				
		
	}
}

 

try~catch 부분을 이렇게 만들 수도 있다.........

try {
				System.out.print("수1 : ");
				int num1 = sc.nextInt();

				System.out.print("수2 : ");
				int num2 = sc.nextInt();

				System.out.print("연산 : ");
				String operator = sc.next();

				int result = 0;
				if (operator.equals("+")) {
					result = num1 + num2;
				} else if (operator.equals("-")) {
					result = num1 - num2;
				} else if (operator.equals("*")) {
					result = num1 * num2;
				} else if (operator.equals("/")) {
					result = num1 / num2;
				}

				System.out.println("계산 결과 : " + result);

			} catch (ArithmeticException | InputMismatchException e) {
				System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
			}

 

import java.util.InputMismatchException;
import java.lang.ArithmeticException;
import java.util.Scanner;

class CalculatorTest {
	public static void YesOrNo() {
		Scanner sc = new Scanner(System.in);
		System.out.println("계속 하시겠습니까? 계속 : Y , 종료 : N");
		String str = sc.next();
		if(str.charAt(0) == 'n' || str.charAt(0) == 'N') {
			System.out.println("종료입니다.");
			return;
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		while (true) {
			System.out.println("*** 계산기 ***");

			try {
				System.out.print("수1 : ");
				int num1 = sc.nextInt();

				System.out.print("수2 : ");
				int num2 = sc.nextInt();

				System.out.print("연산 : ");
				String operator = sc.next();

				if (operator.equals("+")) {
					System.out.println("계산 결과 : " + (num1 + num2));
					YesOrNo();
				} else if (operator.equals("-")) {
					System.out.println("계산 결과 : " + (num1 - num2));
					YesOrNo();
				} else if (operator.equals("*")) {
					System.out.println("계산 결과 : " + (num1 * num2));
					YesOrNo();
				} else if (operator.equals("/")) {
					System.out.println("계산 결과 : " + (num1 / num2));
					YesOrNo();
				}
				else {
					System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
				}


			} catch (ArithmeticException | InputMismatchException e) {
				System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
			}
						

		}
				
	}
	
	
}

char 이 아니라 String 으로 입력 받는 이유 : String 안에는 엄청난 함수들이 있기 때문에 활용성이 더 뛰어나다.

 

import java.util.InputMismatchException;
import java.lang.ArithmeticException;
import java.util.Scanner;

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

		int num1 = 0;
		int num2 = 0;
		int result = 0;
		String op = null;

		while (true) {

			try {
				Scanner sc = new Scanner(System.in);

				System.out.println("*** 계산기 ***");

				System.out.print("수1 : ");
				num1 = sc.nextInt();

				System.out.print("수2 : ");
				num2 = sc.nextInt();

				System.out.print("연산 : ");
				op = sc.next();

				switch (op) {
				case "+":
					result = num1 + num2;
					break;
				case "-":
					result = num1 - num2;
					break;
				case "*":
					result = num1 * num2;
					break;
				case "/":
					result = num1 / num2;
					break;

				default:
					System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
					result = 0;
				}

				System.out.println("계산 결과 : " + result);

				System.out.println("계속 하시겠습니까? 계속 : Y , 종료 : N");
				String finish = sc.next();
				if (finish.equals("N") || finish.equals("n")) {
					break;
				}
			} catch (Exception e) {
				System.out.println("잘못된 입력입니다. 다시입력해 주세요.");
				continue; //없어도 된다.
			}

		} // while(true) 여기가 while문 끝이라는 표시! 실무에서도 이런식으로 사용한다.

		System.out.println("종료입니다.");

	}

}

한글자만 받을 때는 switch가 가독성이 더 좋다.

try~catch는 여러번 중복해서 쓸 수 있지만 너무 많이 쓰게 되면 성능 저하 문제, 가독성이 떨어지는 문제가 있다.

최대한 적게 사용하는 방향으로 코딩하는 것이 좋다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함