//////
Search

StringBuffer, Wrapper 클래스, Generic by 곽철민

태그
2022/09/30 08:03
사람
최종 편집 일시
2022/09/30 09:00

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
복사