StringBuffer와 StringBuilder
StringBuffer 와 StringBuilder
•
String 객체는 한 번 값이 할당되면 그 공간은 변하지 않는다.
하지만 Stringbuilder나 StringBuffer 객체는 한 번 값이 할당되더라도 한 번 더 다른 값이 할당되면 할당된 공간이 변하는 특성을 갖고 있다.
◦
String: 불변성을 갖는다. → Immutable 하다.
◦
StringBuilder, StringBuffer: 가변성을 갖는다. → mutable 하다.
•
그래서 String 클래스의 경우, 빈번하게 문자열을 변경할 때에는 비효율적일 수 있다.
왜냐하면 문자열의 내용을 변경하는 String 클래스 메서드의 경우, 새로운 String 객체를 생성하고 기존의 내용을 복사해야 하기 때문이다. ⇒ 원본 보존의 법칙
•
StringBuilder는 문자열을 자유롭게 조작할 수 있는 객체이다.
1.
append(): 문자열을 추가할 때 사용
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.append(4567); //문자열 덧붙이기
System.out.println(sb); //1234567 출력
}
}
Java
복사
2.
delete(): 특정 번지부터 특정 번지 전까지 삭제하겠다는 의미
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.delete(0, 2);
//delete(start, end) 삭제, 위의 예제에서는 12가 삭제된다.
System.out.println(sb); //3 출력
}
}
Java
복사
3.
replace(): 특정 번지부터 특정 번지 전까지 교체하겠다는 의미
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.replace(0, 2, "A");
System.out.println(sb); //A3 출력
}
}
Java
복사
4.
reverse(): 문자열 데이터를 역순으로 정렬하겠다는 의미
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.reverse();
System.out.println(sb); //321 출력
}
}
Java
복사
5.
substring(): 문자열의 특정 부분을 잘라내는 데 사용
substring(int startIndex) or substring(int startIndex, int endIndex)
public class StringBuilderTest {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
String sub = sb.substring(2, 3);
System.out.println(sub); //3 출력
}
}
Java
복사
•
예제) 문자열을 입력받아 한 글자씩 회전시켜 모두 출력하는 프로그램을 작성하라. ([Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.)
문자열을 입력하세요. 빈칸이 있어도 되고 영어 한글 모두 됩니다.
I Love you
Love youI
Love youI
ove youI L
ve youI Lo
e youI Lov
youI Love
youI Love
ouI Love y
uI Love yo
I Love you
Plain Text
복사
code
Math 클래스
•
Math 클래스는 지수나 로그, 제곱근, 삼각함수와 같은 기본적인 수치 연산을 위한 메서드들을 제공한다.
public static void main(String[] args) {
double radian45 = Math.toRadians(45); //라디안으로 변환
System.out.println("sin 45 = " + Math.sin(radian45)); //삼각함수
System.out.println("cos 45 = " + Math.cos(radian45));
System.out.println("tan 45 = " + Math.tan(radian45));
System.out.println("2 ^ 16 = " + Math.pow(2, 16)); //제곱근
System.out.println("log 25 = " + Math.log(25)); //로그
int num = (int) (Math.random() * 100 + 1);
System.out.println(num);
}
Java
복사
Calendar 클래스
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
System.out.println(year + "." + month + "." + date);
int hour12 = c.get(Calendar.HOUR);
int hour24 = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println(hour12 + " : " + minute + " : " + second);
System.out.println(hour24 + " : " + minute + " : " + second);
int milliSecond = c.get(Calendar.MILLISECOND);
int timeZone = c.get(Calendar.ZONE_OFFSET);
int lastDay = c.getActualMaximum(Calendar.DATE);
}
Java
복사
•
예제) Calendar 객체를 생성하면 현재 시간을 알 수 있다. 프로그램을 실행한 현재 시간이 4시에서 낮 12시 이전이면 “Good Morning”을, 오후 6시 이전이면 “Good Afternoon”을, 밤 10시 이전이면 “Good Evening”을, 그 이후는 “Good Night”을 출력하는 프로그램을 작성하라.
현재 시간은 10시 22분입니다.
Good Morning
Plain Text
복사
code
Wrapper 클래스
wrapper 클래스 개념
•
자바는 기본 타입 값을 갖는 객체를 생성할 수 있다. 이런 객체를 포장(Wrapper) 객체라고 한다.
•
제네릭을 선언할 때 사용한다.
wrapper의 종류
boxing vs unboxing
•
boxing
◦
기본 타입의 값을 포장 객체로 만드는 과정을 말한다.
◦
Integer obj = new Integer(100);
◦
Integer obj = 100; (자동 박싱)
•
unboxing
◦
포장 객체에서 기본 타입의 갑을 얻어내는 과정을 말한다.
◦
int num = obj.intValue();
◦
int num = obj; (자동 언박싱)
예제) boxing vs unboxing
문자열을 기본 타입 값으로 변환
•
문자열을 기본 타입 값으로 변환할 상황이 있다.
•
parse+기본타입 명으로 되어 있는 static 메소드가 문자열을 매개값으로 받아 기본 타입 값으로 변환한다.
•
int num = Integer.parseInt("100");
Integer 클래스, BigInteger 클래스의 다양한 활용 예제
예제) Integer 클래스, BigInteger 클래스의 활용 예제
Generic
개요
•
자바 1.5 버전부터 도입됨 (@ 애노테이션, enum 등과 같이)
•
소프트웨어적 해결이 아닌, 문법을 도입한 것
•
컴파일 시 타입 체크를 해주는 기능을 제공 > 즉, 타입이 이미 결정되어짐
•
예시
// 지네릭 사용 전
class Apple{
@Override
public String toString() {
return "나는 사과입니다.";
}
}
class Orange{
@Override
public String toString() {
return "나는 오렌지 입니다.";
}
}
class Box{
private Object obj;
public void set(Object obj) {
this.obj = obj;
}
public Object get() {
return obj;
}
}
////////////////
Box aBox = new Box();
Box oBox = new Box();
aBox.set(new Apple());
oBox.set(new Orange());
// 문제점 1.
// 형변환 과정이 반복되면 프로그래머의 실수가 컴파일 과정에서 발견되지 않을 가능성이 높아진다.
Apple ap = (Apple) aBox.get(); //형변환 과정이 반드시 필요함
Orange og = (Orange) oBox.get();////형변환 과정이 반드시 필요함
System.out.println(ap);
System.out.println(og);
}
}
Java
복사
// 지네릭 사용 전 문제점 2.
// 실수가 프로그램 실행 과정에서도 발견되지 않을 수 있다.
public static void main(String[] args) {
Box aBox = new Box();
Box oBox = new Box();
// 다음 두 문장은 프로그래머의 실수이다!
aBox.set("Apple");
oBox.set("Orange");
System.out.println(aBox.get());
System.out.println(oBox.get());
}
Java
복사
제네릭 기반의 클래스 정의 > 인스턴스 생성
1.
인스턴스 생성 시 결정되는 자료형의 정보를 T로 대체
2.
T를 Apple, Orange로 결정하여 인스턴스 생성
// 제네릭 이후의 코드
public static void main(String[] args) {
Box<Apple> aBox = new Box<Apple>(); // T를 Apple로 결정
Box<Orange> oBox = new Box<Orange>(); // T를 Orange로 결정
aBox.set(new Apple()); // 사과를 상자에 담는다.
oBox.set(new Orange()); // 오렌지를 상자에 담는다.
Apple ap = aBox.get(); // 사과를 꺼내는데 형 변환 하지 않는다.
Orange og = oBox.get(); // 오렌지를 꺼내는데 형 변환 하지 않는다.
System.out.println(ap);
System.out.println(og);
}
Java
복사
제네릭스의 용어
•
Box<T> : 제네릭 클래스. ‘T의 Box’ 또는 ‘T Box’라고 읽음
•
T : 타입 변수 또는 타입 매개변수 (T는 타입 문자)
•
Box : 원시 타입(raw type), 일반 클래스일 때 타입
제네릭 클래스의 제한
•
타입 인자 제한
class Box<T extends Number>{...}
Java
복사
•
인스턴스 생성 시 타입 인자로 Number or 이를 상속한 클래스만 올 수 있음
•
타입 인자 제한의 효과
◦
number 안에 intValue 함수를 기본적으로 내부에서 사용하기를 원함 > 타입 제한을 미리 걸어버리는 것
제네릭 메소드
•
클래스 전부가 아닌 메소드 하나에 대해 제네릭으로 정의
⇒ 메서드의 선언부에 제네릭 타입이 선언된 메소드
class BoxFactory {
public static <T> Box<T> makeBox(T o) {
Box<T> box = new Box<T>(); // 상자를 생성하고,
box.set(o); // 전달된 인스턴스를 상자에 담아서,
return box; // 상자를 반환한다.
}
}
// 제네릭 메소드의 T는 메소드 호출시점에 결정됨
Box<String> sBox = BoxFactory.<String>makeBox("Sweet");
Box<Double> dBox = BoxFactory.<Double>makeBox(7.59); // 7.59에 대해 오토 박싱 진행됨
// 다음과 같이 타입 인자 생략 가능
Box<String> sBox = BoxFactory.makeBox("Sweet");
Box<Double> dBox = BoxFactory.makeBox(7.59); // 7.59에 대해 오토 박싱 진행됨
Java
복사
제네릭 메소드의 제한된 타입 매개변수 선언
// <T extends Number>는 타입 인자를 Number를 상속하는 클래스로 제한함을 의미
public static <T extends Number> Box<T> makeBox(T o) {
....
// 타입 인자 제한으로 intValue 호출 가능
System.out.println("Boxed data: " + o.intValue());
return box;
}
// 타입 인자를 Number를 상속하는 클래스로 제한
public static <T extends Number> T openBox(Box<T> box) {
// 타입 인자 제한으로 intValue 호출 가능
System.out.println("Unboxed data: " + box.get().intValue());
return box.get();
}
Java
복사