JAVA

[JAVA] 공부 3일! (2021-07-16)

HJ39 2021. 7. 17. 01:56

세 번째 튜터링 시간에는 예외처리 방법(try-catch) , 객체지향의 개념 , 클래스 객체를 배웠다.

예외처리(try-catch)

객체지향 개념

클래스 선언

생성자

this 레퍼런스

과제

 

 

  • 예외처리(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로 후속 조치를 하는 것과 같다

순서를 나열하면 다음과 같다.

  1. 예외가 발생될 코드를 try로 묶는다.
  2. catch (괄호) 괄호 안에 예외처리 코드를 입력한다
  3. catch 안에 예외 발생 시 실행할 코드를 입력한다.

 

  • 객체지향 개념

객체지향 개념으로 간단하게 5가지로 나열할 수 있다.

  1. 패키지
  2. 캡슐화
  3. 클래스
  4. 상속
  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();
	}
}

 

  1. 객체 자신에 대한 레퍼런스
  2. 클래스 내부 메서드에서 쓰인다.
  3. 객체의 멤버 변수와 매개변수가 같을 때 쓰인다.
  • 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