160324: 9회차

종료하기 전 티스토리 네이버 구글 로그아웃 할 것


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 - 는 배열이랑 컬렉션은 가능... - 인데 나중에 배운댕 :>


그래도 일괄처리하는 배열에 쓰면 편하니까!

'Programming' 카테고리의 다른 글

160328: 11회차  (5) 2016.03.28
160325: 10회차  (0) 2016.03.25
160323: 8회차  (1) 2016.03.23
160322: 7회차  (4) 2016.03.22
160321: 6회차  (1) 2016.03.21
Posted by DAVID