자바프로그래밍 기초(2)

이상민·2023년 9월 18일
0
post-thumbnail

object class

자바에는 모든 클래스수퍼 클래스"Object"라는 이름의 클래스가 존재하며, java.lang.Object 패키지에 정의되어 있다.

자바의 모든 클래스는 Object를 상속 받지만 별도의 명시는 필요없다.(java 컴파일러가 알아서함)

Object class method

Object 클래스는 다음 method들을 정의하고 있다.

  • fanalize(): 해당 클래스의 객체가 쓰레기로서 수집(garbage collector) 되기 직전에 해당 클래스의 finalize()가 호출됨 (override 가능)
  • clone(): 생성자가 호출 비용이 큰 경우에 생성자 대신 사용 가능
  • wait(), notify(), notifyAll(): 쓰레드 동기화에 사용됨
  • toString(): 객체의 문자열 표현을 생성
  • hachCode(),equals(): 두 객체가 동일한 객체인지 확인(x.equals(y))

실습 코드

    public static void main(String[] args) {
        main1(args);
    }

    public static void main1(String[] args) {
        Matrix m = new Matrix(10,10);
        for (int i=0; i<999;i++)
            m = new Matrix(10,10);
		// gc(): jvm에 의해 객체가 소멸하기전에 먼저 소멸 시킬 수 있다.
        System.gc();
        System.out.println("nAlloc= "+m.get_nAlloc());
        System.out.println("nFree= "+m.get_nFree());
    }
public class Matrix {
	//동적할당 된 객체의 개수
    private static int nAlloc = 0;
    // garbage collect 된 객체의 수
    private static int nFree = 0;
    protected void finalize() throws Throwable {
        super.finalize();
        nFree++; // count the number of freed objects
    }
    public int get_nAlloc() { return nAlloc; }
    public int get_nFree() { return nFree; }

  • 실행 결과(1)
nAlloc =1000
nFree = 868
  • 실행 결과(2)
nAlloc =1000
nFree = 999
  • 실행 결과(3)
nAlloc =1000
nFree = 567

실행결과 그때ㄷ 그때 달라요~

Exception 처리

자바는 코드 상에서 에러가 발생한 즉시 사용자에게 에러 발생 지점과 에러 원인 메세지를 출력하여 도와줄 수 있도록 Exception을 제공한다.

동작 방식

어느 한 method에서 에러가 발생하면 그 지점에서 적절한 exception 객체를 생성하여 throw한다.

return과 유사하게 caller(상위 메소드)로 exception을 전달하고 catch가 될때 까지 전달과 메쏘드 종료를 반복한다.

Throwexception 객체는 발생 지점 이후 처음 만나는 try-catch블록에서 처리됨

실습 코드

  • main
public static void main2(String[] args) { // why no "throws Exception"???
        int[][] arrayBlk = {
                { 0, 1, 0 },
                { 1, 1, 1 },
                { 0, 0, 0 }
        };
        try {
            Matrix currBlk = new Matrix(arrayBlk);
//            Matrix tempBlk = new Matrix(5,5);
            Matrix tempBlk = new Matrix(-1,-1); // falls into the second catch
            tempBlk = tempBlk.add(currBlk); // falls into the first catch
        } catch(MismatchedMatrixException e) {
            e.printStackTrace();
            System.out.println("at first catch: " + e.getMessage());
        } catch(MatrixException e) {
            e.printStackTrace();
            System.out.println("at second catch: " + e.getMessage());
        }
    }
  • add
    public Matrix add(Matrix obj) throws MatrixException {
        if((dx != obj.dx) || (dy != obj.dy))
            throw new MismatchedMatrixException("matrix sizes mismatch");
        Matrix temp = new Matrix(dy, dx);
        for(int y = 0; y < obj.dy; y++)
            for(int x = 0; x < obj.dx; x++)
                temp.array[y][x] = array[y][x] + obj.array[y][x];
        return temp;
    }
  • alloc: Matrix.add에서 참조하는 alloc에서 오류가 발생
    private void alloc(int cy, int cx) throws MatrixException {
        if((cy < 0) || (cx < 0))
            throw new MatrixException("wrong matrix size");
        dy = cy;
        dx = cx;
        array = new int[dy][dx];
        nAlloc++; // count the number of allocated objects
    }

실행 결과

//alloc에서 오류가 발생할 때
lab2.MatrixException: wrong matrix size
	at lab2.Matrix.alloc(Matrix.java:20)
	at lab2.Matrix.<init>(Matrix.java:28)
	at lab2.Main_2.main2(Main_2.java:26)
	at lab2.Main_2.main(Main_2.java:5)
at second catch: wrong matrix size
//add에서 오류가 발생
lab2.MismatchedMatrixException: matrix sizes mismatch
	at lab2.Matrix.add(Matrix.java:70)
	at lab2.Main_2.main2(Main_2.java:27)
	at lab2.Main_2.main(Main_2.java:5)
at first catch: matrix sizes mismatch

Exception 계층 구조


Exception 클래스는 Throwable을 상속 받는다. Throwable은 클래스이므로 당연히 Object를 상속 받는다. Error 클래스는 DVM(Dalvik Virtual Machine)이 전용으로 사용함

DVM(Dalvik Virtual Machine):DVM은 안드로이드 애플리케이션을 실행할 수 있는 가상 머신이다. JVMjava compliler가 생성한bytecode를 운영체제에 맞게 변환하는 것과 비슷하게 DVM은 모바일 기기환경에 맞게 코드를 변환해준다

profile
잘하자

0개의 댓글