세 번째 튜터링 시간에는 예외처리 방법(try-catch) , 객체지향의 개념 , 클래스 객체를 배웠다.
▷생성자
▷과제
- 예외처리(try-catch)
import java.util.Scanner;
public class DevideByZeroHandling {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while(true) {
System.out.print("나뉨수를 입력하시오:");
int dividend = scanner.nextInt(); // 나뉨수 입력
System.out.print("나눗수를 입력하시오:");
int divisor = scanner.nextInt(); // 나눗수 입력
try {
System.out.println(dividend + "를 "+ divisor + "로 나누면 몫은 “ + dividend/divisor + "입니다.");
break; // 정상적인 나누기 완료 후 while 벗어나기
}
catch(ArithmeticException e) { // ArithmeticException 예외 처리 코드
System.out.println("0으로 나눌 수 없습니다! 다시 입력하세요");
}
}
scanner.close();
}
}
try-catch문은 try에서 예외처리가 발생할 것 같은 코드를 넣고 catch로 후속 조치를 하는 것과 같다
순서를 나열하면 다음과 같다.
- 예외가 발생될 코드를 try로 묶는다.
- catch (괄호) 괄호 안에 예외처리 코드를 입력한다
- catch 안에 예외 발생 시 실행할 코드를 입력한다.
- 객체지향 개념
객체지향 개념으로 간단하게 5가지로 나열할 수 있다.
- 패키지
- 캡슐화
- 클래스
- 상속
- 오버 로딩 , 오버 라이딩
→패키지
패키지는 서로 관련이 있는 클래스 파일들을 묶어서 저장하는 디렉터리이다.
→캡슐화
객체를 감싸 외부에서 쉽게 볼 수 없게 한 것이다.
캡슐화를 잘하면 외부 침입으로부터 보호할 수 있다.
→클래스
클래스는 메서드, 필드로 구분할 수 있다.
메서드 : 클래스 내부에 선언된 함수
필드 : 클래스 내부에 선언된 변수
→상속
슈퍼 클래스의 메서드, 필드들을 서브 클래스에서 상속받아 쓸 수 있다. (서브클래스로 갈수록 점점 구체화된다)
→오버 로딩, 오버 라이딩
오버 로딩 : 함수의 이름은 같지만 자료형, 매개변수 종류, 매개변수의 자료형의 개수, 매개변수의 자료형에 따라서 다르게 동작하는 것
오버 라이딩 : 상속관계에서 슈퍼 클래스의 메서드를 서브 클래스마다 서로 다르게 구현한 것
- 클래스 선언
public class Circle {
int radius; // 원의 반지름 필드
String name; // 원의 이름 필드
public Circle() { } // 원의 생성자
public double getArea() { // 원의 면적 계산 메소드
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza; //클래스 레퍼런스
pizza = new Circle(); // Circle 객체 생성
pizza.radius = 10; // 피자의 반지름을 10으로 설정
pizza.name = "자바피자"; // 피자의 이름 설정
double area = pizza.getArea(); // 피자의 면적 알아내기
System.out.println(pizza.name + "의 면적은 " + area);
Circle donut = new Circle(); // Circle 객체 생성
donut.radius = 2; // 도넛의 반지름을 2로 설정
donut.name = "자바도넛"; // 도넛의 이름 설정
area = donut.getArea(); // 도넛의 면적 알아내기
System.out.println(donut.name + "의 면적은 " + area);
}
}
클래스 선언에서 클래스 레퍼런스를 먼저 선언하고 클래스 객체를 생성해준다.
- 생성자
public class Book {
String title;
String author;
public Book(String t) { // 생성자
title = t; author = "작자미상";
}
public Book(String t, String a) { // 생성자
title = t; author = a;
}
public static void main(String [] args) {
Book littlePrince = new Book("어린왕자", "생텍쥐페리");
Book loveStory = new Book("춘향전");
System.out.println(littlePrince.title + " " + littlePrince.author);
System.out.println(loveStory.title + " " + loveStory.author);
}
}
생성자가 한 개도 코드에 없을 경우 자동적으로 디폴트 생성자가 생성된다. (단 1개라도 생성자가 있을 경우 디폴트 생성자는 생성되지 않는다)
생성자도 오버 로딩이 가능하다.
- this 레퍼런스
public class Book {
String title;
String author;
void show() { System.out.println(title + " " + author); }
public Book() {
this("", "");
System.out.println("생성자 호출됨");
}
public Book(String title) {
this(title, "작자미상");
}
public Book(String title, String author) {
this.title = title; this.author = author;
}
public static void main(String [] args) {
Book littlePrince = new Book("어린왕자", "생텍쥐페리");
Book loveStory = new Book("춘향전");
Book emptyBook = new Book();
loveStory.show();
littlePrince.show();
}
}
- 객체 자신에 대한 레퍼런스
- 클래스 내부 메서드에서 쓰인다.
- 객체의 멤버 변수와 매개변수가 같을 때 쓰인다.
- this()
생성자 코드의 제일 처음에 위치해야 한다.
생성자 내부에서 사용 가능
클래스 내부에서 다른 생성자를 호출 가능하다.
- 과제
import java.util.Scanner;
public class Radom_num_game {
public static void main(String[] args) {
while(true) {
Scanner scanner = new Scanner(System.in);
int random_Num = (int)(Math.random()*1000 +1); //Math함수의 랜덤을 이용한 랜덤숫자 뽑기(1~1000)
int input_Num; //입력 숫자
int min_Num = 1 ; //범위 최소값
int max_Num = 1000; //범위 쵀대값
int count=1; //입력한 숫자 개수
char ans ; //계속,종료 답 저장할 변수
System.out.println("수를 결정하였습니다.맞추어 보세요.\n1~1000");
while(true) {
System.out.println( count+">>");
input_Num = scanner.nextInt(); //입력숫자 입력
while(input_Num<1 || input_Num >1000) { //입력숫자 범위를 벗어난 경우 실행
System.out.println("범위를 벗어났습니다.\n다시입력해주세요.");
System.out.println( count+">>");
input_Num = scanner.nextInt();
}
count++; //입력된 숫자 개수 증가
if(input_Num == random_Num) { //랜덤숫자와 입력숫자와 같은 경우
System.out.println("맞았습니다.");
while(true) {
System.out.println("다시하시겠습니까(y/n)>>");
ans = scanner.next().charAt(0); //문자 1개를 입력받는 방법
if (ans == 'y') { //게임 재시작
System.out.println("게임을 계속진행합니다.");
break;
}
else if (ans == 'n'){ //게임 종료
System.out.println("종료합니다.");
scanner.close();
System.exit(0); //프로그램 종료
}
else { // y,n이 아닌경우
System.out.println("다시 입력해주세요.");
continue; //잘못 입력한 경우 무한반복
}
}
if (ans == 'y') //게임을 계속 진행
break; //진행중인 게임을 종료하고 재시작
}
else if(input_Num > random_Num) { //랜덤숫자가 입력숫자 보다 작은 경우
max_Num = input_Num; //범위 최대값에 입력숫자 저장
System.out.println("더 낮은 수를 입력하세요 ");
System.out.println(min_Num + "~" +max_Num);
}
else{ //랜덤숫자가 입력숫자 보다 큰 경우
min_Num = input_Num; //범위 최소값에 입력숫자 저장
System.out.println("더 높은 수를 입력하세요 ");
System.out.println(min_Num + "~" + max_Num);
}
}
}
}
}
과제를 푸는 과정에서 게임을 재시작할 때 무한 while문을 다루는 것이 조금 어려웠다.
scanner.next(). charAt(0)을 쓰면 문자 1개를 입력받을 수 있다는 것과 (int)(Math.random()*1000 +1)을 통해 랜덤 숫자를 생성할 수 있다는 것을 알게 되었다.
Math.random()*1000 +1 은 기본적으로 실수형이라 정수형으로 형 변환을 해주었다.
세 번째 튜터링을 끝내고 C++에서 배워서 용어들을 안 헷갈릴 줄 알았지만 아직 헷갈리는 것을 보면 공부가 미흡한 것 같다. 헷갈리지 않게 확실한 암기가 필요하다.
과제를 하면서 오랜만에 깊이 있게 생각하면서 시간 가는 줄 모르고 코딩을 했던 것 같다.
이런 맛에 코딩하는 것 같다 ㅎㅎ
'JAVA' 카테고리의 다른 글
[JAVA] 공부 6일차! (2021-07-26) (0) | 2021.07.28 |
---|---|
[JAVA] 공부 5일차! (2021-07-23) (0) | 2021.07.24 |
[JAVA] 공부 4일차! (2021-07-21) (0) | 2021.07.22 |
[JAVA] 공부 2일!! (2021-07-14) (0) | 2021.07.15 |
[JAVA] 공부시작! (2021-07-09) (0) | 2021.07.14 |