본문 바로가기
프로그래밍/JAVA

[JAVA] Java TPC 강의 정리 (PART 2) - String /ArrayList/Wrapper

by 소소로드 2020. 9. 21.
  • 1. String은 객체이다
    (1) 문자열의 생성 방법
  • 2. ArrayList
    (1) add
    (2) get
  • 3. Wrapper 클래스
    (1) 변수 저장방법
    (2) 사용의 이유

1. String은 객체이다

우리가 문자열을 처리하기 위해서는 String 클래스를 이용하는데
String 클래스는 이름처럼 데이터 타입이 아니라 사용자 정의 클래스이다.
즉, 자바에서 String 클래스는 BookVo처럼 객체로 취급하며
java.lang.String에서 문자열 자료형을 만들어 두었다..
그렇기 때문에 다른 데이터 타입처럼 직접 저장하는 것이 아니라
a라는 변수가 하나의 String의 주소를 가리키게 되는 형태가 된다. 

(1) 문자열의 생성 방법
- new로 생성
String str1 = new String("APPLE");
String str2 = new String("APPLE");
이 두개의 번지는 각각 다르다.

- 문자열 상수로 생성
String str3 = "APPLE";
String str4 = "APPLE";
이 두개는 서로 같은 번지를 가리킨다.

str3 문자열 객체가 생성되어 메모리에 자리잡게 되었는데
다음 오는 str4는 메모리의 재활용을 통해 같은 번지를 가리키게 된다.

그러므로 생성 방법에 따라 같은 객체인지 다른 객체인지 비교할때도 다르다.

if(str1==str2)
이건 두 개의 번지가 같느냐는 비교
str1.String(str1)
이건 두 개의 번지가 가리킨 값이 값느냐는 비교


2. ArrayList

ArrayList에 크기에 상관 없이 객체를 저장하기 위해서 어떻게 해야할까.
만약 BookVO를 배열에 저장하려면 어떻게 해야할까.

(1) add
List list = new ArrayList
list.add(new BookVO("java", 15000, "영진", 590));
list.add(new BookVO("python", 25000, "길벗", 700));

이렇게 되면 하나의 리스트에 있는 한 개의 공간에
바로 Object형태로 BookVO라는 객체가 생성된다.

(2) get
BookVO vo = (BookVO)list.get(0);
BookVO vo = (BookVO)list.get(1);

다운 캐스팅을 통해 형변환을 해주면 가져올 수 있다.
왜냐하면 list.get(0) 이 부분 자체가 Object 형태이기 때문이다.


3. Wrapper 클래스

우리가 아는 기본 자료형 : int, float, char, boolean
이 자료형들은 쉽게 말해 클래스가 아닌 일반적인 자료형이다.
자바를 하다보면 이 자료형들을 '객체'의 형태로 사용해야 될 떄가 있는데

이를 객체 자료형으로 만들어 놓은 자료형이 바로 포장 클래스 = Wrapper 클래스이다.

기본자료형 =>객체자료형
int => Integer
float => Float
char => Character
boolean => Boolean

(1) 변수 저장방법
기본자료형을 사용할 때는 변수에 저장해왔듯이
int a = 1;
이렇게 하면 하나의 공간에 1이라는 숫자가 기억된다.

객체자료형을 사용할 때는 객체를 만들던 방식과 같이 new 생성자를 사용
Integer a = new Integer(1);
그러면 하나의 공간에 1이 있고 a가 여기를 가리키게 된다.
(part1의 객체생성 방법과 당연히 똑같다.)

그런데 이상한 점은, 왜 다음의
 코드들은 오류가 나지 않을까?

- 변수 및 객체에 저장
Integer a = 1; // Boxing
int a = new Integer(10); // Unboxing

- 배열에 저장
Object[] obj = new Object[3]; // Boxing
obj[0] = 1; // Boxing
obj[1] = 2;
obj[2] = 3;

이 부분은 모두 에러가 나지 않는다.
그 이유는 컴파일러가 자동으로 박싱, 언박싱 기법으로 변환을 해주기 때문이다.

Object[] obj = new Object[3];
obj[0] = new Integer(1);
obj[1] = new Integer(2);
obj[2] = new Integer(3);
물론 원래 모습으로 사용한다고 해도 에러는 나지 않는다.

둘다 가능하다.

(2) 사용의 이유
최상위 클래스인 Object는 객체 클래스이다.
int, float등의 기본자료형은 Object의 자식이 당연히 될 수 없으니
객체 자료형으로 사용해서 상속을 받거나 편하게 쓸 수 있도록
부모 - 자식 관계로 연동하여 만들어 쓸 수 있도록 Wrapper 클래스를 사용하는 것이다.