java.lang 패키지/오토박싱
자바는 기본적으로 다양한 패키지를 지원 그중에서 가장 중요한 패키지
- java.lang패키지의 클래스는 import를 하지 않고도 사용할 수 있다.
- java.lang패키지에는 기본형타입을 객체로 변환시킬때 사용하는 Wrapper클래스가 있다.
- Boolean, Byte, Short, Integer, Long, Float, Double 클래스
- 모든 클래스의 최상위 클래스인 Object도 java.lang패키지
- 문자열과 관련된 String, StringBuffer, StringBuilder도 모두 java.lang패키지
- 화면에 값을 출력할때 사용했던 System클래스도 java.lang패키지
- 수학과 관련된 Math클래스도 java.lang패키지
- Thread와 관련된 중요 클래스들이 java.lang패키지
- 이외에도 다양한 클래스와 인터페이스가 java.lang패키지에 속해 있다.
public class WrapperExam {
public static void main(String[] args) {
int i = 5;
Integer i2 = new Integer(5);
Integer i3 = 5; //오토박싱
int i4 = i2.intValue();
int i5 = i2; //오토언박싱
}
}
- 오토박싱(Auto Boxing)
- Integer i3 = 5; 숫자 5는 원래 기본형이지만 자동으로 Integer형태로 변환된다.
- 오토 언박싱(Auto unboxing)
- int i5 = i2; Integer객체타입의 값을 기본형 int로 자동으로 변환되어 값을 할당한다.
- 오토박싱(Auto Boxing),오토 언박싱(Auto unboxing) 은 JAVA 5부터 지원한다. 이 때 내부적으로 Wrapper클래스들이 사용된다.
스트링버퍼
아무 값도 가지고 있지 않은 StringBuffer객체를 생성
StringBuffer sb = new StringBuffer();
// 해당 스트링 버퍼에 "hello", 공백, "world"를 차례대로 추가
sb.append("hello");
sb.append(" ");
sb.append("world");
// StringBuffer에 추가된 값을 toString()메소드를 이용하여 반환
String str = sb.toString();
- 출력결과 : hello world
StringBuffer가 가지고 있는 메소드들은 대부분 자기 자신, this를 반환
StringBuffer sb2 = new StringBuffer();
StringBuffer sb3 = sb2.append("hello");
if(sb2 == sb3){
System.out.println("sb2 == sb3");
}
- 자기 자신의 메소드를 호출하여 자기 자신의 값을 바꿔나가는 것을 메소드체이닝 이라고 한다.
- StringBuffer클래스는 메소드 체인 방식으로 사용할 수 있도록 만들어져 있다.
String str2 = new StringBuffer().append("hello").append(" ").append("world").toString();
System.out.println(str2);
- 앞에서 5줄로 작성했던 코드를 위와 같이 한 줄로 수정할 수 있습니다.
- StringBuffer는 append메소드 외에도 길이를 구하거나, 자르거나 등의 다양한 메소드들을 가지고 있습니다.
스트링 클래스의 문제점
String클래스는 문자열을 다룰때 사용하는 클래스
String클래스는 불변클래스 이다.
String str1 = "hello world";
String str2 = str1.substring(5);
System.out.println(str1);
System.out.println(str2);
- 실행결과
hello world
world
- 기존의 str1은 전혀 변화 없다.
- substring메소드는 5번째 부터 문자열을 잘라서 새로운 문자열을 반환하는 메소드
- str1자체는 전혀 변화가 없다.
String클래스를 사용할 때 가장 문제가 발생하는 경우는 다음과 같은 코드를 사용할 때 입니다.
String str3 = str1 + str2;
System.out.println(str3);
- 실행결과
hello world world
문자열과 문자열을 더하게 되면 내부적으로는 다음과 같은 코드가 실행
String str4 = new StringBuffer().append(str1).append(str2).toString();
System.out.println(str4);
문자열을 반복문 안에서 더하는 것은 성능상 문제가 생길 수 있으니 반드시 피하도록 합시다.
java.util 패키지
java.util패키지는 유용한 클래스들을 많이 가지고 있는 패키지
- 날짜와 관련된 클래스인 Date, Calendar클래스
- 자료구조와 관련된 컬렉션 프레임워크와 관련된 인터페이스와 클래스
- deprecated란 더이상 지원하지 않으니 사용하지 않는 것이 좋다란 의미다.
- Date클래스는 지역화를 지원하지 않는다. 지역화란 국가별로 현재 날짜와 시간은 다를 수 있는데, 그 부분을 지원하지 못한다.
- 이런 문제를 해결하기 위하여 나온 클래스가 Calendar클래스. Calendar클래스는 자바 1.1에 등장하였다.
- 지역화와 관련된 클래스들은 Locale로 시작되는 이름을 가진 클래스들입니다. 역시 1.1 이후에 등장한다.
- List, Set, Collection, Map은 자료구조 즉 컬렉션 프레임워크와 관련된 인터페이스
컬렉션 프레임워크
java.util패키지에는 자료를 다룰 수 있는 자료구조 클래스가 다수 존재합니다. 자료구조 클래스들을 컬렉션 프레임워크라고 한다.
- 자료구조란 자료를 저장할 수 있는 구조
- 책을 보관하기 위해서 책장을 이용하는 것처럼 다양한 자료들을 다양한 방식으로 관리하기 위한 방법이 필요한데, 이러한 방법을 제공하는 것을 자료구조, 컬렉션 프레임워크이다.
- 컬렉션 프레임워크에서 가장 기본이 되는 interface는 Collection인터페이스
- Collection인터페이스는 여기에 자료가 있다라는 것을 표현.
- 중복도 허용하고, 자료가 저장된 순서도 기억하지 못하는 것이 Collection인터페이스.
- Collection이 가지고 있는 대표적인 메소드는 add(), size(), iterator() 메소드
- Collection은 저장된 순서를 기억하지 못하기 때문에 "첫번째 자료를 달라, 두번째 자료를 달라"와 같은 기능을 가질 수 없다. * * Collection은 저장된 자료를 하나씩 하나씩 꺼낼 수 있는 Iterator라는 인터페이스를 반환한다.
- Iterator는 꺼낼것이 있는지 없는지 살펴보는 hasNext()메소드와 하나씩 자료를 꺼낼때 사용하는 next()메소드를 가지고 있다.
- Set자료구조는 중복을 허용하지 않는 자료구조를 표현하는 인터페이스
- Collection인터페이스를 상속받는다.
- Set인터페이스가 가지고 있는 add메소드는 같은 자료가 있으면 false, 없으면 true를 반환하는 add메소드를 가지고 있다.
- List자료구조는 중복은 허용하면서 순서를 기억하는 자료구조를 표현.
- Set인터페이스와 마찬가지로 Collection인터페이스를 상속받고 있다.
- List는 순서를 기억하고 있기 때문에 0번째 1번째 n번째의 자료를 꺼낼 수 있는 get(int)메소드를 가지고 있다.
- Map자료구조는 Key와 Value를 가지는 자료구조이다.
- 저장할 때 put()메소드를 이용하여 key와 value를 함께 저장한다.
- 원하는 값을 꺼낼때는 key를 매개변수로 받아들이는 get()메소드를 이용하여 값을 꺼낸다.
- Map에 저장되어 있는 모든 Key들은 중복된 값을 가지면 안된다.
- Key의 이런 특징 때문에 Map은 자신이 가지고 있는 모든 Key들에 대한 정보를 읽어들일 수 있는 Set을 반환하는 keySet()메소드를 가지고 있다.
Generic
Box 클래스
public class Box {
private Object obj;
public void setObj(Object obj){
this.obj = obj;
}
public Object getObj(){
return obj;
}
}
BoxExam 클래스
public class BoxExam {
public static void main(String[] args) {
Box box = new Box();
box.setObj(new Object());
Object obj = box.getObj();
box.setObj("hello");
String str = (String)box.getObj();
System.out.println(str);
box.setObj(1);
int value = (int)box.getObj();
System.out.println(value);
}
}
- Box는 매개변수로 Object를 하나 받아들이고, Object를 반환한다.
- Object를 받아들일 수 있다는 것은 Object의 후손이라면 무엇이든 받아들일 수 있다는 것이다.
Java5에는 Generic이라는 문법이 사용됨으로써 인스턴스를 만들때 사용하는 타입을 지정하는 문법이 추가
Generic을 이용하여 Box 클래스 수정
public class Box<E> {
private E obj;
public void setObj(E obj){
this.obj = obj;
}
public E getObj(){
return obj;
}
}
- 클래스 이름 뒤에 <E>가 제네릭을 적용한 것이다. Box는 가상의 클래스 E를 사용한다는 의미.
- Object를 받아들이고, 리턴하던 부분이 E로 변경. E는 실제로 존재하는 클래스는 아니다.
Generic을 이용하여 수정한 Box를 이용하는 BoxExam클래스
public class BoxExam {
public static void main(String[] args) {
Box<Object> box = new Box<>();
box.setObj(new Object());
Object obj = box.getObj();
Box<String> box2 = new Box<>();
box2.setObj("hello");
String str = box2.getObj();
System.out.println(str);
Box<Integer> box3 = new Box<>();
box3.setObj(1);
int value = (int)box3.getObj();
System.out.println(value);
}
}
- 참조타입에 <Object> , <String>, <Integer>가 있는 것을 볼 수 있다.
- 첫번째는 Object를 사용하는 Box를 인스턴스로 만들겠다는 의미
- 두번째는 String을 사용하는 Box인스턴스를 만들겠다는 의미
- 세번째는 Integer를 사용하는 Box인스턴스를 만든다는 의미
Generic을 사용함으로써 선언할때는 가상의 타입으로 선언하고, 사용시에는 구체적인 타입을 설정함으로써 다양한 타입의 클래스를 이용하는 클래스를 만들 수 있습니다. Generic을 사용하는 대표적인 클래스는 컬렉션 프레임워크와 관련된 클래스입니다.
'IT > JAVA' 카테고리의 다른 글
[18일차] JAVA 알고리즘 문제풀이 1 (0) | 2022.07.13 |
---|---|
[18일차] JAVA 컬렉션 프레임워크 (0) | 2022.07.13 |
[17일차] JAVA Generic / lambda (0) | 2022.07.12 |
[16일차] JAVA 예외처리. 스레드 (0) | 2022.07.11 |
[15일차] JAVA Programmers 개념정리 (0) | 2022.07.08 |
댓글