반응형
[1] Class 클래스
(1) Class 클래스
- 클래스 파일 , 인터페이스 파일은 컴파일 하면 자동으로 class.파일이 생성된다.
- Class 클래스는 class.파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드이다
- Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드 함
(2) Class 클래스 목적
- reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
- 로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
- java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍
- 일반적으로 자료형을 알고 있는 경우엔 사용하지 않음
[2] 내부클래스
(1) 내부클래스 inner class
- 내부 클래스에서 외부 클래스 멤버에 접근가능
- 외부클래스는 내부클래스에 접근 불가하다
- 외부클래스와 내부클래스 간에 서로 접근이 가능하고 불필요한 클래스를 감추어 캡슐화 한다
- 내부클래스는 외부클래스 외에 다른 클래스에서 잘 사용하지 않는것이여야한다
- 각 클래스를 상속으로 할지 내부클래스로 만들지 판단해야한다
(2) 내부클래스 종류
인스턴스 클래스 instance class | outer클래스의 멤버변수 선언위치에 선언한다 외부클래스의 인스턴스멤버들과 관련된 작업에 사용된다 |
스태틱 클래스 static class | outer클래스의 멤버변수 선언위치에 선언한다 외부클래스의 static 멤버, 메서드에서 사용된다 static클래스만 static 멤버를 가질수 있다 static 선언을 해야한다면 스태틱 클래스로 선언한다 |
지역 클래스 local class | outer클래스의 메서드, 초기화블럭 안에 선언한다 |
익명 클래스 anonymous class | 클래스 선언과 동시에 객체를 생성한다 일회용 클래스이다 생성자가 없다 상위클래스의 이름이나 구현할 인터페이스 이름으로 정의한다 1개의 클래스 또는 1개의 인터페이스만 구현된다 클래스이름 참조변수 = new 클래스이름(){} |
(3) 내부 클래스 메서드의 멤버 호출
(4) 내부클래스와 접근제어자
(5) 내부클래스 & this
(6) 인스턴스 클래스를 익명클래스(내부클래스)로 변경
Object 상위 클래스를 이용하여 class Ex 인스턴스 클래스를 익명클래스로 변경한다
Ex 클래스 , ActionListener > EventHandler 클래스 로 나눠서 설계할수 있으나
Ex 클래스 내부에 익명클래스로 만들어서 설계시 코드를 줄일수 있다
[2] 동적로딩
(1) 동적로딩
- 컴파일시 읽고자 하는 클래스가 로컬에 있는지 확인후 바인딩되면 데이터 타입이 정해지고 변수를 사용하게 되는데 , 이 방법이 아닌 실행(runtime) 중에 데이터 타입을 binding 바인딩 하여 데이터타입을 정하게 되는 방법
- 프로그래밍 시에는 문자열 변수로 처리했다가 런타임시에 원하는 클래스를 로딩하여 binding 할 수 있다는 장점
- 컴파일시에 어떤 클래스 데이터 타입으로 할지 못 정할때 , 실행중일때 동적로딩을 사용한다
- DB의 종류를 알수있는 JDBC를 읽기전 사전에 변수를 가지고 있다가 JDBC를 읽어오면서 동적로딩을 한다
- 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 라이브러리나 클래스가 로컬에 없어서 오류가 발생하면 프로그램의 심각한 장애가 발생가능
// Class.forName 메서드를 이용하여 동적로딩하기
Class c = Class.forName("변수이름");
Class c = Class.forName("java.lang.String");
// 클래스 이름으로 직접 Class 클래스 가져오기
Class c = String.class;
//생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass(); //Object 메서드
(2) 동적로딩으로 불러오기
- 로컬에 메서드가 없어서 찾을때 쓴다
package ch04;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class StringTest {
public static void main(String[] args) throws ClassNotFoundException {
Class c = Class.forName("java.lang.String"); // throw 하여 추가한다
Constructor[] cons = c.getConstructors(); // Constructor[]를 import 한다
for(Constructor co : cons) {
System.out.println(co);
}
Method[] m = c.getMethods(); // import 하여 추가한다
for(Method mth : m ) {
System.out.println(mth);
}
}
}
(3) 동적 객체 생성
클래스의 이름을 결정할수 없고 , 프로그램이 동작하는 시점에 이름을 결정하는 경우에 사용한다
newInstance() 메서드
- new 키워드를 사용하지 않고 클래스 정보를 활용하여 인스턴스를 생성할 수 있음
public class Person {
private String name;
private int age;
public Person() {};
public Person(String name) {
this.name = name;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return name;
}
}
public class ClassTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException,
ClassNotFoundException, NoSuchMethodException, SecurityException {
Person person = new Person("James");
System.out.println(person);
Class c1 = Class.forName("ch04.Person");
Person person1 = (Person)c1.newInstance();
System.out.println(person1);
Class[] parameterTypes = {String.class};
Constructor cons = c1.getConstructor(parameterTypes);
Object[] initargs = {"김유신"};
Person personLee = (Person)cons.newInstance(initargs);
System.out.println(personLee);
}
}
반응형
'🌈 백엔드 > 객체 지향' 카테고리의 다른 글
JAVA_객체지향_컬렉션 프레임워크 (자료구조) (0) | 2023.06.21 |
---|---|
JAVA_객체지향_제네릭 프로그래밍 (0) | 2023.06.19 |
JAVA_객체지향_인터페이스 예시 (0) | 2023.06.19 |
JAVA_객체지향_인터페이스 (2) | 2023.06.18 |
JAVA_객체지향_추상클래스 & 가상메서드 (0) | 2023.06.18 |
댓글