오늘이면 수업을 들은지 꽉채운 한달이다. 물론 겨우 19일차밖에 안됐지만 서두...
생각보다 진도가 훅훅 나가서 그 두껍던 자바의 정석 책을 벌써 절반을 다 끝내간다.
그 사이에 키보드도 장만하고 키보드쿠션도 사고 여튼 진짜 뭐 하는 사람 같아짐...
예 각설하고요
오늘 배운 것을 정리해보도록 하겠습니다. 정말 정말 귀찮은데 한 번 시작했으니 끝을 꼭 봐야하기 때문에 눈물을 머금고 매일 매일 포스팅을 합니다. ...
오늘은 인터페이스 복습+예외처리까지 진도를 나갔다.
package com.sist.main;
/*
* 1. 클래스 종류
* ============
* 일반 클래스 : 접근지정어 (public , default)
* 옵션 (final , abstract)
* public final
* public abstract
* final
* abstract
* ----class className{
* =============
* 기본: private : 외부에서 데이터를 사용하지 못하게 만든다(은닉화) => 캡슐화
* 메소드와 멤버변수를 하나로 연결 사용 (getter/setter)
* 변수 : 메모리에 저장(setter) / 메모리에서 읽기 (getter)
* 옵션: static , final
* = 멤버변수 : 여러개를 저장
* = static : 저장공간이 한개 ====> 오라클 (정규화)
* -----멤버변수
* 공통변수
* ===================
* 기본 : => 역할 : 다른 클래스와 연결(메세지)
* =================
* public
* 옵션 : final , static(자동 메모리 할당) , abstract(선언)
* 동작,기능처리
* -----메소드
* ===================
* 멤버변수의 초기화 (컴파일러가 자동으로 추가(디폴트생성자)
* 기본 : public => 다른 클래스를 메모리 할당후 사용 ==> 생성자는 상속은 예외
* 생성자 => 오버로딩이 가능 (여러개의 생성자를 만들 수 있다)
* -----생성자
* ===================
* }
* 추상 클래스 : 공통점을 모아서 관리
* 메소드 선언 : 기능은 동일 => 처리 방식이 틀릴 경우
* => 관련된 클래스를 하나로 모아서 관리
* 형식)
* 추상 클래스의 단점 : 자신이 메모리 할당을 할 수 없다 (상속받은 클래스로부터 메모리 주소를 받아서 사용)
* ========================================== 미완성 클래스
* abstract class A
* class B extends A
* ==> A a=new A() (X)
* A a=new B()
* public abstract class className
* {
* ==========================
* 변수 (멤버변수,공통변수)
* ==========================
* 메소드 : 선언만 된 메소드 => 공통으로 사용하는 기능
* ==========================
* 메소드 : 구현된 메소드 => 컴퓨터 , 노트북 (시작, 종료)
* ==========================
* 생성자
* ==========================
* }
* 인터페이스 : 추상클래스의 일종
* 클래스 : 단일 상속
* 인터페이스 : 다중 상속
* => 표준화 작업
* => 서로 다른 클래스를 연결해서 사용
* 형식)
* public interface 인터페이스명{
* =====================
* 변수 : 상수형변수 => 선언시에 반드시 값을 저장
* int a;(X)
* ( )int a=10; ===> public static final (생략)
* =====================
* 메소드:선언만 가능
* void display(); ===> public abstract (생략)
* public void display(); ===> 모든 메소드 public
* =====================
* 구현된 메소드 : JDK 1.8이상 (예전에 만든 프로그램은 존재하지 않는다)
* default void display(){} ==> default는 생략할 수 없다
* ======= default public void display(){} => public생략이 가능
* ====== 생략이 가능
* =====================
* 구현된 메소드
* static void display(){} => public 생략이 가능
* ======= static public void display(){}
* =====================
* => 개발자의 요청에 따라 추가
* => 인터페이스 : 선언만 한다 , 고정한다
* 유지보수 : 사용자의 요청
* }
*
* 내부 클래스 : 익명의 클래스 , 멤버 클래스 (네트워크,쓰레드)
* class A
* {
* 변수/메소드 => A,B가 사용이 가능 => static
* A가 서버 : 접속시마다 접속자의 IP
* class B
* {
* A가 가지고 모든 변수,메소드를 사용 => 접속자에게 메세지 전송 (IP)
* }
* }
*
* // 가장 쉽게 프로그램 => POJO (상속,구현) => 어노테이션 (구분자)
* class A
* {
* 익명 => 상속이 없는 상태에서 오버라이딩 (윈도우,빅데이터)
* B b=new B(){
* //B 클래스가 가지고 있는 모든 메소드를 재정의(오버라이딩)을 할 수 있다
* }
* }
*
* class B
* {
* public void display(){}
* }
* ========================
* 1) 사용자 정의 클래스
* 2) 라이브러리 (자바에서 제공하는 클래스) , 외부업체에서 만든 클래스
* mvnrepository.com(스프링)
* ====================================================== 조립 (조립하는 클래스)
* 클래스 : 재사용 = 포함,상속(변경해서 사용=오버라이딩)
*
* //ABBA
*/
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
여기까지는 사실 저번시간 복습이다. 내부 클래스에 대해 새로 배우긴 했는데 어차피 많이 안나온다고 하셨다
그렇다 사실 뭔가를 더 적기가 너무 귀찮다.
package com.sist.main2;
/*
* 키워드 : 클래스명 , 메소드명 (제외)
*/
interface DataBase
{
public void connect();
public void disconnect();
}
class Oracle implements DataBase
{
@Override
public void connect() {
// TODO Auto-generated method stub
}
@Override
public void disconnect() {
// TODO Auto-generated method stub
}
}
class MsSQL implements DataBase
{
@Override
public void connect() {
// TODO Auto-generated method stub
}
@Override
public void disconnect() {
// TODO Auto-generated method stub
}
}
class MySQL implements DataBase
{
@Override
public void connect() {
// TODO Auto-generated method stub
}
@Override
public void disconnect() {
// TODO Auto-generated method stub
}
}
class DB2 implements DataBase
{
@Override
public void connect() {
// TODO Auto-generated method stub
}
@Override
public void disconnect() {
// TODO Auto-generated method stub
}
}
class Container
{
public DataBase dbSelect(String type)
{
DataBase db=null;
if(type.equals("Oracle"))
db=new Oracle();
else if(type.equals("MsSQL"))
db=new MsSQL();
else if(type.equals("MySQL"))
db=new MySQL();
else if(type.equals("DB2"))
db=new DB2();
return db;
}
}
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
인터페이스 상속받은 뒤 내부 클래스에서 모아서 사용하고 있다.
여기서 부터가 사실 가장 핵심인 예외처리하기 내용이다
package com.sist.exception;
/*
* 에러
* 1. 에러 : 소스상에서 수정할 수 없는 에러 - 메모리 부족, 운영체제 문제...
* 2. 예외 : 소스상에서 수정할 수 있는 에러 - 사용자의 입력이 잘못된 경우, 파일명이 틀리다
* =============================================================
* 에외 회피 : 간접처리 throws
* 예외 처리 : 직접 처리 try~catch
* 임의 발생 throw
* 사용자 정의 에외처리
* =============================================================
* 예외처리 목적 : 비정상 종료 방지하고 정상 종료를 할 수 있게 만드는 과정
* 미리 에러를 방지할 수 있게 예측
* 에러 : 프로그래머 실수, 사용자 입력
* ====================
* A.java ============> A.class(0,1) ============> 한줄씩 읽어서 출력
* 원시소스 javac java
* (프로그래머)
* ======= =====
*
* 1. 컴파일 에러 - 반드시 예외처리
* 2. 실행시 에러 - 예외처리 생략할 수 있다(필요시 예외처리를 할 수 있다)
* ======================================================
* Check Exception NON-Check Exception
* ======================================================
* 컴파일시에 확인 실행시에 확인 (예외처리가 없어도 된다)
*
* 에외처리의 게층도
* =============
*
* Object
* |
* Throwable
* |
* ----------------------
* | |
* Error Exception
* |
* Check NON-Check
* --------------------------------------------
* | |
* IOException (파일) |
* InterruptionException (쓰레드) |
* URLMalformedException(네트워크) |
* ClassNotException |
* SQLException(데이터베이스) RuntimeException
* |
* ArrayIndexOutofBoundsException
* NumberFormatException
* ArithemticException
* NullPointerException
* ClassCastException
*
*
* 예외처리
* = 예외 복구 (직접처리)
* try
* {
* 정상 수행문장
* }catch()
* {
* 수행과정 => 에러발생을 하면 복구
* }
* = 예외 회피 (예외 떠넘기기) - 자바시스템 => Throws
* = 예외 전환 (에러가 발생할 예상지역 => 다른 예외를 발생) => throw(사용자 정의 예외)
*
*
*/
public class MainClass {
public static void main(String[] args) {
/*int a=10;
int b=0;
int result=a/b; // 프로그램 종료 => 비정상 종료
System.out.println("프로그램 종료!!");*/
try
{
int a=10;
int b=0;
int result=a/b; // 에러발생 ===> catch이동
System.out.println("result="+result);
}catch(Exception e)
{
System.out.println("프로그램 오류!!"); // {} 다음 소스로 이동
}
System.out.println("프로그램 종료");
}
}
try 안은 정상수행문장이고 그 안에서 에러가 발생하면 catch 문에 있는 내용을 수행한다.
그리고 프로그램이 종료된다.
이렇게 말입니다.
package com.sist.exception;
/*
* 사용자로부터 2개의 정수를 받아서 배열에 저장한 다음에 두개 나누기한 결과값을 출력
* ======== ======
* catch => 3개 (기타)
*
*
* 예상되는 에러?
*/
import java.util.Scanner;
public class MainClass3 {
public static void main(String[] args) {
try
{
Scanner scan = new Scanner(System.in);
System.out.print("첫번째 정수 입력:");
int a=scan.nextInt();
System.out.print("두번째 정수 입력:");
int b=scan.nextInt();
int[] arr= {a,b};
int res=arr[0]/arr[1];
System.out.println("res="+res);
// catch에 등록한 예외처리 클래스에 순서가 존재한다-Exception이 가장큼
}
catch(ArrayIndexOutOfBoundsException e) // 배열의 범위를 벗어난 경우에만 처리가 가능
{
System.out.println("배열의 범위를 초과 했습니다");
}catch(ArithmeticException e) // 0으로 나누기할때만 처리 가능
{
System.out.println("0으로 나눌 수 없습니다");
}catch(RuntimeException e)
{
System.out.println("예측 못한 예외가 발생했습니다");
}
System.out.println("프로그램 종료");
}
}
위의 코드는 에러의 종류를 확인할 수 있는 코드이다. Exception 에러는 저 위 코드들 보다 상위 개념의 오류이기 때문에 사용할거면 가장 아래에 사용해야 한다.
그렇지 않으면 위에서 먼저 걸러지기 때문에 밑에서 오류 처리 실행문장을 쓴 의미가 없기 때문이다.
package com.sist.exception;
// try~catch => 위치 선정을 잘해야 처리가 가능
public class MainClass5 {
public static void main(String[] args) {
int[] arr= {10,20,30,20,0,10,20,30,40,50};
int a=100;
try
{
for(int b : arr) // for문 안쪽에 try-catch 써줘야함
{
try {
System.out.println(a/b);
}catch(Exception e) {}
}
}catch(Exception ex)
{
ex.printStackTrace();
}
System.out.println("프로그램 종료!!");
}
}
어려워 보였던 for문 안에서 예외처리하기
배열의 값들이 정상적으로 실행문장을 실행하는지 try구문을 통해 확인하고, 그때 오류가 있으면 오류처리를 해준 다음에 for 문을 닫는다.
또 catch문을 사용해서 마지막으로 오류 처리를 최종적으로 해주고 코드를 마무리 한다.
예시를 보면 0으로 나눈 값만 오류처리가 되어 건너뛴것을 확인할 수 있다
'programming > Gukbi' 카테고리의 다른 글
국비 교육 22일차 - 라이브러리 활용 (0) | 2021.01.24 |
---|---|
국비 교육 21일차 - 예외처리 (1) | 2021.01.24 |
국비 교육 18일차 - abstract & interface (0) | 2021.01.19 |
국비 교육 17일차 - 상속, 포함 (0) | 2021.01.19 |
국비 교육 16일차 (0) | 2021.01.15 |