관리 메뉴

거니의 velog

230728 자바 강의 본문

대덕인재개발원_Java

230728 자바 강의

Unlimited00 2023. 7. 29. 15:45

[Unit.java]

package ddit.chap07.sec08;

interface Repairable {} // 주로 able 접미사가 붙으면 interface인 경우가 많다.

public class Unit {
	int hitPoint;
	final int MAX_HP; // 리터럴 상수.
	
	Unit(int hp) {
		MAX_HP = hp;
	}
}

class GroundUnit extends Unit {
	GroundUnit(int hp) {
		super(hp);
	}
}

class AirUnit extends Unit {
	AirUnit(int hp) {
		super(hp);
	}
}

class Tank extends GroundUnit implements Repairable {
	Tank() {
		super(150);
		hitPoint = MAX_HP; // 상속받지 않은 Tank의 것.
	}
	
	@Override
	public String toString() {
		return "탱크";
	}
}

class DropShip extends AirUnit implements Repairable {
	DropShip() {
		super(125);
		hitPoint = MAX_HP;
	}
	
	@Override
	public String toString() {
		return "수송선";
	}
}

class SCV extends GroundUnit implements Repairable {
	SCV() {
		super(50);
		hitPoint = MAX_HP;
	}
	
	public void repair(Repairable r) {
		if(r instanceof Unit) {
			Unit u = (Unit) r; // 매개 변수로 업캐스팅됨.
			while(u.hitPoint != u.MAX_HP) {
				u.hitPoint++;
			}
			System.out.println(u + "의 수리 완료");
		}
	}
	
	@Override
	public String toString() {
		return "일꾼";
	}
}

class Marine extends GroundUnit {
	Marine() {
		super(30);
		hitPoint = MAX_HP;
	}
	
	@Override
	public String toString() {
		return "해병";
	}
}

[UnitExample.java]

package ddit.chap07.sec08;

public class UnitExample {

	public static void main(String[] args) {
		
		Tank tank1 = new Tank();
		Unit tank2 = new Tank(); // 업캐스팅으로 주로 만듦.
		SCV scv = new SCV();
		
		scv.repair(new Tank());
		scv.repair(tank1);
//		scv.repair(tank2); // 오류.
		
	}

}


[View.java]

package ddit.chap07.sec09;

public interface View {

	// public static final 생략된 정적 상수로 자동 컴파일.
	int HOME = 1;
	int HOME_MAIN = 11;
	
	// 메뉴 구조를 계층 구조로 만드는 것.
	// 대 메뉴
	int MEMBER = 2;
	// 중 메뉴
	int MEMBER_SIGNUP = 21;
	int MEMBER_LOGIN = 22;
	int MEMBER_UPDATE = 23;
	int MEMBER_LOGOUT = 24;
	
	// 대 메뉴
	int ADMIN = 3;
	// 중 메뉴
	int ADMIN_LOGIN = 31;
	int ADMIN_LOGOUT = 32;
	
}

[Controller.java]

package ddit.chap07.sec09;

import java.util.Scanner;

public class Controller {

	static Scanner sc = new Scanner(System.in);
	
	public static void main(String[] args) {
		
		new Controller().start(); // 한번만 호출할 때 사용, 변수를 만드는 경우는 여러번 호출하는 경우.
		
	}
	
	public void start() {
		int view = View.HOME; // 인터페이스.정적상수 호출 -> 개발자에게 기능을 명시하기 위해 사용.
		while(true) {
			switch(view) {
			case View.HOME :
				view = home();
				break;
			case View.MEMBER_LOGIN :
//				view = memberService.logIn();
				break;
			case View.MEMBER_SIGNUP :
//				view = memberService.signUp();
				break;
			case View.ADMIN_LOGIN :
//				view = memberService.adminLogIn();
				break;
			}
		}
	}
	
	public int home() {
		System.out.println("              ((회원관리))              ");
		System.out.println(" (1) 로그인      (2) 회원가입      (3) 관리자 접속");
		System.out.print("[선택] ");
		int choice = Integer.parseInt(sc.nextLine());
		switch(choice) {
		case 1 :
			return View.MEMBER_LOGIN;
		case 2 :
			return View.MEMBER_SIGNUP;
		case 3 :
			return View.ADMIN_LOGIN;
		default :
			return View.HOME;
		}
	}

}


[익명 클래스]

한 번만 사용한다.

이벤트 드리븐에 기반하여 이벤트 핸들러가 기술되는 GUI 프로그램에 사용.

AWT, Swing 등에 사용.

 

[중첩 클래스]

클래스 안에 또 다른 클래스

사용 빈도 수는 낮기 때문에 안한다.

 

[예외 클래스]

컴파일러에 의해 발생되지 않는 오류. 실행 시 발생하는 오류.

오류 메시지 어떻게 발생하는지 신기하지 않나?

컴파일은 입력되어진 원시 코딩을 가져다 공백을 기준으로 단어를 자름. 이를 토큰이라 부름
토큰을 가지고 파싱함. 파스트리가 만들어짐. 나무를 거꾸로 매달아 원시 뿌리(root), 땅바닥에 붙는 것은 잎사귀(leaf).
나무가 여러 개 있는 것은 숲(forest)
루트를 제거한 나머지 트리를 서브 트리라 한다.
자료를 저장하거나 정렬할 때 사용.
단어를 분해하고 예약어, 명령어 테이블을 죽 훑는다. 없으면 사용자 정의 단어.
명령어 테이블에 저장된 녀석을 가지고 제대로 썼는지 판별하려면? for문에 대한 구문 구조가 들어 있음. 사용자가 만든 구문 구조를 가지고 비교해 나감.
그런데 어딘가 잘못 쓰면 구문 구조를 바탕으로 한 트리가 안 만들어짐. 루트부터 번호가 죽 매겨지다가 비어있는 번호를 가지고 에러 메시지 테이블을 탐색하여 오류 표출.

예외는 컴파일러와 관련이 없다. 예외는 컴파일러의 문법 검색이 끝난 상태에서 실행 오류가 발생하는 것.

오류를 디버깅할 때 가장 어려운 부분이 실행 오류. 어디서 발생했는지 알 수 없다. 실행하지 않으면 알 수 없는 오류.

예외라 함은 컴파일때가 아닌 런타임때 발생.

예외는 강요된 예외가 있고, 사용자 정의 예외가 있다.
강요된 예외? 예를 들어 System.in.read(). 키보드로 자료 하나를 받아라. int로 저장. 숫자 0-9 사이의 자료를 입력 받도록 설계된 메서드.
사용자가 한 글자가 아닌 여러 글자를 입력하면 오류 발생. 자바를 탓함. 계속 컴플레인. 아예 오류 메시지를 표출하는 것.

예외는 try-catch-finally

예외는 제공된 예외 클래스가 있다. 원인에 따른 것. 예외 발생시 컴파일러는 체크 불가. 런타임시 JVM에서 이벤트 발생. 이벤트가 어떤 예외인지 판별해 준다. 그 예외 종류에 따라서 예외 클래스를 반환. 이를 가지고 처리하는 것.

에러는 심각한 오류이므로 프로그램을 실행할 수 없는 상태.

오류는 사소한 원인에 의해 발생된 오류를 특별히 Exception이라 함.
이 사소한 오류라도 원칙적으로 프로그램이 멈추고 제어를 운영체제인 윈도우나 맥이나 리눅스에게 반납해야 한다.
그렇게 되면 이제까지 수행된 중간 결과가 싹 없어진다. 그래서 손해. 심각한 후속조치 발생. DB 업데이트 중에 1000명의 급여 정보를 조작하고 있었다. 990까지 하다 10개 오류하면 밖으로 그냥 빠져나옴. commit이 안되므로 저장 불가. 설사 commit 되어도 누가 변경되었는지 알 수 없다.
빠져나오지 말고 마지막 명령문이 실행될 수 있도록, 정상적인 종료를 유도한다. 이것이 예외처리.
오류는 절대 치유될 수 없다. 오류 치유 고안하면 노벨상.

예외에서 처리하는 것은 프로그램 중단시키지 않고 정상적인 종료를 유도.

명령문이 죽 있으면 3번줄에서 예외가 발생하는 것을 판단. 프로그래머가. 전체 코드를 try 블록에 넣는다. 그 안에는 예외가 발생될 수 있는 명령문이 포함된다. 예외가 안 발생되면 다행.

예외 발생 시
try {
명령문...
오류가 있을 것으로 예상되는 구문들이 들어감.
} catch(예외클래스명 변수명) {
           // 오류 원인, 어디서 발생되었는지 위치(라인 번호), 이 정보를 가지고 있는 곳이 Call Stack. printStackTrace();
           // getMessage(); syso에 넣어야지 오류의 원인이 출력된다.
           // 이 둘 중에 한 문장을 사용.
           예외처리문;
} catch(예외클래스명 변수명) {
           // Exception 클래스(모든 예외 클래스의 조상) 상속 받아 사용.
          예외처리문;
} finally { // 예외가 발생해도 실행, 안되도 실행. default.
          명령문...
} - 예를 들어 어떤 응용 프로그램을 다운 받아 설치. abc.zip 이를 실행하니 죽 실행됨. 예외가 발생? 안 됨. 원본인 abc.zip 은 필요 없음. 없애야 함.
그런데 중간에 오류 뜨면? 설치가 되든 안 되든 반드시 지워야 하는 파일. 이를 finally에서 처리.


[ExceptionExample01.java]

package ddit.chap10.sec01;

public class ExceptionExample01 {

	public static void main(String[] args) {
		
//		String data1 = args[0];
//		String data2 = args[1];
//		
//		// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
//		System.out.println("args[0] : " + data1); 
//		System.out.println("args[1] : " + data2);
		
//		int num1 = Integer.parseInt(args[0]);
//		int num2 = Integer.parseInt(args[1]);
//		
//		// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
//		int sum = num1 + num2;
//		System.out.println(sum); // 300
		
//		// Exception in thread "main" java.lang.NullPointerException
//		String str1 = null;
//		System.out.println(str1.length()); // 객체가 생성도 안되었는데 길이를 구하라고?
		
		// Exception in thread "main" java.lang.NullPointerException
		Person p1 = null; // 객체 아직 생성도 안 됨.
		System.out.println("회원명 : " + p1.name);
		
	}

}

class Person {
	String name = "홍길동";
}


예외를 강제로 발생시키는 예약어 : throw
메서드 내부에서 사용

예외를 미루는 예약어 : throws
메서드 header에 쓴다.
예외가 발생할 명령문이 있는 구문. 그 예외를 그 메서드에서 처리하지 않고 지금 내 메서드를 실행하면 이런저런 예외가 발생할 수 있다고 경고.
수익자 부담 원칙. 메서드를 부르는 쪽에 책임 전가하여 호출문을 try-catch 문으로 묶어야 한다.

'대덕인재개발원_Java' 카테고리의 다른 글

230731 자바 강의  (0) 2023.07.31
230729 자바 과제 _ 클래스 다이어그램 구현  (0) 2023.07.29
230727 자바 강의  (0) 2023.07.29
230726 자바 강의  (0) 2023.07.26
230725 자바 강의  (0) 2023.07.25