이전 포스팅에 이어서 JDK 기본 클래스에 대한 포스팅 시작 하겠습니다!!
2-4 ) protected Object Object.clone()
객체 원본을 유지해 놓고 복사본을 사용한다거나, 기본 틀(prototype)의 복사본을 사용해 동일한 인스턴스를 만들어 복잡한 생성 과정을 간단히 하려는 경우에 clone() 메서드를 사용할 수 있다.
clone()메서드는 객체를 복제해 또 다른 객체를 반환해주는 메서드 입니다.
예제를 통해서 자세히 알아봅시다.
글쓴이는 이전 포스팅에서 학번(id)과 이름(name)을 갖는 학생(Student) 클래스를 만들었고,
그리고 이름과 학번을 `홍길동(921234)`와 같이 출력하는 toString() method를 구현을 했었다.
그럼 학생(Student) 클래스를 복제(clone) 가능하게 clone() 메서드를 override 해서 복제본은 '복제본'이란 스트링을 추가해보겠습니다.
객체를 복제하기 위해서 먼저 그 객체의 클래스가 Cloneable 인터페이스를 구현해야 합니다. 만약 객체를 복제하기 위해서 Object 클래스의 clone 메서드가 불려 갔지만... 그 객체의 클래스가 Cloneable 인터페이스를 구현하고 있지 않을 수도 있습니다. 그럴 땐 예외 처리를 해야 하는데, clone 메서드를 override 하고 있는 애플리케이션에도, 객체를 복제할 수가 없는지, 혹은 객체를 복제해서는 안 되는 것을 나타내기 위해서 Throw ClonenotSupportedException 예외 처리를 해야 합니다.
※ 예외 처리란?
프로그램이 실행 중에 멈추지 않도록 어류가 생길 수 있는 부분에 특정 코드를 구현하는 것이다.
Cloneable 인터페이스를 구현하고 Override 하여 복제본에는 뒤에 "복제본!" 스트링을 추가했습니다. 참고로 clone()메서드의 리턴 타입은 Object이므로 Member 타입으로 캐스팅해야 합니다.
정리하자면
- clone() 메서드를 사용하려면 객체를 복제해도 된다는 의미로 클래스에 Cloneable 인터페이스를 구현해야 합니다.
(만약 Cloneable 인터페이스를 명시하지 않으면 clone() 메서드를 호출할 때 ClonenotSupportedException이 발생한다.)
-이 예제에서는 Object의 clone() 메서드를 그대로 사용하는데, Object의 clone()은 클래스의 인스턴스를 새로 복제하여 생성해야 합니다.
(멤버 변수가 동일한 인스턴스가 다른 메모리에 새로 생성되는 것이다.)
-출력 결과를 보면 인스턴스의 멤버 변수 값은 같고 주소 값은 다른 s2이 생성되었음을 알 수 있다.
2-5 ) java.lang.String
Java는 문자열을 사용할 수 있도록 String 클래스를 제공합니다. 문자열은 프로그램을 구현할 때 많이 활용하게 되는데, String을 사용할 때 문자열을 생성자의 매개변수로 하여 생성하는 방식과, 이미 생성된 문자열 상수를 가리키는 방식이 있습니다.
언뜻 비슷해 보이지만, 내부적으로는 두 가지 방식은 큰 차이가 있습니다.
[s2,s3와 같이 생성자를 이용하지 않고 문자열 상수를 가리키는 경우]
-s2가 기존에 만들어져 있던 "123abc"라는 문자열 상수의 메모리 주소를 가리키게 됩니다. 따라서 s3 = "123abc"를 동일하게 코드를 추가하면 s2와 s3는 주소 값이 같게 됩니다.
[new예약어를 사용하여 객체를 생성하는 경우]
-"123abc"문자열을 위한 메모리가 할당되고 새로운 객체가 생성됩니다.
※ 모든 String 값은 JVM(Method Area)의 상수풀(Constant Pool)에 위치한다.
3 ) Wrapper Class
Wrapper Class란?
기본 자료형을 위한 클래스이다. 지금까지 정수를 사용할 때 기본형인 int를 사용하는데 정수를 객체형으로 사용해야 하는 경우가 있습니다. 예를 들어, 메소드의 인수로 객체 타입만이 요구되면, 기본 타입의 데이터를 그대로 사용할 수 없습니다.
이대에는 기본 타입의 데이터를 먼저 객체로 변환한 후 작업을 수행해야 합니다.
Wrapper Classs는 모두 java.lang 패키지에 포함되어 제공됩니다.
자바에서 제공하고 있는 Wrapper Class는 다음과 같습니다.
기본 타입 | Wrapper Class |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
3-1 ) Boxing , UnBoxing
Wrapper Class는 산술 연산을 위해 정의된 클래스가 아니므로, 인스턴스에 저장된 값을 변경할 수 없습니다.
단지, 값을 참조하기 위해 새로운 인스턴스를 생성하고, 생성된 인스턴스의 값만을 참조할 수 있습니다.
[Boxing]
기본 타입의 데이터를 Wrapper Class의 인스턴스로 변환하는 과정
[UnBoxing]
Wrapper Class의 인스턴스에 저장된 값을 다시 기본 타입의 데이터로 꺼내는 과정
3-2 ) AutoBoxing , AutoUnBoxing
JDK 1.5부터는 Boxing , UnBoxing이 필요한 상황에서 자바 컴파일러가 자동으로 처리해 줍니다.
이렇게 자동화된 Boxing , UnBoxing을 AutoBoxing , AutoUnBoxing이라고 부릅니다.
위에 예제에서 볼 수 있듯이 Wrapper Class인 Character 클래스에는 charValue()메소드가 포함되어 있습니다.
또한 AutoBoxing을 이용하면 new 키워드를 사용하지 않고도 자동으로 Character 인스턴스를 생성할 수 있습니다.
마치며
지금까지 JDK 기본 클래스를 살펴보면서 Wrapper Class의 역할과 특징에 대해 알아봤습니다.
다른 Wrapper Class의 쓰임 또한 크게 다르지 않으니 자바 공부를 시작하시는 분들은 많은 구글링(?)을 하셔서 찾아보면서 참고해보시고 활용해보시는 걸 추천드립니다!!
'[ JAVA ] > JAVA' 카테고리의 다른 글
[ Java ] Collection Framework (0) | 2022.12.28 |
---|---|
[ Java ] Generic (0) | 2022.12.26 |
[ Java ] JDK 기본 클래스 1 (0) | 2022.12.22 |
[ Java ] Interface 2 (2) | 2022.12.21 |
[ Java ] Interface 1 (0) | 2022.12.19 |