728x90

 

수업내용 정리 (Java)

 

1. 테스트

더보기
// 문제
public static void main(String[] args) {
	System.out.println("1번");
	operation(10,3);
	//덧셈 결과: 13
	//뺄셈 결과: 7
	//곱셈 결과: 30
	//몫 결과: 3
	//나머지 결과: 1
	
	System.out.println("\n2번");
	abs(10, 3);	//두 수 차의 절대값(거리의 개념): 7
	abs(3, 10);	//두 수 차의 절대값: 7
	
   	System.out.println("\n3번");
	System.out.println("원 둘레: "+cirRound(2.4));	//반지름
	// 원 둘레: (반지름*2)*3.14 / Math.PI
	System.out.println("원 넓이: "+cirArea(2.4));
	// 원 넓이: (반지름*반지름)*3.14
	
	System.out.println("\n4번");
	for(int i=2; i<11; i++) {
		if(isEven(i)) {	// 짝수 2,4,6,8,10
			System.out.println("숫자 "+i+"는 짝수입니다.");
		}
	}
}
결과 출력

 

 

// 1번
private static void operation(int i, int j) {
	System.out.println(i+" + "+j+" = "+(i+j));
	System.out.println(i+" - "+j+" = "+(i-j));
	System.out.println(i+" * "+j+" = "+(i*j));
	System.out.println(i+" / "+j+" = "+(i/j));
	System.out.println(i+" % "+j+" = "+(i%j));
}
  • 간단한 연산자를 출력할 때 sysout에 바로 계산해도 되지만(ex: i+j) 다른 문자와 연결하여 사용할 때는 소괄호()로 묶어서 사용해야 한다.

 

// 2번
private static void abs(int i, int j) {
	if(i>j) {
		System.out.println(i+", "+j+"의 절대값: "+(i-j));
	}else {
		System.out.println(i+", "+j+"의 절대값: "+(j-i));
	}
}
  • 절대값(두 수의 거리)은 음수값이 나오면 안 되기 때문에 if문으로 i가 j보다 작을 경우를 걸러준다.

 

// 3번
private static double cirRound(double d) {
	return d*2*Math.PI;;
}

private static double cirArea(double d) {
	double a = d*d*Math.PI;
	return a;
}
  • return에 값을 바로 반환하거나 임시변수에 값을 저장해서 임시변수를 반환할 수 있다.

 

// 4번
private static boolean isEven(int i) {
	if(i%2 == 0) {
		return true;
	}
	return false;	// return문이 있을때는 else가 없어도 됨
		// return i%2 == 0 도 되긴 하나 비추
}
  • return문일 때는 else가 없어도 된다. (if에서 바로 return하면 되기 때문에)
  • return i%2 == 0 이런 코드도 가능하지만 비추천!

 

2. 추상 클래스 (참고)

  • 하나 이상의 추상 메소드를 포함하는 클래스
  • 반드시 사용할 메소드는 추상 클래스에서 추상 메소드로 선언해두면 이 클래스를 상속하는 모든 클래스가 추상 클래스 내에 있는 모든 메소드를 반드시 재정의(오버라이딩)를 해야 한다.
  • 추상 메소드: 선언부만 남기고 바디를 날린, 동작이 존재하지 않는 메소드
  • public abstract를 붙이지 않아도 붙어있는 것과 동일하게 작동된다.
  • 인터페이스도 일종의 추상 클래스라고 볼 수 있다. (추상 클래스보다 추상화 정도가 높다.)
더보기
public class Ex02 {
	public static void main(String[] args) {
		Print p = new PrintImpl();
		p.printMonitor();
		p.printPaper();
		p.getMonitor();
		p.getPager();
		
	}//end main -> 프로그램 종료
}
  • 컨트롤 타워 (업무 지시만 하는 클래스)

 

public interface Print {
	public abstract void printPaper();
	public abstract void printMonitor();
	String getPager();
	public String getMonitor();	// 권장!
}
  • 인터페이스는 다른 클래스들의 기본 틀이 되는 클래스다.
  • public abstract void를 작성하지 않아도 정상작동하지만, public은 작성하는 것을 권장한다.
  • 정상작동하는 여러가지 방법을 통해 추상 메소드를 작성했다.

 

public class PrintImpl implements Print {
	@Override
	public void printPaper() {
		System.out.println("종이출력");
	}

	@Override
	public void printMonitor() {
		System.out.println("화면출력");
	}

	@Override
	public String getPager() {
		return "종이";
	}

	@Override
	public String getMonitor() {
		return "화면";
	}
}
  • 인터페이스를 상속할 때는 상속이 아닌 구현이라고 한다.
  • 추상 메소드를 오버라이딩해서 동작을 작성했다.

 

 

3. 예제

더보기
public class CalcMain {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 3;
		Calc c = new CompleteCalc();
		System.out.println(c.add(num1, num2));
		System.out.println(c.substract(num1, num2));
		System.out.println(c.time(num1, num2));
		System.out.println(c.divide(num1, num2));
		
		//1
		((CompleteCalc)c).divide(num1, num2);
		//2
		CompleteCalc c2 = new CompleteCalc();
		c2.divide(num1, num2);
	}
}
  • 1은 강제형변환, 2는 새로 객체를 만들어서 사용한 코드

 

public interface Calc {
	public final static double PI = 3.14;
	int ERROR = -999999999, OK = 200;
	
	public int add(int num1, int num2);
	public int substract(int num1, int num2);
	public int time(int num1, int num2);
	public int divide(int num1, int num2);
	
	// 인터페이스에 선언된 변수는 무조건 final 변수
}
  • 인터페이스에 선언된 변수는 무조건 final 변수이기 때문에, public final static 까지는 적지 않아도 자동 적용된다.
  • 파이값은 이미 Math.PI로 코드가 있지만 임의로 작성했다.

 

public class Calculator implements Calc {

	@Override
	public int add(int num1, int num2) {
		return num1 + num2;
	}

	@Override
	public int substract(int num1, int num2) {
		return num1 - num2;
	}

	@Override
	public int time(int num1, int num2) {
		return num1 * num2;
	}

	@Override
	public int divide(int num1, int num2) {
		return num1 / num2;
	}
}
  • 인터페이스 Calc를 구현하는 클래스
  • 이렇게만 하면 num1, num2 중 0이 들어가면 divide 메소드에서 오류가 난다.

 

public class CompleteCalc extends Calculator{

	@Override
	public int divide(int num1, int num2) {
		if(num1 == 0 || num2 == 0) {
			return ERROR;	// -9999999
		}
		return num1/num2;
	}
	public void showInpo() {
		System.out.println("나눗셈 개선");
	}
}
  • 인터페이스 Calc를 구현하는 클래스2
  • 위의 클래스에서 오류가 나는 메소드를 개선하기 위해 만들었다. (해당 클래스에서 바로 만들어도 되지만 다른 사람이 나와 동시에 코드를 작성하고 더 나은 코드를 사용할 때 등을 위해서)

 

 

4. try-catch, throw / 예외처리 (참고1 / 참고2)

  • 에러 발생 시 프로그램을 종료시키지 않고 예외처리를 통해 정상작동하게 만들어 준다.
  • try와 catch는 한 몸으로 떨어져선 안 된다.
  • try 블록에서 예외가 발생할 수 있는 코드를 넣고, 예외가 발생되지 않았을 경우엔 catch 블록의 코드는 실행되지 않고 스킵된다.
  • try 블록에서 예외가 발생될 경우엔 실행을 멈추고 catch 블록으로 이동하여 예외처리 코드를 실행한다.
  • try, catch 블록은 무조건 하나씩 있어야 하지만, catch 블록은 하나 이상 있을 수 있다.
  • throw를 통해 예외를 던져 고의로 예외를 발생시킬 수 있다.
  • try에서 던진(throw를) catch에서 받는다.
더보기
try {
	String str = null;
	int len=str.length();
} catch (NullPointerException e) {
	System.out.println(e.getMessage());
	System.out.println("null포인터 예외 발생");
	e.printStackTrace();
}
  • try 블록에서 str 변수에 null 값을 넣어 str.length에 예외를 발생시켰다.
  • catch의 괄호에는 예외타입과 참조변수를 입력한다.
  • 예외 발생 시 발생 예외에 해당하는 클래스의 인스턴스가 만들어진다.
  • getMessage()의 경우 발생한 예외에 대한 기본 정보를 제공해준다. (간단)
  • printStackTrace()의 경우 자세한 예외 정보, 예외가 발생한 위치를 제공해준다.

 

try {
	int[] arr1 = new int[3];
	arr1[-1]=20;
} catch (ArrayIndexOutOfBoundsException e) {
	System.out.println(e.getMessage());
	System.out.println("인덱스 예외 발생");
	e.printStackTrace();
}

 

 4-1) 예제 ㄱ 

더보기
import java.io.IOException;
import java.util.Scanner;

public class ExceptionMain {
	public static void main(String[] args) {
		System.out.print("나이입력> ");
		try {
			int age = readAge();
			System.out.println("당신은 "+age+"세입니다.");
		} catch (AgeInputException e) {
			System.out.println(e.getMessage());
		} catch(IOException e) {
			System.out.println(e.getMessage());
			System.out.println("입출력 예외 발생");
		}
	}

	private static int readAge() throws AgeInputException, IOException{	//예외 여러개 사용 가능
		Scanner keyboard = new Scanner(System.in);
		int age = keyboard.nextInt();
		if(age < 0) {
//			AgeInputException excpt = new AgeInputException();
//			throw excpt;
			throw new AgeInputException();	//위 두 줄과 동일함
//			throw new IOException();
		}
		return age;
	}
}
// 프로그래머 정의 예외 클래스
public class AgeInputException extends Exception{
	public AgeInputException() {
		super("유효하지 않는 나이가 입력되었습니다.");
	}
}
  • 나이 입력에서 바로 try-catch를 통해 예외 상황을 만들어 해당하는 경우에는 throw를 통해 강제로 catch에 던진다.
  • 예외 상황에 해당하지 않는 경우엔 입력받은 값을 그대로 반환한다.

 


 

질문한 내용이나 어려웠던 점 메모

1. try-catch, throw

  • 처음엔 이해한듯 했는데 예제에서 throws(예외 여러개 사용 가능) 부분부터 헷갈린다. 우선 이해하려면 오래 걸릴 것 같아서 여러번 사용해보고 따라하면서 응용도 해봐야 객체마냥 자연스럽게 이해할 수 있을듯 싶어서 일단 머리에 집어넣기로 했다..

 


 

전체 피드백

  • try-catch, throw 여러번 사용해보기!

 


728x90