List<E> 인터페이스를 구현하는 제네릭 클래스들은 다음 두가지 특성을 공통으로 지닌다.

동일한 인스턴스의 중복 저장을 허용한다.

인스턴스의 저장 순서가 유지된다.


ArrayList<E>


배열은 크기를 한번 지정하면 그보다 많은 수의 값을 저장할 수 없다.

ArrayList는 크기를 미리 지정하지 않기 때문에 얼마든지 많은 수를 저장할 수 있다.

배열은 값의 개수를 구할때 .length를 사용하고 ArrayList 는 메소드 size 를 사용한다.

특정한 값을 가져올 때 배열은 [인덱스번호] 를 사용하고 컬렉션은 .get(인덱스번호)를 사용한다.

ArrayList<E>클래스는 배열과 상당히 유사하다 그러나 데이터의 저장을 위해서 인덱스 정보를

별도로 관리할 필요가 없고, 데이터의 삭제를 위한 추가적인 코드의 작성이 전혀 필요 없다.

저장되는 인스턴스의 수에 따라서 그 크기도 자동으로 늘어나기 때문에 배열과 달리 길이를 고민하지 않아도 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.ArrayList;
 
public class CollectionTest {
    public static void main(String[] args){
        ArrayList<Integer> list = new ArrayList<Integer>();
        
        //데이터 저장
        list.add(new Integer(11));
        list.add(new Integer(222));
        list.add(new Integer(333));
        
        //데이터 참조
        System.out.println("1차참조");
        for(int i =0; i<list.size();i++){
            System.out.println(list.get(i));
        }
        //데이터 삭제
        list.remove(0);//매개변수로 전달된 인덱스의 데이터 삭제
        System.out.println("2차참조");
        for(int i =0; i<list.size();i++){
            System.out.println(list.size());
        }
    }
}
cs


remove 메소드의 호출을 통해서 삭제가 이뤄진다. 전달되는 값에 해당하는 인스턴스 정보가

저장소인 ArrayList 의 인스턴스 내에서 지워지게 된다. 주의할 점은 인스턴스의 참조값이

지워지는 것 일뿐 인스턴스가 소멸하는것은 아니다.




LinkedList<E>


LinkedList<E> 클래스의 사용방법은 ArrayList<E> 의 사용방법과 거의 동일하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.LinkedList;
 
public class CollectionTest {
    public static void main(String[] args){
        LinkedList<Integer> list = new LinkedList<Integer>();
        
        //데이터 저장
        list.add(new Integer(111));
        list.add(new Integer(222));
        list.add(new Integer(333));
        
        //데이터 참조
        System.out.println("1차참조");
        for(int i = 0; i<list.size();i++){
            System.out.println(list.get(i));
        }
        
        //데이터 삭제
        list.remove(0);
        System.out.println("2차참조");
        for(int i = 0; i<list.size();i++){
            System.out.println(list.get(i));
        }
    }
}
 
cs



ArrayList<E>와 LinkedList<E> 의 차이점


ArrayList<E> 와 LinkedList<E> 의 차이점은 사용방법의 차이가 아닌 인스턴스의 저장방식의 차이가있다.

데이터의 저장 참조 및 삭제 기능의 활용방법만 놓고 보면 ArrayList<E> 와 LinkedList<E> 에 차이는없다.

그러나 내부적으로 인스턴스를 저장하는 방식에는 큰 차이를 보인다.


ArrayList<E> 는 배열을 기반으로 한다. 즉 내부적으로 배열을 이용해서 인스턴스의 참조 값을 저장한다.

ArrayList<E> 의 특성

장점 데이터의 참조가 용이해서 빠른 참조가 가능하다.

단점 저장소의 용량을 늘이는 과정에서 많은 시간이 소요된다. 데이터의 삭제에 필요한 연산 과정이 매우 길다.


LinkedList<E> 는 배열을 사용하는 대신에 서로서로 연결하는 방식으로 데이터를 저장한다.

LinkedList<E>의 특성

장점 저장소의 용량을 늘리는 과정이 간단하다. 데이터의 삭제가 매우 간단하다

단점 데이터의 참조가 다소 불편하다.








'Java' 카테고리의 다른 글

Set<E>  (0) 2017.02.26
Iterator 반복자  (0) 2017.02.26
이스케이프 시퀀스(Escape Sequence)  (0) 2017.02.26
제네릭(Generics)  (0) 2017.02.25
자바 기본 클래스  (0) 2017.02.25

이스케이프 시퀀스(Escape Sequence)


문자열 안에서 특별한 의미로 해석이 되는 문자들을 가르켜 이스케이프 시퀀스라고 한다.


\는 역슬러쉬이다.


\n 개행 

\t 탭(tab)

\" 큰 따옴표

\\ 역슬래쉬


모든 이스케이프 시퀀스는 \ 로 시작을 한다. 따라서 컴파일러는 문자열 안에서 \를 만나면

그다음에 등장하는 문자를 다른의미로 해석해야 한다고 인식한다.

컴파일러는 큰 따옴표를 문자열 표현의 도구로 인식한다. 문자열에 중간에 큰 따옴표를 넣으려면

이스케이프를 사용해야 한다.


System.out.println(" \"안녕하세요\"");

출력결과 : "안녕하세요"


System.out.printf 메소드


System.out.println 과 System.out.print 는 단순히 문자열을 있는 그대로 출력하는 메소드이다.

반면에 System.out.printf 는 문자열의 내용을 조합해서 출력하는 메소드이다.


System.out.printf("정수는 %d, 실수는 %f, 문자는 %c, 12, 24.5, 'A');

출력할 문자열의 기본구성 :  정수는 %d, 실수는 %f, 문자는 %c

문자열에 채워질 데이터 : 12,24.5,A


서식문자(변환문자)


 서식문자

출력의 형태 

 %d

10 진수 정수 형태의 출력 

 %o

8 진수 정수 형태의 출력 

 %x

16진수 정수 형태의 출력 

 %f

실수의 출력 

 %e

e 표기법 기반의 실수 출력 

 %g

출력의 대상에 따라서 %e또는 %f 출력 

 %s

문자열 출력 

 %c

문자 출력 



'Java' 카테고리의 다른 글

Iterator 반복자  (0) 2017.02.26
List<E> / ArrayList<E> / LinkedList<E>  (0) 2017.02.26
제네릭(Generics)  (0) 2017.02.25
자바 기본 클래스  (0) 2017.02.25
Object 클래스의 메서드 clone / finalize  (0) 2017.02.25

제네릭은 일반화 한다는 뜻이다. 일반화의 대상은 자료형이다.

제네릭은 클래스 외부에서 사용할 데이터타입을 외부에서 지정하는 방법이다.

기본 자료형은 제네릭 클래스의 인스턴스 생성에 사용 될 수 없다.


제네릭 클래스의 선언


1
2
3
4
5
6
7
8
9
class FruitBOx<T>{
    T item;
    public void store(T item){
        this.item = item;
    }
    public T pullOut(){
        return item;
    }
}
cs


이 클래스의 인스턴스를 생성하려면 자료형을 인자로 전달해야 한다. 

전달되는 인자는 클래스 내의 T 를 대체해서 인스턴스가 생성된다.

<T> 부분에 참조타입을 전달한다.


1
2
FruitBox<orange> orBox = new FruitBox<Orange>();
FruitBox<apple> apBox = new FruitBox<Apple>();
cs



둘 이상의 매개변수를 전달하는 경우


1
2
3
4
5
6
7
8
9
10
class GenericTwoParam<T,U>{
    T item1;
    U item2;
    public void setItem1(T item){
        item1 = item;
    }
    public void setItem2(U item){
        item2 = item;
    }
}
cs





제네릭 메소드

자바는 클래스 전부가 아닌 특정 메소드에 대해서만 제네릭으로 선언하는것을 허용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package java01;
class AAA{
    public String toString(){return "Class AAA";}
}
class BBB{
    public String toString(){return "Class BBB";}
}
 
class InstanceTypeShower{
    int showCnt=0;
    //제네릭 메소드 선언
    public <T> void showInstType(T inst){
        System.out.println(inst);
        showCnt++;
    }
    
    void showPrintCnt() {System.out.println("showCnt : "+showCnt);}
}
 
public class IntroGenericMethod{
    public static void main(String[] args){
        AAA aaa = new AAA();
        BBB bbb = new BBB();
        
        InstanceTypeShower shower = new InstanceTypeShower();
        shower.<AAA>showInstType(aaa);
        shower.<BBB>showInstType(bbb);
         // 파라미터로 참조변수를 받기때문에 <>안에 타입을 지정해주지않아도 된다.
         // show.InstType(aaa); 으로 호출이 가능하다.
        shower.showPrintCnt();
    }
}
cs


매개변수를 2개이상 받는 경우의 제네릭 메서드


1
2
3
4
5
6
class GenericTwoParam{
    public <T,U> void showInstType(T inst1,U inst2){
        System.out.println(inst1);
        System.out.println(inst2);
    }
}
cs



매개변수의 자료형 제한

제네릭으로 올 수 있는 데이터타입을 특정 클래스의 하위클래스나 구현하는 클래스로 제한할 수 있다.


1
2
3
4
class Person<extends Info>{
    public T info;
    Person(T info){ this.info = info; }
}
cs

 

Person 메소드의 T는 info클래스나 info클래스의 하위클래스만이 올수 있다.

extends는 상속(extends)뿐 아니라 구현(implements)의 관계에서도 사용할 수 있다.


1
2
3
4
public static <T> void showArrayData(T[] arr){
    for(int i = 0; i<arr.length;i++)
        System.out.println(arr[i]);
}
cs


제네릭 메소드로 매개변수로 전달되는 대상을 배열의 인스턴스로 제한할수 있다.



Math 클래스

Math 클래스는 모든 멤버가 static 으로 선언되어 있는 수학관련 기능의 제공을 위해 정의된 클래스이다.


1
2
3
4
5
6
7
Math.PI() //원주율
Math.sqrt(x) //x의 제곱근
Math.sin(x) //싸인
Math.cos(x) //코싸인
Math.tan(x) //탄젠트
Math.log(x) //로그
Math.pow(x,y) //x의 y승
cs


Random 클래스

난수는 예측이 불가능한 수를 의미한다.

난수의 생성을 위한 클래스는 java.util 패키지의 Random 클래스이다.

1
2
3
4
5
6
nextBoolean() //boolean 형 난수반환
nextInt() //int형 난수 반환
nextLong() //long 형 난수반환
nextInt(int n) //0이상 n 미만의 범위 내에 있는 int 형 난수 반환
nextFloat() //0이상 1.0 alaksdml float 형 난수 반환
nextDouble //0이상 1.0 미만의 double 난수 반환
cs
 

StringTokenizer 클래스

구분자(delimiter)를 기준으로 나위어지는 문자열 정보를 Token 이라한다.

StringTokenizer 클래스를 이용하면 간단하게 토큰을 추출할수 있다.


public StrinhTokenizer(String str,String delim);

첫번째 파라미터는 문자열 데이터를 전달 두번째 파라미터로는 구분자 정보를 전달한다.

public String nextToken() 토큰반환

public boolean hasMoreTokens() 반환할 토큰이 남았는지  boolean 형태로 반환


1
2
3
4
5
6
7
8
9
10
11
import java.util.StringTokenizer;
 
class TokenizerString{
    public static void main(String[] args){
        String strData = "11:22:33:44:55:";
        StringTokenizer st = new StringTokenizer(strData,:);
    
        while(st.hasMoreTokens())
            System.out.println(st.nextToken());
    }
}
cs


결과 11 22 33 44 55


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String phoneNum = "TEL 82-02-997-2059";
StringTokenizer st1 = new StringTokenizer(phoneNum);
while(st1.hasMoreTokens)
    System.out.println(st1.nextToken);
//구분자를 넘겨주지 않고 호출했다. 이런경우에는 공백을 기준으로 토큰이 나뉜다
//결과 TEL 82-02-997-2059
 
StringTokenizer st2 = new StringTokenizer(phoneNum," -");
while(st2.hasMoreTokens)
    System.out.println(st2.nextToken);
//매개변수로 전달된 구분자가 공백과-로 이루어져있다. 구분자는 둘 이상될수있다.
//결과 TEL 82 02 997 2059
 
String javaCode = "num+=1";
StringTokenizer st3 = new StringTokenizer(phoneNum,"+=".true);
while(st3.hasMoreTokens)
    System.out.println(st3.nextToken);
//세번째 매개변수는 구분자를 토큰으로 간주하는지 여부를 결정한다.
//true 가전달되면 구분자도 토큰으로 간주가되고 false가 전달되면 토큰으로 간주되지 않는다.
//결과 num + = 1
cs




'Java' 카테고리의 다른 글

이스케이프 시퀀스(Escape Sequence)  (0) 2017.02.26
제네릭(Generics)  (0) 2017.02.25
Object 클래스의 메서드 clone / finalize  (0) 2017.02.25
Object 클래스의 메서드 toString / equals  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25

clone 

Object 클래스에는 인스턴스의 복사를 위한 메소드가 정의되어 있다.

protected Object clone() throws CloneNotSupportException

이메소드가 호출되면 호출된 인스턴스의 복사본이 생성되고 복사본의 참조값이 반환된다.

Cloneable 인터페이스를 구현하는 클래스의 인스턴스만이 clone 메서드를 호출할수 있다.

clone 메서드는 protected로 선언되어 있기 때문에 오버라이딩으로 허용범위를 넓혀 사용하는것이 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Point implements Cloneable{
    private int num1;
    private int num2;
    
    public Point(int num1,int num2){
        this.num1 = num1;
        this.num2 = num2;
    }
    public void show(){
        System.out.println(num1+" "+num2);
    }
    public Object clone() throws CloneNotSupportedException{
        return super.clone();        
    }
}
public class InstanceCloning {
 
    public static void main(String[] args) {
        
        Point org = new Point(35);
        Point cpy;
        try{
            cpy =(Point)org.clone(); //인스턴스 복사
            org.show();//결과 3,5
            cpy.show();//결과 3,5
        }catch(CloneNotSupportedException e){
            e.printStackTrace();
        }
    }
 
}
cs





finalize

protected void finalize()throws Throwable

이 메서드는 인스턴스가 소멸되기 직전에 자바 가상머신에 의해서 자동으로 호출되는 메소드이다.

인스턴스 소멸시 반드시 실행되어야 하는 코드가 존재한다면 , 이 메소드의 활용을 고려할수 있다.


인스턴스를 참조하는 변수가 없어지면 인스턴스는 존재할 가치가 없어져 가비지 컬렉션의 대상이 된다.

빈번한 가비지 컬렉션은 프로그램 성능에 문제를 줄수 있기 때문에 특정 알고리즘에 의해서 계산된 시간에 가비지 컬렉션이 수행된다.

따라서 메소드가 실행되는 동안 가비지 컬렉션은 한번도 실행되지 않을수도 있다.

System.gc(); 이 메서드는 호출을 통해 가비지 컬렉션을 수행한다.

System.gc() 메소드가 호출되면 자바 가상머신은 가비지 컬렉션을 수행시켜서 참조되지 않는 인스턴스들을 소멸시킨다.

하지만 이것만으로는 finalize 메소드의 호출을 보장받지는 못한다. 가비지컬렉션이 수행되더라도 상황에 따라서

인스턴스의 완전한 소멸이 유보 될수도 있기 때문이다. 소멸이 유보된 인스턴스들의 finalize 메소드는 

System.runFinalization() 메소드를 이용해 별도로 호출해야한다.

finalize 메소드의 완벽한 호출이 필요한 상황에서는 System.gc();,System.runFinalization(); 의 연이은 호출이 사용된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class MyName{
    String objName;
    public MyName(String name){
        objName = name;
    }
    protected void finalize() throws Throwable{
        super.finalize();
        System.out.println(objName+"소멸");
    }
}
public class ObjectFinalize {
    public static void main(String[] args){
        MyName obj1 = new MyName("인스턴스1");
        MyName obj2 = new MyName("인스턴스2");
        obj1=null//참조변수가 인스턴스를 참조하지않도록함
        obj2=null;
        System.out.println("프로그램 종료");
        System.gc(); //가비지 컬렉션
        System.runFinalization(); //finalize 메소드 
    }
 
}
 
cs
 





'Java' 카테고리의 다른 글

제네릭(Generics)  (0) 2017.02.25
자바 기본 클래스  (0) 2017.02.25
Object 클래스의 메서드 toString / equals  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외클래스 정의 / throw / throws  (0) 2017.02.25


자바에서 모든 클래스는 사실 Object를 암시적으로 상속받고 있는 것이다. 

그런 점에서 Object는 모든 클래스의 조상이라고 할 수 있다. 

그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서다.



toString

public String toString(){....}

toString 메서드는 인스턴스의 정보를 문자열의 형태로 반환하기 위한 메소드이다. 

가급적이면 toString 메소드를 오버라이딩 해서 인스턴스에 대한 정보를 적절히 표현할수 있도록 하는것이 좋다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Calculator{
    int left, right;
      
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
    public void sum(){
        System.out.println(this.left+this.right);
    }
      
    public void avg(){
        System.out.println((this.left+this.right)/2);
    }
     
    public String toString(){
        return "left : " + this.left + ", right : "+ this.right;
    }
}
  
public class CalculatorDemo {
      
    public static void main(String[] args) {
          
        Calculator c1 = new Calculator();
        c1.setOprands(1020);
        System.out.println(c1);
        System.out.println(c1.toString());
    }
  
}
cs





equals

== 연산자는 참조변수의 참조 값을 비교한다. 

따라서 인스턴스에 저장되어 있는 값 자체를 비교하려면 다른 방법을 사용한다.

일반적으로 인스턴스의 내용 비교를 위한 메소드 정의는 Object 클래스에 정의되어 있는 equals 메소드를 활용한다.


public boolean equals(Object obj)

이 메소드는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어 있다.

그런데 == 연산을 통해서 얼마든지 참조 값 비교가 가능하므로 

이 메소드는 내용비교를 하도록 오버라이딩을 해도 된다.(오버라이딩 목적으로 정의된 메소드)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package java01;
 
class IntNumber
{
    int num;
    
    public IntNumber(int num){
        this.num = num;
    }
    
    public boolean equals(Object obj){
        if(this.num == ((IntNumber)obj).num)
            return true;
        else
            return false;
    }
}
 
class ObjectEquality{
    public static void main(String[] args){
        IntNumber num1 = new IntNumber(10);
        IntNumber num2 = new IntNumber(12);
        IntNumber num3 = new IntNumber(10);
        
        if(num1.equals(num2))
            System.out.println("num1 num2 일치");
        else
            System.out.println("num1 num2 불일치");
        
        if(num1.equals(num3))
            System.out.println("num1 num3 일치");
        else
            System.out.println("num1 num3 불일치");
    }
}
cs




표준 클래스의 equals 메소드가 내용비교를 하도록 이미 오버라이딩 되어있는 경우도 많다.

대표적으로 String 클래스가 있다.

'Java' 카테고리의 다른 글

자바 기본 클래스  (0) 2017.02.25
Object 클래스의 메서드 clone / finalize  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외클래스 정의 / throw / throws  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25


자바 가상머신은 운영체제로부터 할당받은 메모리 공간의 효율적인 사용을 위해 메모리 관리를 한다.

가상머신은 메모리 공간을 크게 세 개의 영역으로 나눈다.


메소드 영역

스택 영역

힙 영역


각각의 메모리 영역에는 다음의 데이터들을 저장한다.


메소드영역(method area) - 메소드의 바이트코드.static 변수

스택영역(stack area) - 지역변수,매개변수

힙 영역(heap area) - 인스턴스


메소드 영역

소스파일을 컴파일 할 때 생성되는 자바 가상머신에 의해 실행이 가능한 코드를 가르켜 '자바 바이트코드(bytecode)'라 한다.

이러한 바이트코드들도 메모리 공간에 저장되어 있어야 실행이 가능하다. 

따라서 실행의 흐름을 형성하는 메소드의 바이트코드들은 메소드 영역에 저장된다.

그리고 static 으로 선언되는 클래스 변수도 이 영역에 할당이 된다.

메소드 영역은 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 메모리 공간이다.


스택 영역

스택은 지역변수와 매개변수가 저장되는 공간이다. 이 둘은 다음의 공통적인 특징이 있다.

"메소드 내에서만 유효한 변수이다" 스택은 프로그램의 실행과정에서 임시로 할당되었다가 

메소드를 빠져나가면 바로 소멸되는 특성의 데이터 저장을 위한 영역이다.

지역변수와 매개변수는 선언되는 순간에 스택에 할당 되었다가, 

자신이 할당된 메소드의 실행이 완료되면 스택에서 소멸이 된다.


힙 영역

인스턴스는 힙 영역에 할당이 된다. 그 이유는 인스턴스의 소멸방법과 소멸 시점이 지역 변수와는 다르기 때문이다.

참조타입의 지역변수가 스택에 할당되면 힙영역의 인스턴스와 참조관계를 형성하게된다.

인스턴스의 소멸 시기는 자바 가상머신이 결정한다. 인스턴스가 어떠한 참조변수도 참조하지 않는 상태가 되면

자바 가상머신은 해당 인스턴스를 소멸시킨다. 이러한 소멸기능을 가비지 컬렉션 (Garbage Collection)이라 한다.




예외클래스 정의


프로그램의 논리에 어긋나지만 문법적으로 문제가 되지않는 상황은 가상머신이 인식할수있는 예외상황이아니다.

이러한 유형의 예외상황은 예외상황의 발생을 프로그래머가 정의해야 한다.


예외클래스 정의의 조건


Exception 클래스 상속

Exception 클래스는 모든 예외 클래스가 상속하는 Throwable 클래스의 하위 클래스이다.

이를 상속함으로 예외 클래스가 되어서 try~catch 예외처리 매커니즘에 활용이 가능한 클래스가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package java01;
 
import java.util.Scanner;
 
class AgeInputException extends Exception{
    public AgeInputException(){
        super("유효하지 않은 나이가 입력되었습니다.");
    }
}
class ProgrammerDefineException{
    public static void main(String[] args){
        System.out.println("나이를 입력하세요");
        try{
            int age = readAge();
            System.out.println("당신은"+age+"세입니다.");
        }catch(AgeInputException e){
            System.out.println(e.getMessage());
        }
    }
 
    public static int readAge() throws AgeInputException{
        Scanner sc = new Scanner(System.in);
        int age = sc.nextInt();
        if(age<0){
            AgeInputException excpt = new AgeInputException();
            throw excpt;
        }return age;
    }
}
 
 
/* 실행결과 
    나이를 입력하세요 : -2
    유효하지 않은 나이가 입력되었습니다.
*/
cs


실행결과를 통해 알수있는 사실

Exception 클래스의 생성자 호출을 통해서 전달된 문자열이 getMessage 의 호출을 통해서 반환된다.

예외클래스를 정의할 때 해당 예외의 상황설명에 필요한 문자열을 Exception 클래스의 생성자에 전달하면 된다.


throw 문의표현방식

예외상황이 발생했음을 알리는 문장 throw excpt;

throw 문이 존재하는 위치가 예외상황이 발생했음을 알리는 지점이 된다. 따라서 이 부분을 

try~catch 문으로 감싸서 예외상황을 처리 할수도 있는데 이러한 경우 예외의 처리는 throw 문이 존재하는 main 메소드의 

readAge 메소드 호출문장을 try~catch 문으로 감싸는 것이다.따라서 예외상황을 알리기 위해 생성된

AgeInputException 인스턴스의 참조 값은 main 메소드에 존재하는 catch 영역으로 전달되어 예외상황이 처리된다.


throws 문

예외상황이 메소드 내에서 처리되지 않으면 메소드를 호출한 영역으로 예외의 처리가 넘어감(던져짐)을 반드시 명시해야 한다.

throw에 의해 생성된 예외상황은 반드시 try~catch 문에 의해 처리되거나 throws 에 의해서 넘겨져야 한다.


readAge 메소드의 정의를 보면 throws AgeInputException 선언이 존재한다.

이는 "readAge 메소드 내에서 AgeInputExcpetion 에 대한 예외상황을 처리하지 않으니 이 메소드를 호출하는 영역에서는

AgeInputException 에 대한 처리도 대비해야 한다."는 선언이다.

이렇듯 throw에 의해 생성된 예외상황이 메소드 내에서 처리되지 않는다면 메소드를 호출한 영역으로 넘어감을 반드시 명시해야 한다.


가상머신의 예외처리

throws 문에 의해 던져진 예외상황은 메서드를 호출하는곳으로 넘겨진다. 예외상황이 main메소드를 호출한 영역까지 넘어가게 되면

main메소드는 자바 가상머신이 호출하는 메소드이기 때문에 예외처리는 가상머신이 하게된다.

가상머신의 처리방식은 1.getMessage 메서드 호출 2.예외상황 발생해서 전달되는 과정 출력 3.프로그램종료

더이상의 실행으로 이어지지 않고 프로그램이 종료된다.


printStackTrace

예외가 발생해서 전달되는 과정의 출력은 프로그램에 존재하는 오류를 파악하는데 매우 도움이 된다.

이러한 유형의 메세지를 출력하는방법은 Throwable 클래스에 정의되어있는 

printStackTrace 메소드가 이러한 유형의 메세지를 출력한다.


1
2
3
4
5
try{
    ...        
}catch(Exception e){
    e.printStackTrace();
}
cs




'Java' 카테고리의 다른 글

Object 클래스의 메서드 toString / equals  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25
인터페이스 interface  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25

+ Recent posts