본문 바로가기
Back-End/Java

[java] 예외처리, 객체지향, 클래스

by LeeGangEun 2022. 2. 4.

예외(Exception)란?

자바에서 오작동이나 결과에 악영향을 미칠 수 있는 실행 중 발생한 오류를 예외라고 한다.

실행 중에 예외가 발생하는 몇 가지 경우이다.

 

 • 정수를 0으로 나누는 경우

 • 배열의 크기보다 큰 인덱스로 배열의 원소를 접근하는 경우

 • 존재하지 않는 파일을 읽으려고 하는 경우

 • 정수 입력을 기다리는 코드가 실행되고 있을 때, 사용자가 문자를 입력한 경우

 

위와 같이 예외가 발생하면 자바 플랫폼이 먼저 알게 되어, 실행 중인 응용프로그램에게 예외를 전달한다.

만일 응용프로그램이 예외에 대처하는 코드를 가지고 있지 않다면, 자바 플랫폼은 응용프로그램을 곧바로 종료시킨다.

 

예외 처리, try-catch-finally 문

예외 처리란, 예외가 발생하면 이에 대응하는 것을 말한다. 자바는 예외 처리를 위해 아래와 같은 문법을 사용한다.

try-catch문 예제

import java.util.Scanner;

public class DevideByZeroHandling {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
	
		int a = 10;
		int b = 0;

		try {
			System.out.println(a/b);
		}
		catch(Exception e){   // 어떤 에러가 나는지 자세하게 알고 있으면 
			//  Exception e 자식클래스인 ArithmeticException e 이렇게 자세하게 쓰고
							// 모른다면  슈퍼클래스인 Exception e 만 써도 모든 예외처리 가능
			System.out.println("0으로 나눌 수 없습니"
					+ "0다! 다시 입력하세요."); //  사용자용
//			e.printStackTrace();  // 에러메시지를 상세하게 추적해서 출력해줌   >> 개발자용
		}
		System.out.println("이 부분이 실행 될까요?");

//------------------------------------------------		--------------------------------------
		int[] arr = new int[5];
		try {
		for(int i=0; i<arr.length; i++) {
			arr[i+1]=i;
		}
		}catch(Exception e) {
			System.out.println("배열이 범위를 벗어났습니다.");
			System.out.println("이부분이 실행되는지 보세용 ㅎㅎ");
		
		}
		
	}

}

객체 지향 특성

1)캡슐화(Encapuslation)

• 외부의 접근으로부터 객체 보호 -> 캡슐화 통해 정보은닉 가능

• 클래스(class) : 객체 모양을 선언한 틀

• 객체 : 생성된 실체(Instance), 클래스 내에 메소드와 필드 구현

2)상속(Inheritance)

• 자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extends)하는 개념이다.

• 상위 클래스 = 슈퍼 클래스(super class)

• 하위 클래스 = 서브 클래스(sub class)  - 상위 클래스 코드의 재사용, 새로운 특성을 추가할 수 있다.

Animal 클래스 = 슈퍼 클래스

Human 클래스 = 서브 클래스

 

3) 다형성(Polymorphism)

• 같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현하는 것

• 오버라이딩(Overriding) - 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용

• 오버로딩(Overloading) - 같은 이름의 메소드 여러개를 가지면서 파라미터의 유형과 개수가 다르도록 하는것

 

클래스(Class) 구성

• 자바 클래스는 class 키워드를 사용하여 선언한다.

• 멤버 : 클래스의 구성요소를 지칭 

   1) 필드 - 멤버 변수

   2) 메소드 - 멤버 함수

 

클래스의 객체 생성 및 활용 예시

public class Circle {
	
	int radius; // 원의 반지름 필드
	String name; // 원의 이름 필드
	
	public double getArea() {
		return 3.14 * radius * radius; 
	}
	
	public static void main(String[] args) {
		Circle pizza; // 레퍼런스 변수 선언
		pizza = new Circle(); // circle 객체 선언
        pizza.radius = 10;
		pizza.name = "자바피자";
		double area = pizza.getArea();
		System.out.println(pizza.name + "의 면적은 " + area);
		
		Circle donut = new Circle(); // 레퍼런스 변수 선언 및 circle 객체 선언
		donut.radius = 2;
		donut.name = "자바도넛";
		area = donut.getArea();
		System.out.println(donut.name + "의 면적은 " + area);
	}

}

 

-------------------강사님 강의 메모 ------------------------

실행시 에러(Runtime Error)
: 정상적으로 실행되다가 갑자기 발생하는 에러

컴파일 에러

: 문법에 맞지 않게 작성됐을때, 컴파일할 때 발견

JAVA에서 예외처리가 꼭 필요한 경우
1. 입출력
   - 파일 입출력
   - DB 입출력
   - 네트워크 입출력

2. Thread

 

OOP는 
1. 대규모 프로젝트에 적합
 - 유지보수 편리
 - 협업에 편리
2. 개발비용이 더 들 수 있다.
3. 더 무거울 수 있다.

----------------------------------------------------------------
TOC(Total Of Cost)
 : S/W를 개발단계부터 폐기까지의 총비용

배열의 이름은 레퍼런스
문자열의 이름은 레퍼런스
인스턴스명의 이름은 레퍼런스

홍길동은 이순신으로 개명할 수 있고
이순신도 홍길동으로 개명할 수 있지만 사람은 그대로다.
그것이 실체의 값(메모리값)과 변수(레퍼런스)값의 차이 ..

생성자의 역할
1. 인스턴스 생성
2. 멤버변수 초기화

---------------------------------------------------------------
클래스의 역할

1. 객체생성시(설계도)
2. 사용자정의데이터형

---------------------------------------------------------------------------6일차 퀴즈 -------------------------------------------------------------

이름, 국어, 영어, 수학 점수를 저장할 수 있는 Student클래스를 만들어서 객체를 생성하고 출력하기.

public class Student {
	
	String name;
	int korea = 0, 
		english =0, 
		math =0;	

	
	public static void main(String[] args) {
		
		Student lge = new Student();
		
		lge.name ="이강은";
		lge.korea = 100;
		lge.english = 58;
		lge.math = 35;
		
		System.out.println(lge.name + "학생\n국어 :" + lge.korea +"\n"+ "영어 :" + 
		lge.english +"\n"+ "수학 :" + lge.math);
	}
}

Student클래스를 사용해서 연습문제 5-3번을 구현해보기

5-3 번 문제 : 학생 이름, 국어, 영어, 수학 점수를 입력하여 평균을 구해서 출력하는  
프로그램을 작성하시오. 계속 반복하다가 "exit"를 입력하면 종료.

 

import java.util.Scanner;

public class StudentHard {
	
	String name;
	int korea = 0, 
		english =0, 
		math =0;
	
	public double getAvg() {
		return (korea + english + math) /3 ;
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StudentHard lge = new StudentHard();
		
		while(true) {
		System.out.println("이름  국어 영어 수학 점수를 차례대로 입력하세요");	
		lge.name = sc.next();
		if(lge.name.equals("exit")) {
			System.out.println("프로그램이 종료됩니다.");
			break;
			}
		try {
		lge.korea = sc.nextInt();
		lge.english = sc.nextInt();
		lge.math = sc.nextInt();
		}catch(Exception e){
			System.out.println("ERROR!! 정수만 입력해주세요\n");
			continue;
		}
		System.out.println(lge.name + "학생\n국어 :" + lge.korea +"\n"+ "영어 :" + 
				lge.english +"\n"+ "수학 :" + lge.math +"\n평균 점수 :"+lge.getAvg() +"\n");
		}
	}
}

'Back-End > Java' 카테고리의 다른 글

[java] 추상클래스와 인터페이스  (0) 2022.02.08
[java] 접근지정자  (0) 2022.02.07
[java] continue와 break 그리고 배열  (0) 2022.02.03
[java] 조건문과 반복문  (0) 2022.01.28
[java] 연산자와 Scanner  (0) 2022.01.27