자바 리마인드#15 기본 클래스(2)

2023. 3. 9. 17:51java일지

2023/03/09

  • 학습내용

 

1. String 클래스

JAVA는 문자열을 사용할 수 있도록 String  클래스를 제공한다.

 

 

1) String을 선언하는 두가지 방법

String str1 = new String("abc");	//생성자의 매개변수로 문자열 생성
String str2 = "test";			//문자열 상수를 가리키는 방식

(1) String을 사용할 때 문자열을 생성자의 매개변수로 하여 생성하는 방식

(2) 이미 생성된 문자열 상수를 가리키는 방식

 

-> 두가지 방식은 내부적으로 큰 차이가 있다.

new 예약어를 사용하여 객체를 생성하는 경우 "abc" 문자열을 위한 메모리가 할당되고 새로운 객체가 생성된다.

하지만 str2 = "test"와 같이 생성자를 이용하지 않고 바로 문자열 상수를 가리키는 경우에는 기존에 만들어져 있던 "test"라는 문자열 상수의 메모리 주소를 가리키게 된다.

따라서 String str3 = "test" 코드를 작성하면 str2와 str3는 주소 값이 같게 된다.

프로그램에서 사용되는 상수 값을 저장하는 공간을 "상수 풀(constant pool)" 이라고 한다.

 

 

2) String 클래스의 final char[] 변수

다른 프로그래밍 언어는 문자열을 구현할 때 일반적으로 char[] 배열을 사용한다.

JAVA는 String 클래스를 제공해 char[] 배열을 직접 구현하지 않고 문자열을 사용할 수 있다.

 

String 클래스의 구현 내용을 보면 private final char value[] 라고 선언된 char형 배열이 있다.

프로그램에서  String s = new String("abc")라고 쓰면 abc는 String 클래스의 value 변수에 저장된다.

 

 

 

 

3) StringBuffer와 StringBuilder 클래스

한 번 생성된 String 값(문자열)은 불변(immutable). final로 선언되어 선언된 이후에 변하지 않는다.

 

프로그램을 만들다 보면 문자열을 변경하거나 연결해야 할 때가 많다.

이 때 문자열을 계속 연결하거나 변경하는 프로그램을 작성하면 메모리가 많이 낭비된다.

이 문제를 해결하는 것이 StringBuffer와 StringBuilder 클래스이다.

 

StringBuffer와 StringBuilder 클래스는 내부에 변경 가능한 char[]를 변수로 가지고 있다.

이 두 클래스를 사용하여 문자열을 연결하면 기존에 사용하던 char[] 배열이 확장되므로 추가 메모리를 사용하지 않는다.

문자열을 연결하거나 변경할 경우 StringBuffer와 StringBuilder 클래스를 사용하면 된다.

 

 

4) StringBuffer와 StringBuilder 클래스의 차이

여러 작업이 동시에 문자열을 변경하려 할 때 문자열이 안전하게 변경되도록 보장해 주는가 그렇지 않은가의 차이다.

StringBuffer 클래스는 문자열이 안전하게 변경되도록 보장한다.

StringBuilder 클래스는 보장되지 않는다.

 

※ 프로그램에서 따로 스레드를 생성하는 멀티스테드 프로그램이 아니라면 StringBuilder를 사용하는 것이 속도가 빠르다.

 

StringBuffer와 StringBuilder 클래스 사용법

StringBuffer, StringBuilder 모두 String 클래스가 아니기 때문에

String 클래스로 반환하기 위해서는 toString() 메서드를 통해 String으로 반환한다

 

 

 

 

2. Wrapper 클래스

기본 자료형을 위한 클래스

 

정수를 사용할 때는 기본형인 int를 사용한다.

그런데 정수를 객체형으로 사용해야 하는 경우가 있다.

ex) 매개변수가 객체거나 반환 값이 객체인 경우

public void setValue(Integer i) {...}	//객체를 매개변수로 받는 경우
public Integer returnValue() {...}	//반환 값이 객체인 경우

이런 경우 JAVA에서는 기본 자료형처럼 사용할 수 있는 클래스를 제공한다.

이런 클래스를 기본 자료형을 감쌌다는 의미로 Wrapper 클래스라고 한다.

 

1) Integer 클래스

Integer 클래스는 int 자료형을 감싼 클래스이다.

Integer 클래스의 생성자는 특정 정수를 매겨변수로 받는 경우와 문자열을 받는 경우가 있다.

Integer(intt value) {...}	//특정 정수를 매개변수로 받는 경우
Integer(String s) {...}		//특정 문자열을 매개변수로 받는 경우

※ Integer 클래스 메서드

 

(1) intValue() 메서드

Integer 클래스 내부의 int 자료형 값을 가져온다.

Integer iValue = new Integer(100);
int myValue = iValue.intValue();	//int값 가져오기.myValue 값을 출력하면 100이 출력됨

 

(2) valueOf() 정적 메서드

생성자를 사용하지 않고 정수나 문자열을 바로 Integer 클래스로 반환받을 수 있다.

 

Integer number1 = Integer.valueOf("100");
Integer number2 = Integer.valueOf(100);

 

(3) parseInt() 메서드

문자열이 어떤 숫자를 나타낼 때,

예를 들어 학번이나 개수 등이 문자열로 전달된 경우에 문자열에서 int값을 바로 가져와 반환할 수 있다.

int num = Integer.parsInt("100");

 

 

2) 오토박싱과 언박싱

 

Integer num1 = new Integer(100);
int num2 = 200;
int sum = num1 + num2;	//num.intValue()로 변환(언박싱)
Integer num3 = num2;	//Integer.valueOf(num2)로 변환(오토박싱)

오토박싱(autoboxing) : 기본형을 객체형으로 바꾼다.

언박싱(unboxing) : 객체형을 기본형으로 꺼낸다.

 

오토박싱과 언박싱은 Java의 연산 방식이 변경된 것이 아니라 컴파일러가 변경하는 것이다.

따라서 객체의 형 변환에 신경 쓰지 않고 편리하게 프로그래밍할 수 있다.

 

 

 

 

 

3. Class 클래스

 

Java의 모든 클래스와 인터페이스는 컴파일되고 나면 class 파일로 생성된다.

ex) a.java 파일이 컴파일되면 a.class 파일이 생성되고

이 class 파일에는 클래스나 인터페이스에 대한 변수, 메서드, 생성자 등의 정보가 들어있다.

 

※ Class 클래스를 선언하고 클래스 정보를 가져오는 방법

 

(1) Object 클래스의 getClass() 메서드

String s = new String();
Class c = s.getClass();	//getClass()메서드의 반환형은 Class

Object에 선언한 getClass() 메서드는 모든 클래스가 사용할 수 있는 메서드다.

이 메서드를 사용하려면 이미 생성된 인스턴스가 있어야 한다.

 

(2) 클래스 파일 이름을 Class 변수에 직접 대입

 

Class c = String.Class;

 

(3) Class.forName("클래스 이름") 메서드

 

Class c = Class.forName("java.lang.String");

 

(2), (3)은 컴파일된 클래스 파일이 있다면 클래스 이름만으로 Class 클래스를 반환한다.

 

 

 

※ 리플렉션(reflection)

사용하려는 클래스의 자료형을 모르는 상태에서 Class 클래스를 활용하여 그 클래스의 정보를 가져오고,

이 정보를 활용하여 인스턴스를 생성하거나 호출하는 방식이다.

 

 

 

 

Class.forName()을 사용해 동적 로딩하기

대부분의 클래스 정보는 프로그램이 로딩될 때 이미 메모리에 있다.

 

프로그램 실행 이후 클래스의 로딩이 필요한 경우 클래스의 동적 로딩(dtnamic loading) 방식을 사용한다.

Java는 forName()메서드를 동적 로딩으로 제공한다.

 

Class pClass = Class.forName("classex.Person");

 

forName()메서드는 매개변수로 문자열을 입력받는다.

입력받는 문자열을 변수로 선언하여 변수 값만 바꾸면 다른 클래스를 로딩할 수 있다.

 

String className = "classex.Person"
Class pClass = Class.forName(className);

위의 코드처럼 작성하고 className 변수에 다른 문자열을 대입하면 필요에 따라 로딩되는 클래스를 동적 변경할 수 있다.