종료하기 전 티스토리 네이버 구글 로그아웃 할 것
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
[16]부터 시작!
생성자는 new 할 때 호출됨 :)!
자식 클래스 객체 생성시 - 부모 클래스의 생성자가 먼저 호출! -> 그담에 자식 생성자 호출!
메모리상에 부모 - 자식 만들어지니까
클래스의 기본 생성자 안에는 부모의 기본 생성자를 호출하는 코드가 숨겨져있음.
super(); <- 이거!
package day09;
class TV{
}
class Movie extends TV{
String part = "한국 영화";
}
class Action extends Movie{
String name = "";
}
public class MovieTest_1 {
public static void main(String args[]){
Action act = new Action();
/*
* 요기서 생성자를 호출하는데
* Action()이 없으니까 기본 생성자
* 자동 호출
*
* 근데 사실은 Action(){}은
* Action(){
* super();//부모의 기본생성자 호출!
* }
* 가 숨겨져 있는 거임
*
* 그러면 Movie(){} 안에는
* Movie(){
* super();
* } 가 숨겨져있는거임
*
* 그러면 또 TV(){} 안에는
* TV(){
* super();
* } 가 숨겨져 있음
*
*
* */
act.name = "마파도";
System.out.println(act.name);
}
}
그러니까 생성자는
자식1 호출 -> 부모1(자식1부모) 호출 -> 부모2(부모1부모) 호출
부모2 실행 -> 부모1 실행 -> 자식1 실행
순서로 감
package day09;
class A{
A(){
super();//얘는 부모(Object)의 기본생성자 호출
System.out.println("생성자 A");
}
}
class B extends A{
public B(){
super();//얘도 부모의 기본생성자 호출
System.out.println("생성자 B");
}
}
class C extends B{
public C(){
super(); //부모의 기본생성자 호출!
System.out.println("생성자 C");
}
}
public class ConstructorEx_2 {
public static void main(String[] args) {
C c = new C();
//호출 순서 C -> B -> A - 부른 애가 엄마를 부릅니다 엄마도 엄마를 부릅니다 x 상속개수만큼
//실행 순서 A -> B -> C - 가장 최상위부터
}
}
어제 의문이 해결되니까 기분이 좋당 :D
그러니까 생성자의 "첫라인" 에 super()가 있는것.
package day09;
class TV2{
public TV2(){
super();
System.out.println("TV2");
}
}
class Movie2 extends TV2{
String part="한국 영화";
public Movie2(){
super();
System.out.println("Movie2");
}
}
class Action2 extends Movie2{
String name = "";
public Action2(){
super();
System.out.println("Action2");
}
}
public class MovieTest2_3 {
public static void main(String [] args){
Action2 act = new Action2();
System.out.println("생성자 호출 끝");
act.name = "마파도";
System.out.println(act.name);
}
}
그러니까 super는 생성자 중에서도 "기본 생성자"를 호출함.
package day09;
class A1{
A1(){
System.out.println("기본생성자 A1");
}
A1(int x){
System.out.println("int형 생성자 " + x);
}
}
class B1 extends A1{
B1(){
System.out.println("기본생성자 B1");
}
}
public class ConstructorEx2_4 {
public static void main(String[] args) {
B1 b;
b = new B1();
}
}
---------------------------기본생성자가 없으면------------------------
package day09;
class A1{
A1(int x){
System.out.println("int형 생성자 " + x);
}
}
class B1 extends A1{
B1(){
System.out.println("기본생성자 B1");
}
}
public class ConstructorEx2_4 {
public static void main(String[] args) {
B1 b;
b = new B1();
}
}
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Implicit super constructor A1() is undefined. Must explicitly invoke another constructor
at day09.B1.<init>(ConstructorEx2_4.java:11)
at day09.ConstructorEx2_4.main(ConstructorEx2_4.java:20)
오류남 -_-)ㅋㅋ
package day09;
//에러요소가 잠재적으로 존재하는 경우
class Movie3 {
String part = "";
public Movie3() {
System.out.println("Movie3 기본 생성자");
}//기본 생성자
public Movie3(String part) {
this.part = part;
System.out.println("Movie3");
}//String을 받는 기본 생성자
}
class Comedy3 extends Movie3 {
String time = "";
String name = "";
public Comedy3() {
}
public Comedy3(String time, String name) {
//super();
this.time = time;
this.name = name;
System.out.println("Comedy3");
}
}
public class MovieTest3_5 {
public static void main(String [] args) {
// 파라미터가 있는 생성자만 호출합니다.
//잉 부모의 기본 생성자도 호출되는데? - 아 그냥 무조건 super()가 포함되어져 있는거임
//매개변수가 있는 생성자라도 부모는 기본 생성자로 호출한다.
//굳이 파라미터값 넣어주면 매개변수 있는 부모 생성자 호출할 수 있긴 함
Comedy3 com = new Comedy3("21:00", "마파도");
// 기본 생성자는 기존에 생성자가 없는 경우만
// 자동으로 만들어집니다.
Comedy3 com2 = new Comedy3();
// System.out.println(com.time);
// System.out.println(com.name);
}
}
-------------------------------------------------------------------
매개변수가 있는 생성자가 있는 경우에 기본 생성자가 없으면 오류난다.
근데 이거 명시적으로 자식 클래스에서 super(매개변수가 있는 생성자의 변수 타입에 맞는 값) 을 써주던가
그냥 기본 생성자를 만드는 편이 낫다.
package day09;
class A3{
public A3(int x){
System.out.println("생성자 A3");
}
}
class B3 extends A3{
public B3(){
System.out.println("생성자 B3");
}
}
public class ConstructorEx2_6 {
public static void main(String[] args) {
B3 b;
b = new B3();
}
}
이러면

고치는 법 1.
class B3 extends A3{
public B3(){
super(1);
System.out.println("생성자 B3");
}
}
이렇게 고치던가
고치는 법 2.
package day09;
class A3{
A3(){
System.out.println("기본생성자 A3");
}
public A3(int x){
System.out.println("생성자 A3");
}
}
class B3 extends A3{
public B3(){
System.out.println("생성자 B3");
}
}
public class ConstructorEx2_6 {
public static void main(String[] args) {
B3 b;
b = new B3();
}
}
이렇게 그냥 기본 생성자를 만들어준다.
package day09;
class A4 {
A4() {
System.out.println("기본 생성자 A4");
}
public A4(int x) {
System.out.println("매개변수 생성자 A4");
}
}
class B4 extends A4 {
public B4() {
System.out.println("기본 생성자 B4");
}
public B4(int x) {
// 기본적으로 매개변수가 있어도
// super(); //가 생략된 것이라
// 매개변수 있는 생성자도 부모는 기본생성자
// 를 호출한다.
// super(1); //굳이 파라미터값 넣어주면
// 매개변수 있는 생성자 호출 가능
System.out.println("매개변수 생성자 B4");
}
}
public class ConstructorEx3_7 {
public static void main(String[] args) {
B4 b = new B4(10);
}
}
재밌음.
질문 1> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행되는가?
아니면 서브 클래스의 생성자만 실행되는가?
둘다 실행됨
질문 2> 서브 클래스의 인스턴스가 생성될 때 서브 클래스의 생성자와 슈퍼 클래스의 생성자의 실행 순서는 어떻게 되는가?
실행: 최상위 슈퍼 클래스 -> 최하위 서브 클래스
호출: 최하위 자식 클래스 -> 최상위 부모 클래스
------------------------------------------------------------------------------
this: 메소드안에서 자기 자신을 가리키는 객체 변수
메소드를 호출한 객체의 해시코드(주소)를 가지고 있음
사용 - this.멤버변수
this() - 현재 클래스 생성자 호출
super: 메소드안에서 상위 클래스 객체를 나타내는 객체 변수
상속에서 부모객체가 은닉이 되버리니까 접근할 수 있는 방법!
사용 - super.멤버변수
super() - 부모 클래스 생성자 호출
생성자: new를 이용하여 메모리 할당이 끝난 후 메모리를 초기화하는 역할을 한다.
멤버 변수에 초기값을 할당한다.
package day09;
class This{
String area = "서울시";
public void prn(){
// System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this);
//그냥 this라고 쓰면
//16진수 형태의 해시코드가 출력된다
System.out.println("이 메소드를 호출한 객체의 HashCode \n" + this.hashCode());
System.out.println(this.area);
}
}
public class ThisTest_8 {
public static void main(String[] args) {
This obj1 = new This();
obj1.area = "인천시";
obj1.prn();
//객체의 HashCode가 prn() 메소드로 호출된다.
System.out.println("obj1.hashCode()\n" + obj1.hashCode());
}
//this.hashCode()랑 obj1.hashCode()랑 같은거임
//main(static)에서는 객체 생성 전에 메모리를 잡은거라
//static에서는 this나 super는 쓸 수 없음.
}
---------------------------------------------------------
Super!
package day09;
class School{
int year = 0;
public School(){
// System.out.println("생성자1!");
this.year = 0;
}
}
class MiddleSchool extends School{
int year = 0;
//이러면 부모의 year는 은닉됨!
//출력하고 싶으면 super.year
public MiddleSchool(){
// System.out.println("생성자2!");
this.year = 3;
}
public void prn(){
//print였음... -_-);;
System.out.println("year: " + year);
System.out.println("this.year: " + this.year);
System.out.println("super.year: " + super.year);
//super는 부모클래스
}
}
public class SuperTest_9 {
public static void main(String[] args) {
MiddleSchool middleSchool = new MiddleSchool();
middleSchool.prn();
}
}
---------------------------------------------------
package day09;
class SuperObject{
protected String name;
public void paint(){
draw();
}
public void draw(){
System.out.println(name);
}
}
public class SubObject_10 extends SuperObject{
protected String name;
public void draw(){
name = "Sub";
super.name = "Super";
super.draw();
System.out.println(name);
}
//그럼 출력이
//super - sub
public static void main(String[] args) {
SuperObject b = new SubObject_10();
//이거 ... 업캐스팅!
b.paint();
//그래서 SuperObject의 name을 호출해도
//은닉되어져서 super.draw()을 호출하지 않으면
//SubObject_10의 draw()가 출력된다.
System.out.println(b.name);
//근데 왜 b.name은 Super로 나오지...
//왜 안 Sub여 - 은닉이라며!
//아 변수는 오버라이딩 개념이 아니었슴미다
//아 머리아파!
//오버로딩 오버라이딩은 메소드에만 적용됨
}
}
this() 생성자는 파워복붙했음
파워복붙
package day09;
class ThisData{
int i;
int j;
int k;
//ⓐ
public ThisData(){
this.i=0;
this.j=0;
this.k=0;
}
//ⓑ
public ThisData(int i){
this.i=i;
}
//ⓒ
public ThisData(int i, int j){
//super();
this(i); //ⓑ 호출되어 초기화됩니다.
this.j=j;
}
}
public class ThisExam_11 {
public static void main(String[] args) {
ThisData od = new ThisData(100, 90);
System.out.println("od.i: " + od.i);
System.out.println("od.j: " + od.j);
System.out.println("od.k: " + od.k);
}
}
---------------------------------------------------
super 생성자는 그냥 씀
package day09;
class OverC{
int i;
int j;
public OverC(int i, int j){
this.i = i;
this.j = j;
}
public OverC(){
System.out.println("OverC의 기본 생성자");
}
void show(){
System.out.println("상위 클래스의 메소드 show() 수행");
}
}
class SubOverC extends OverC{
int k;
public SubOverC(int i, int j, int k){
super(i,j);
this.k = k;
}
void show(){
System.out.println("하위 클래스의 메소드 show() 수행");
System.out.println("==super를 이용한 상위 클래스 메소드 호출==");
super.show();
}
}
public class SuperExam_12 {
public static void main(String[] args) {
SubOverC over1 = new SubOverC(10,20,30);
System.out.println("i,j,k의 값: " + over1.i + " " + over1.j + " " + over1.k);
//이건 그냥 10 20 30 출력될건데
//출력되는 과정에서 super(i,j)해서 부모 생성자 호출함
over1.show();//하위 + 상위 출력
}
}
-------------------------------------------------------------------------------
Abstract Class (추상 클래스)
Abstract Method (추상 메소드)
- 기능이 구현되지 않고 원형만 선언되어 있는 메소드인데
이거는 {} 안써도됨
추상 메소드가 있으면 추상 클래스
그냥 선언을
abstract public void draw();
이런 식으로 만들어놓고 자식 클래스에서 오버라이딩함! :D
오버라이딩 안하면 껍데기여서 무쓸모인것
심지어 오버라이딩 안하면 안 한 서브클래스도 추상메소드 취급당해서 못씀 ㅋㅋㅋㅋ
추상 메소드가 1개라도 있으면 추상 클래스!
근데 추상 클래스
abstract class Line{} <- 이렇게 만들고 추상 메소드 없어도 추상 클래스
그리고 얘는 객체를 생성할 수 없기 때문에
서브 클래스 필수쉰것
----------------------------------------------------------
package day09;
abstract class Calculator {
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
public class GoodCalc extends Calculator {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int subtract(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}
@Override
public double average(int[] a) {
double sum = 0;
double avg = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
avg = sum / a.length;
return avg;
}
public static void main(String[] args) {
GoodCalc david = new GoodCalc();
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.out.println("합 : " + david.add(10, 20));
System.out.println("차 : " + david.subtract(20, 10));
System.out.println("평균: " + david.average(arr));
}
}
이 상태인데
GoodCalc 입력받고 출력받는 메소드 만들기
package day09;
import java.text.DecimalFormat;
import java.util.Scanner;
abstract class Calculator {
public abstract int add();
// 합
public abstract int subtract();
// 차
public abstract double average();
// 배열의 평균값
public abstract void inputValue();
// 값 삽입
public abstract void printValue();
// 값 출력
}
public class GoodCalc extends Calculator {
int a;
int b;
int arrnum = 0;
int arr[] = new int[2];
@Override
public int add() {
return a + b;
}
@Override
public int subtract() {
return a - b;
}
@Override
public double average() {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");
avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}
@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();
System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();
int arr[] = new int[arrnum];
for (int i = 0; i < arrnum; i++) {
System.out.println("배열의" + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();
if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for
for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for
this.arr[1] = arrnum;
System.out.println("숫자 입력이 완료되었습니다.\n");
}
@Override
public void printValue() {
System.out.println("합 : " + add());
System.out.println("차 : " + subtract());
System.out.println("평균: " + average());
}
public static void main(String[] args) {
GoodCalc david = new GoodCalc();
david.inputValue();
david.printValue();
}
}
------------------------------출력은 되는데 처음 선생님이 준 메소드로 다시 변환해보기------
package day09;
import java.text.DecimalFormat;
import java.util.Scanner;
abstract class Calculator {
public abstract int add(int a, int b);
// 합
public abstract int subtract(int a, int b);
// 차
public abstract double average(int[] a);
// 배열의 평균값
public abstract void inputValue();
// 값 삽입
public abstract void printValue();
// 값 출력
}
public class GoodCalc extends Calculator {
private int a;
private int b;
private int arrnum = 0;
private int arr[] = new int[2];
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public int getArrnum() {
return arrnum;
}
public void setArrnum(int arrnum) {
this.arrnum = arrnum;
}
public int[] getArr() {
return arr;
}
public void setArr(int[] arr) {
this.arr = arr;
}
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int subtract(int a, int b) {
return a - b;
}
@Override
public double average(int[] a) {
String avgSample = "";
double avg = 0;
DecimalFormat d = new DecimalFormat(".##");
avgSample = d.format((double) arr[0] / arr[1]);
avg = Double.parseDouble(avgSample);
return avg;
}
@Override
public void inputValue() {
Scanner s = new Scanner(System.in);
System.out.println("첫번째 숫자를 입력해 주세요.");
a = s.nextInt();
System.out.println("두번째 숫자를 입력해 주세요.");
b = s.nextInt();
System.out.println("배열에 입력하실 숫자의 개수를 입력해 주세요.");
arrnum = s.nextInt();
int arr[] = new int[arrnum];
for (int i = 0; i < arrnum; i++) {
System.out.println("배열의 " + (i + 1) + "번째 숫자를 입력해 주세요.");
arr[i] = s.nextInt();
if (i == arrnum - 1) {
System.out.println("배열에 입력이 완료되었습니다.\n");
}
} // end for
for (int i = 0; i < arrnum; i++) {
this.arr[0] += arr[i];
} // end for
this.arr[1] = arrnum;
System.out.println("숫자 입력이 완료되었습니다.\n");
}
@Override
public void printValue() {
System.out.println("합 : " + add(a, b));
System.out.println("차 : " + subtract(a, b));
System.out.println("평균: " + average(arr));
System.out.println("숫자 출력이 완료되었습니다.");
}
public static void main(String[] args) {
GoodCalc david = new GoodCalc();
david.inputValue();
david.printValue();
}
}
------------------------------------이렇게 하면 되지만 메소드 그대로 안 짜도 될 거 같음 - 어짜피 연습인것...
----------밥먹었음!!! ---------------------------
Final 클래스
String 같은 건
public final class String extends Object implements Serializable, Comparable, CharSequence
public class FinalTest extends String{ //ERROR
}
요렇게 생겨서 extends 못함 ㅠㅠ = 상속 = 확장 불가 :<
상수 선언! : 다시 읽어보기! :D
--------------------------------------------
[18] 인터페이스
Interface는 상수와 추상 메소드로만 이루어져 있음! - 메소드도 {} 없음
모든 추상메소드에 public이랑 abstract가 들어간거라 안 써도 된당! :>
추상메소드는 앞으로 추가되거나 구현되는 기능의 설계역할! - 실제 기능 구현 x 메소드 원형만 구현 o!
외부에 공개한 메소드를 등록하는 목적 - 인터페이스를 통하면 안 보여주고 싶은 메소드 숨김 가능!
클래스 - 인터페이스 - 클래스 연결하는 것
인터페이스를 구현한 클래스는 추상 메소드 전부 구현 필요! - 한개라도 안 하면 추상클래스됨
인터페이스는 객체 생성 불가능
ㅇㅇ 생략 가능
package day09;
interface Inter{
public abstract int add(int i, int j);
//저거 이거랑 똑같음 int add(int i, int j);
public int sub(int i, int j);
//abstract 생략
}
public class InterImpl implements Inter{
@Override
public int add(int i, int j) {
return i+j;
}
@Override
public int sub(int i, int j) {
return i-j;
}
public static void main(String[] args) {
InterImpl interImpl = new InterImpl();
System.out.println(interImpl.add(10, 5));
System.out.println(interImpl.sub(10, 5));
//인터페이스는 기능이 구현되어 있지 않음으로
//객체 생성 불가능
//Inter inter = new Inter();
//인터페이스는 구현 클래스를 할당 받을수 있음
//인터페이스 = 구현페이스 <- 형식으로
Inter inter2 = new InterImpl();
System.out.println(inter2.add(100, 50));
System.out.println(inter2.sub(100, 50));
Inter inter3;
inter3 = new InterImpl();
//위에거랑 같은건데 그냥 두줄로 쓰고 싶어서
System.out.println(inter3.add(1000, 500));
System.out.println(inter3.sub(1000, 500));
}
}
이런 식으로 쓰면 됨
2. 인터페이스의 참조
- 각 클래스의 멤버 변수에 접근하는 경우는 그 클래스 타입으로 형변환을
해 주어야 합니다.
- 인터페이스 타입 객체 = new 인터페이스 구현 클래스
어 이거할때 딴생각함ㅠㅠ
package day09;
interface B101 {
void display(String s);
}
class D101 implements B101 {
String str = "";
public void display(String s) {
str = s;
System.out.println("★☆★☆★☆★☆★☆" + s);
}
}
class D102 implements B101 {
String str = "";
public void display(String s) {
str = s;
System.out.println("☆★☆★☆★☆★☆★" + s);
}
}
public class IR2 {
public static void main(String[] args) {
B101 b = new D101();
//클래스 D101의 객체를 생성해서 b에 할당
//어 그러니까 업캐스팅:D!
b.display("석모도 - 보문사 - 벤댕이 회무침");
b = new D102();
b.display("대부도 - 방아머리 - 바지락 칼국수");
//인터페이스 타입은 구현 클래스의
//변수에 접근할 수 없습니다.
//System.out.println(b.str);
//구현 객체의 멤버변수에 접근하려면
//인터페이스의 구현 클래스 타입으로
//형변환을 합니다
D102 d2 = (D102) b;
//다운캐스팅! :>
System.out.println(d2.str);
}
}
오 근데 인터페이스는 여러개 implements 할 수 있음 :>
= 여러개 상속! :0!
package day09;
interface Green{
public String greenColor();
}
class GreenImpl implements Green{
public String greenColor(){
return "초록색입니다.★";
}
}
interface Red{
public String redColor();
}
class RedImpl implements Red{
public String redColor(){
return "빨간색입니다.★";
}
}
class ColorImpl implements Green, Red{
public String greenColor(){
return "★초록색입니다.";
}
public String redColor(){
return "★빨간색입니다.";
}
} //요렇게 인터페이스는 >>,<<로 다중 implements 가능! :>
//이럴 경우에는 얘네가 가지고 있는 추상 메소드
//모두 다 구형해줘야함! :>
public class ColorMain {
public static void main(String[] args) {
Green g = new GreenImpl();
System.out.println(g.greenColor());
Red r = new RedImpl();
System.out.println(r.redColor());
ColorImpl c = new ColorImpl();
System.out.println(c.greenColor());
System.out.println(c.redColor());
}
}
=======================잠깐잘래------------------------
------------------------쉬었음==========================
package day09;
interface MyinfoInter{
public String getName();
public String getPhone();
}
class Myinfo implements MyinfoInter{
private String name;
private String phone;
private String address;
private int age;
Myinfo(){}
Myinfo(String name, String phone, String address, int age){
this.name = name;
this.phone = phone;
this.address = address;
this.age = age;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return name;
}
public void setName(String name){
this.name = name;
}
@Override
public String getPhone() {
// TODO Auto-generated method stub
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address = address;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
public class MyinfoUse {
public static void main(String[] args) {
MyinfoInter info = new Myinfo("길동","0101010101","인천시 남동구", 35);
System.out.println("이름: " + info.getName());
System.out.println("전화: " + info.getPhone());
System.out.println("주소: " + info.getAddress());
System.out.println("나이: " + info.getAge());
}
}
----------------------------------이건 에러 뜬다!
Exception in thread "main" java.lang.Error: Unresolved compilation problems:
The method getAddress() is undefined for the type MyinfoInter
The method getAge() is undefined for the type MyinfoInter
at day09.MyinfoUse.main(MyinfoUse.java:67)
----------------------------------------이런 에러!
이유는 업캐스팅 했는데 얘는 모르는 메소드라서 그럼 :<
이거 StarUml로 그려볼거임

얘 타입 바꾸는 법

이렇게 바뀜

이거는 인터페이스 구현해줬다는 뜻...


위에 소스 uml로 구현해본것...
CLASS 부분 10번 보기! :D
ㅇㅇ 이렇게 클래스가 끝났음다
재밌당 ^^... 우리의친구 같은것
자바 - 예외처리! - Exception
예외는 운영중에 발생하는 에러! :D
코딩중에 발생하는 에러가 아니라 컴파일시 에러인것 ... - 이걸 실행하기 전에 잡아야함 넘나재미있는것... -.,-)
예외 때문에 다른애들 죽지 말라고 얘 이상해도 다른애 잘 돌아갈 수 있게 하는 것 <--
finally는 예외가 나든지 말든지 무조건 실행해야 하는 것.
요렇게.
ArrayIndexOutOfBoundsException - a[9] 만들어놓고 a[10] 접근하면 생김
StringIndexOutOfException도 있음 -
홍 길 동 안 녕 하세 요
0 1 2 3 4 5 6 7 8 -인데 10에 접근하려고 하면 스트링 인덱스 아웃오브 익셉션
NumberFormatException - Integer.ParseInt같은 데서 잘못된 타입 받으면 이런거 뜸
근데 넘 많으니까 여기 위에 거 정도만 외워두기...
try{
개발자가 에러가 발생할 소지가 있는 코드를 선별해서 지정해야 한다.
}catch(Exception e){
예외처리 및 예외처리 원인 출력
}
finally{
무조건 실행되는 코드 블럭, 데이터베이스 연결 종료 등
}
--------------------------코드--------------------
package day09;
public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a/b));
System.out.println("나눗셈이 수행되었습니다.");
}
}
a = 10 b = 0Exception in thread "main"
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)
------------------------------------------------arithmeticException 뜸
package day09;
public class Ex1 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// if(b==0){
// System.out.println("0으로 나눌 수 없습니다.");
// System.exit(0);
// }
try {// 에러가 발생될 소지가 있는 곳
System.out.println("a = " + a + " b = " + b);
System.out.println("a/b = " + (a / b));
System.out.println("나눗셈이 수행되었습니다.");
} catch (Exception e) {// 예외처리 및 예외처리 원인 출력
e.printStackTrace();// 이러면 원인 출력됨
} finally {// 무조건 나오는 곳
System.out.println("정리코드 입니다.");
}
System.out.println("프로그램이 정상적으로 끝납니다.");
}
}
요렇게 트라이캐치문으로 묶어주면
a = 10 b = 0
정리코드 입니다.
프로그램이 정상적으로 끝납니다.
java.lang.ArithmeticException: / by zero
at day09.Ex1.main(Ex1.java:14)
끝나기는 정상적으로 끝남 :>
------------------------------------------------------
package day09;
public class Ex2 {
public static void main(String[] args) {
String str = null;
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);
System.out.println("프로그램 실행을 끝냅니다.");
}
}
이러면 널 포인터 익셉션
Exception in thread "main" java.lang.NullPointerException
at day09.Ex2.main(Ex2.java:6)
------------------------------------------------------------
package day09;
public class Ex2 {
public static void main(String[] args) {
String str = "홍길동";
try{
char s = str.charAt(5); //5번째 해당하는 인덱스값을 가짐
System.out.println("s:" + s);
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("프로그램 실행을 끝냅니다.");
}
}
}
요러면
java.lang.StringIndexOutOfBoundsException: String index out of range: 5
at java.lang.String.charAt(String.java:658)
at day09.Ex2.main(Ex2.java:9)
프로그램 실행을 끝냅니다.
---------------------------------ㅋㅋㅋ스트링인덱스아웃오브바운즈익셉션
예외 선언은 첨에는 좁은 범위 -> 담에는 넓은 범위 예외를 명시함
java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Exception <--- 가장 넓은 범위
|
+--java.lang.RuntimeException
|
+--java.lang.IllegalArgumentException
|
+--java.lang.NumberFormatException <--- 가장 좁은 범위, 여기부터 catch문에 명시
사실 잘 모르면 그냥 Exception으로 받고 생각해야지 :>
>>>>> ExceptionError1.java
class ExceptionError1 {
public static void main(String args[]) {
try {
System.out.println("매개변수로 받은 두 개의 값");
int a = Integer.parseInt(args[0]); // 문자열 값을 정수로 변환
int b = Integer.parseInt(args[1]);
System.out.println(" a = " + a + " b = " + b );
System.out.println(" a를 b로 나눈 몫 = " + (a/b) );
System.out.println("나눗셈이 원할히 수행되었습니다.");
}
catch(ArithmeticException e) {
System.out.println("==================================");
System.out.println("ArithmeticException 처리 루틴 : ");
System.out.println(e + " 예외 발생");
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("==================================");
System.out.println("ArrayIndexOutOfBoundsException 처리 루틴");
System.out.println(e + " 예외 발생");
}
catch(NumberFormatException e) {
System.out.println("==================================");
System.out.println("NumberFormatException 처리 루틴");
System.out.println(e + " 예외 발생");
}
catch(Exception e) {
System.out.println("==================================");
System.out.println("알수없는 문제가 발생했습니다.");
System.out.println(e.toString());
}
finally {
System.out.println("==================================");
System.out.println("예외 처리를 끝내고 finally 블럭을 수행합니다");
}
System.out.println("나머지 모듈 정상 작동!!!");
}
}
이거 파워 복붙인데 뭔가 오류남 :< 재부팅!
사실 요즘 세상이 좋아져서 이클립스가 try catch 다 알려줌 ㅋㅋㅋㅋ

와 혼란스럽다 :D
- 메소드에 throws절을 명시하면 try~catch문을 사용하지 않아도 됩니다.
이걸
package day09;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Ex3 {
public static void main(String[] args) {
Connection con = null;
try {
con = DriverManager.getConnection("", "", "");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
if(con != null){
con.close();
}
}
}
}
이걸 그냥 쓰긴 헀음 ... - 어려움../
5. 수업
진도:
hw:
6. 할것
업캐스팅 예제 풀어보기.
업캐스팅 다운캐스팅 용도를 찾아보기
abstract 메소드로 BMO 연구하기
클래스 관련 모르는 것 체크해보기
페로봇 인터페이스로 짜보기
영어공부도 같이 하기! - 아 이번 토익 봐야함 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 4월에 끝남...
으아아 정보처리기사도봄
그리고 토익도봄
그리고 ocjp도봄
다봄
봄봄봄봄이왔네요
Exception 들어간 Calc 만들어보기
foreach - 는 배열이랑 컬렉션은 가능... - 인데 나중에 배운댕 :>
그래도 일괄처리하는 배열에 쓰면 편하니까!