본문 바로가기
[ JAVA ]/JAVA

[ Java ] JDK 기본 클래스 2

by 환이s 2022. 12. 25.

이전 포스팅에 이어서 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의 쓰임 또한 크게 다르지 않으니 자바 공부를 시작하시는 분들은 많은 구글링(?)을 하셔서 찾아보면서 참고해보시고 활용해보시는 걸 추천드립니다!! 

728x90

'[ 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