Obeject 클래스란?
Object 클래스란 자바의 클래스 중 최상단에 있는 클래스다.
즉 모든 클래스는 Obejct클래스를 상속 받은 것이다.
package javaBasic;
// 모든 클래스를 변수로 받을 수 있는 클래스다.
class Converter{
private Object obj;
public Converter(Object obj) {
this.obj = obj;
}
public Object getObj() {
return obj;
}
public void setObj(Object obj) {
this.obj = obj;
}
}
// 임의로 만든 클래스다.
class MyType{
private String name;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
// 임의로 만든 클래스를 상속받은 클래스다.
class Box extends MyType{
}
public class Test016 {
public static void main(String[] args) {
Converter str = new Converter("string");
Converter integer = new Converter(100);
// 임의로 만든 클래스도 Object 클래스의 자손이 될까?
MyType myType = new MyType();
Converter mt = new Converter(myType);
Box box = new Box();
Converter bx = new Converter(box);
// 모든 클래스는 Object를 상속 받았기 때문에 casting이 가능하다.
String strTemp = (String)str.getObj();
Integer intTemp = (Integer)integer.getObj();
MyType mtTemp = (MyType)mt.getObj();
}
}
Object클래스가 정말로 모든 클래스의 조상이 되는지 알아보기 위해서 Convert클래스를 만들었다.
Object클래스 type의 참조변수인 obj를 만들어 obj변수가 모든 클래스를 받을 수 있는지 알아보았다.
결과는 Object클래스는 자바내의 모든 클래스를 자손으로 두며 새롭게 생성된 클래스 또한 Object클래스의 자손이 된다는 사실을 위 코드를 작성하면서 알 수 있었다.
String strTemp = (String)str.getObj();
Integer intTemp = (Integer)integer.getObj();
MyType mtTemp = (MyType)mt.getObj();
그러나 다음 코드와 같이 원래 클래스의 참조변수로 가리킬 때는 필수적으로 캐스팅 과정을 거쳐야 한다.
왜?
double a = 1.0;
int b = (int) a;
다음 코드와 같이 Double은 int type보다 넓은 범위를 갖는다. 따라서 double로 선언된 a를 int로 선언된 b변수에 복사하기 위해서는 a를 int type으로 강제 casting해서 범위를 제한해주어야 한다.
String, Integer, MyType또한 Object클래스의 자손이기 때문에 Object > String, Integer, Mytype이 성립된다.
그렇기 때문에 원래 타입의 참조변수로 가리킬 때 일일히 캐스팅을 불편함을 겪어야 하며, 코드가 길어진다면 불필요한 수고를 해야한다.
그렇다면 제네릭(Generic)을 사용하면 어떨까?
package javaBasic;
class Converter<T>{
private T obj;
public Converter(T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
public void setObj(T obj) {
this.obj = obj;
}
}
class MyType{
private String name;
private int number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
public class Test016 {
public static void main(String[] args) {
Converter<String> str = new Converter<String>("string");
Converter<Integer> integer = new Converter<Integer>(100);
// 임의로 만든 클래스다.
MyType myType = new MyType();
Converter<MyType> mt = new Converter<MyType>(myType);
String strTemp = str.getObj();
Integer intTemp = integer.getObj();
MyType mtTemp = mt.getObj();
}
}
제네릭을 사용하면 불필요하게 casting을 하지 않아도 된다.
즉 Converter 클래스에서 생성자를 통해 인스턴스를 만들때 obj변수가 Object타입이 아니라 String, Integer, MyType과 같은 타입으로 선언된다.
그래서 casting이 없어도 정상적으로 obj변수를 String, Integer, MyType 타입의 참조변수가 가리킬 수 있게 되는 것이다.
그렇다면 제네릭을 사용하는 방법은?
class A<T>
/*
제네릭 변수를 같는 클래스를 만들때는 보통 다음과 같이 꺾쇠:<>사이에 영어 대문자를 써준다.
?도 가능하다.
*
<K>,<V>,<?> //이런 형태 모두 가능하다.
//제네릭 변수를 선언 할 때는
T value;
K value;
? value;
//모두 가능하다.
// 따라서 제네릭 변수를 갖는 클래스는 다음과 같이 모든 클래스를 받을 수 있으며
// 사용시에 원하는 클래스를 다음과 같이 꺾쇠사이(원래 T의 자리)에 기입해야 한다.
Converter<String> str = new Converter<String>();
Converter<Integer> str = new Converter<Integer>();
제네릭(Generic)의 장점
package javaBasic;
import java.util.ArrayList;
class Student{
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
public class Test017 {
public static void main(String[] args) {
ArrayList<Integer> intArray = new ArrayList<>();
intArray.add(1);
intArray.add(2);
intArray.add(3);
// 배열을 탐색할 때 자주 쓰이는 for문
for(Integer item: intArray) {
System.out.println(item);
}
/*
* 1
* 2
* 3
*/
ArrayList<String> strArray = new ArrayList<>();
strArray.add("seoul");
strArray.add("suwon");
strArray.add("sungnam");
/*
* seoul
* suwon
* sungnam
*/
for(String item: strArray) {
System.out.println(item);
}
ArrayList<Student> studentArray = new ArrayList<>();
studentArray.add(new Student("james",80));
studentArray.add(new Student("bob",70));
studentArray.add(new Student("amy",90));
for(Student item: studentArray) {
System.out.println(item.getName()+": "+item.getScore());
}
/*
* james: 80
* bob: 70
* amy: 90
*/
}
}
ArrayList는 자바에서 제공하는 제네릭리스트?다. import해주면 사용가능하다.
코드와 같이 제네릭 리스트는 클래스의 제약없이 생성될 수 있으며, Student와 같이 자신이 직접 만든 클래스조차도 객체화하여 리스트에 담을 수 있다.
'JAVA 기초 정리' 카테고리의 다른 글
JAVA Stack과 Queue구현하기 (0) | 2020.03.08 |
---|---|
JAVA Node로 Doubly Linked List 구현하기 (0) | 2020.03.08 |
JAVA 객체지향과 다형성 (0) | 2020.03.06 |
JAVA Node로 LinkedList 구현하기 (0) | 2020.03.05 |
JAVA 객체지향과 은닉성 (0) | 2020.03.04 |
댓글