자바 Class 클래스 | 자바 입문강좌 39

자바 Class 클래스

자바의 소스코드 파일의 확장자는 .java 입니다. 자바 컴파일러를 거치면 .class 파일이 됩니다. Class 클래스는 이 class 파일에 컴파일된 클래스나 인터페이스 정보를 가져오는데 사용합니다.

Class 클래스를 사용하면 자바 프로그램의 실행중에 동적인 클래스 로드가 가능합니다.

Class 클래스 예제

다음은 Class 클래스의 예제입니다.

Class 클래스라니 클래스 자체에 대한 설명을 하는 메타 클래스라고 볼 수 있습니다. java.lang 패키지에는 자바 스스로를 설명하고 구동하는 클래스들이 많이 있는데 자바의 아키텍쳐를 엿볼 수 있습니다.

메소드들이 많지만 초보자 입장에서는 좀 이해가 어려운 부분이 있을 겁니다.

초급과정에서는 한번 쓰윽 보고 지나가는 것으로 충분합니다.

package com.kay;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException{

//        #1
        String str1 = new String("my String 1");
        Class cls = str1.getClass();

        System.out.println("cls = " + cls.toString());

//        #2
        Class cls1 = String.class;
        System.out.println("cls1 = " + cls1.toString());

//        #3
        Class cls2 = Class.forName("java.lang.String");
        System.out.println("cls2 = " + cls2.toString());

        System.out.println("[-----------------------------------------]");

//        #1-1
        CustomClass cc1  = new CustomClass(201, "Custom Class 1");
        Class cls3 = cc1.getClass();
        System.out.println("cls3.toString() = " + cls3.toString());

//        #2-2
        Class cls4 = CustomClass.class;
        System.out.println("cls4.toString() = " + cls4.toString());

//        #3-2
        Class cls5 = Class.forName("com.kay.CustomClass");
        System.out.println("cls5.toString() = " + cls5.toString());

        System.out.println("[-----------------------------------------]");

    }
}

class CustomClass{
    int id;
    String name;

    public CustomClass(int id, String name) {
        this.id = id;
        this.name = name;
    }
}
cls = class java.lang.String
cls1 = class java.lang.String
cls2 = class java.lang.String
[-----------------------------------------]
cls3.toString() = class com.kay.CustomClass
cls4.toString() = class com.kay.CustomClass
cls5.toString() = class com.kay.CustomClass
[-----------------------------------------]

위의 코드는 여러가지 방법으로 클래스의 이름을 가져오고 있습니다. String 클래스 같이 JDK 클래스도 가져올 수 있고 사용자가 정의한 클래스도 가져올 수 있습니다. 해당 클래스가 현재 패키지 안에 위치한다면 가져오는 것은 어렵지 않을 것 입니다.

클래스 정보 가져오기

다음 소스코드는 클래스의 정보를 가져옵니다. java.lang.reflect 패키지의 클래스를 사용하여 Class 클래스로 선택한 클래스의 생성자, 메소드, 필드 정보를 가져옵니다.(접근제한자가 public 인 경우만 가져올 수 있다)

String 클래스와 사용자 정의 클래스 둘다 사용할 수 있습니다.

출력해보면 public 으로 접근가능한 모든 정보를 가져옵니다.

package com.kay;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException {

        Class strCls = Class.forName("java.lang.String");

        System.out.println("------------------------- Constructor");
        Constructor[] constr = strCls.getConstructors();
        for (Constructor c1 : constr){
            System.out.println(c1);
        }

        System.out.println("------------------------- Fields");
        Field[] fields = strCls.getFields();
        for(Field f1 : fields){
            System.out.println(f1);
        }
        System.out.println("------------------------- Methods");
        Method[] methods = strCls.getMethods();
        for (Method m1 : methods){
            System.out.println(m1);
        }

//          사용자 정의 클래스 가져오기
        System.out.println("===================================");

        Class myCls = Class.forName("com.kay.myTestClass");

        System.out.println("------------------------- Constructor");
        Constructor[] constr2 = myCls.getConstructors();
        for (Constructor c1 : constr2){
            System.out.println(c1);
        }
        System.out.println("------------------------- Fields");
        Field[] fields2 = myCls.getFields();
        for(Field f2 : fields2){
            System.out.println(f2);
        }
        System.out.println("------------------------- Methods");
        Method[] methods2 = myCls.getMethods();
        for (Method m1 : methods2){
            System.out.println(m1);
        }
    }
}

class myTestClass{
    public int id;
    public String name;

    public myTestClass(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

동적 로딩과 인스턴스 생성

Class 의 정보를 가져올 수 있다는 것은 그 정보를 토대로 동적(Dynamic) 로딩방식으로 인스턴스를 생성할 수 있다는 것을 의미합니다.

동적 로딩으로 기존의 앱이 작동하는 상태에서 새로운 클래스를 개발하여 갖다 붙일 수 있기 때문에 유연한 방식으로 클래스를 개발할 수 있습니다.

이 모든 일이 런타임에 일어나기 때문에 Exception 처리가 많이 필요합니다. Exception 은 입문강좌의 뒤쪽에서 다루겠지만 주로 충분히 발생가능한 상황을 처리하기 위한 장치입니다. 자바에서는 Error 와 Exception 은 구별하고 있는데요. Exception 은 한글로 ‘예외’ 라는 뜻으로 보통은 아니지만 발생할 수 있는 케이스로 특별 취급하는 것입니다.

Execption 이 없다면 컴퓨터 프로그램은 매우 딱딱해질 겁니다. (지금도 충분히 딱딱하지만) 예를 들어 Class not Found Exception 같은 경우 클래스가 발견되지 않아서 더 이상 진행이 안되는 상황입니다. 이대로 놔두면 오류로 프로그램이 종료해야 하지만 예외처리를 해주면 프로그램은 계속 진행할 수 있습니다. 이것이 try and catch 구문인데 아래 코드에서는 아직 구현하지 않았습니다.

그러나 try catch 문과는 별도로 throw 구문 처리를 하지 않으면 컴파일 자체가 안되는 경우가 있기 때문에 throws 를 추가해줍니다. 매우 복잡하게 보이지만 최근의 IDE는 인텔리센스에 필요한 구문의 자동 추가 기능이 있습니다.

대표적 자바 개발환경인 이클립스나 인텔리제이의 인텔리센스는 매우 쓸만합니다.

package com.kay;

import java.lang.reflect.InvocationTargetException;

public class Main {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        myTestClass test = new myTestClass();
        System.out.println(test);

        System.out.println("----------------------------");
        Class customClass = Class.forName("com.kay.myTestClass");
        System.out.println(customClass);

        myTestClass loadDynamic = (myTestClass) customClass.getDeclaredConstructor().newInstance();
        System.out.println(loadDynamic);
        loadDynamic.setId(1001);
        loadDynamic.setName("new Instance loaded dynamic");

        System.out.println("-----------------------------");
        System.out.println(loadDynamic.getName());
        System.out.println(loadDynamic.getId());
    }
}

class myTestClass{
    public int id;
    public String name;

    public myTestClass(){
        this.id = 0;
        this.name = null;
    }

    public myTestClass(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
com.kay.myTestClass@7ef20235
----------------------------
class com.kay.myTestClass
com.kay.myTestClass@27d6c5e0
-----------------------------
new Instance loaded dynamic
1001

실행 결과를 보면 인스턴스의 해시코드가 다릅니다. 각각 메모리 주소가 다르다는 것은 별도의 인스턴스라는 뜻입니다.

요약

자바의 메타 클래스라고 할 수 있는 Class 클래스에 대하여 알아봤습니다. 메타 클래스 이런게 좀 어려운 아이디어인데요. 쉽게 말하면 자바 프로그래밍 언어 자기 자신에 대한 정보를 파악하고 조작할 수 있는 클래스라 볼 수 있습니다. java.lang 패키지에는 그런 도구들이 많이 들어있습니다.

이 도구들은 개발자 자신들이 시스템 아키텍쳐를 위해 만든 클래스들이 많습니다. 그러므로 응용 프로그래머로써 첫발을 내딪는 입문자들에게는 어려울 수 있으니 잘 이해가 가지 않아도 괜찮습니다. 초급단계에서는 객체지향 기초 개념과 자료구조인 콜렉션즈 프레임워크 부분 등 기초를 충실히 다지는 기간입니다.

컴퓨터 프로그래밍의 원리는 매우 단순합니다. 우리가 사용하는 컴퓨터의 모든 것은 기계가 만들어낸 0과1과의 씨름입니다. 그러나 C언어와 유닉스의 창시자인 데니스 리치의 어록처럼 이 단순한 것을 이해하기 위해 당신은 천재가 되어야 한다는 말을 곱씹어 볼 필요가 있습니다.

매우 단순한 근원적인 원리를 수도없이 쌓아나가는 것이 컴퓨터 과학입니다. 원리를 쌓다보니 어떤 특이점을 지나서 0과1 같은 것은 생각할 필요가 없어집니다.

일반인들은 잘 몰라도 되지만 공학도들은 일반인과 기계의 중간에 있는 사람들입니다. 평생 학습의 개념을 탑재하는게 최선이겠지만 평생 공부하며 사는게 쉽지는 않습니다. 적어도 학습기간 중 만이라도 최대한 기계의 근본 원리를 탐구하는 자세가 있다면 미래의 기술에 대응하는 일도 수월해질 것입니다.

컴퓨터 소프트웨어 분야는 다른 어떤 분야 보다 기술 진보가 빠른 편입니다. 이 길에 들어선 사람들은 이 일을 그만두는 날까지 새로운 지식을 받아들여야 합니다.

이제 자바 튜토리얼이 40화에 가까워져서 중후반부에 도달했습니다. 앞쪽에서는 최대한 잡설은 자제했는데 뒷쪽으로 갈수록 테크닉도 중요하지만 소프트웨어 엔지니어로써의 마인드가 매우 중요해집니다. 일단 마인드가 없으면 본인 스스로가 왜 해야 하는지도 잘 모르겠고 매우 피곤하죠.

기술적인 부분은 데이터 구조의 콜렉션즈 프레임워크를 좀 사용할 줄 알고 입출력을 배우면 초급단계는 끝납니다. 중급 부터는 프레임워크를 사용해야 하고 고급 단계는 스스로 문제를 정의하고 설계 해야합니다.

이 시점에 오면 적성에 맞는지도 대충 알 수 있으므로 포기하기도 좋은 시기입니다. 미래에는 기술의 발달로 소프트웨어 엔지니어가 편해질 날이 올지 모르겠으나 현재는 노동의 강도가 높은 직업입니다.

그럼에도 불구하고 자신의 미래를 걸고 진지하게 각오한다면 본인은 어떤 엔지니어가 되겠다는 콘셉트가 있어야 할 것 입니다.

외부참고문서

Java Class class – Javatpoint

자바 Class 클래스

Leave a Comment