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
'프로그래밍 > 수업일지' 카테고리의 다른 글
수업일지 20일차 (23/10/18) - Java (0) | 2023.10.18 |
---|---|
수업일지 19일차 (23/10/17) - Java (2) | 2023.10.17 |
수업일지 17일차 (23/10/13) - Java (0) | 2023.10.14 |
수업일지 16일차 (23/10/12) - Java (2) | 2023.10.12 |
수업일지 15일차 (23/10/11) - Java (1) | 2023.10.11 |