본문 바로가기
🌈 백엔드/객체 지향

JAVA_객체지향_ Class 클래스

by 개발자 알마 2023. 6. 19.
반응형

 

[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);
	}
}
반응형

댓글