숙제 (참고)
•
배열 복사 메소드
◦
System.arraycopy ( 기존배열, 복사시작위치, 새 배열, 붙여넣기 시작 위치, 붙여넣을개수 )
수업
StringBuilder 와 StringBuffer 클래스
•
String 객체는 “+”연산을 할 때마다 새로운 객체를 생성함 = 원본 보존(immutable)
String s1 = "Hello";
String s2 = "World";
String s3 = s1 + s2 ; // 문자열 간의 + 연산. 문자열을 연결함.
s3 = s1.concat(s2); // 문자열 간의 + 연산하면, 실제로 실행되는 것.
System.out.println(s3);
s3 = s1 + 1; //문자열과 숫자 간의 + 연산. 숫자 1이 문자열로 변한 뒤 + 됨.
System.out.println(s3); // 숫자만 아니라 다른 타입도 마찬가지.
String s4 = "hello" + "world" + "and" + "java";
// + 연산 할때마다 객체 생성을 해버림.
// helloworld 객체, helloworldand 객체, helloworldandjava 객체
// 이것 때문에 발생하는 문제.
for ( int i = 0 ; i < 100000 ; i++) {
s4 = "hello" + i;
}
// 10만개의 객체를 만든 뒤, hello100000 객체만을 사용. 나머진 버림. -> 비효율
Java
복사
•
String 객체는 final 키워드가 사용되어 상수처리 되어있음 = 문자열의 내용을 변경하기 위해서는 새로운 객체를 생성하여 기존 내용을 복사한 뒤, 새로운 내용을 추가하는 방식으로 처리.
•
이런 과정의 메모리 낭비를 막기위해 StringBuilder 와 StringBuffer 클래스가 사용됨. ( 두 클래스는 멀티 스레드 적용 여부의 차이만 있음)
StringBuilder sb = new StringBuilder("123"); // 문자열 객체 생성
System.out.println(sb); // 123
sb.append(4567); // 객체 안에서 문자열 더하기
System.out.println(sb); // 1234567
sb.delete(0,2); // 객체 안에서 문자열 삭제. 0번 인덱스 부터, 2개를 지워라.
System.out.println(sb); // 34567
sb.replace(0, 3, "AB"); // 객체 안에서 문자열 교체. 0번 인덱스 부터 3번째 문자를 "AB"로교체
System.out.println(sb); // AB67
sb.reverse(); // 문자열 뒤집기
System.out.println(sb); // 76BA
// 그냥 String 객체에서 활용 가능한 substring 메소드
String sub = sb.substring(2,4); // 문자열 빼내기. 인덱스 2~4를 뽑아냄.
System.out.println(sub); // BA
sub = sb.substring(1); // 인덱스 1 이후 모두를 빼냄.
System.out.println(sub); // 6BA
Java
복사
•
String 배열 index를 쉽게 이해해보자~
Math 클래스
•
다양한 수학적 연산을 지원하는 클래스.
// 다양한 수학 연산 가능
System.out.println("싸인 45 : " + Math.sin(45));
System.out.println("2의 16승 : " + Math.pow(2, 16));
System.out.println("로그 25 : " + Math.log(25));
System.out.println("원주율 : " + Math.PI);
// 랜덤 숫자 뽑기!
int num = (int) (Math.random() * 100)+1;
System.out.println("랜덤 숫자 : " + num);
Java
복사
Calendar 클래스
•
날짜와 관련된 메소드를 지원하는 클래스
// 캘린더의 객체 생성은 getInstance() 메소드를 통해서! new Calendar() 는 불가능.
Calendar now = Calendar.getInstance();
// 현재 시각에 대한 모든 정보가 한 꺼번에 출력됨.
System.out.println(now);
// "객체.get(Calendar.정보명)" 를 사용해 필요한 정보 가져오기.
int year = now.get(Calendar.YEAR);
int month = now.get(Calendar.MONTH )+1;
int date = now.get(Calendar.DATE);
System.out.println(year + ":" + month + ":" + date);
int hour12 = now.get(Calendar.HOUR);
int hour24 = now.get(Calendar.HOUR_OF_DAY);
int min = now.get(Calendar.MINUTE);
int sec = now.get(Calendar.SECOND);
int milisec = now.get(Calendar.MILLISECOND);
System.out.println(hour12 + ":" + hour24 + ":" + min + ":" + sec + ":" + milisec);
// 어떤 기준 시(타임존)에 속해있는지.
int timeZone = now.get(Calendar.ZONE_OFFSET);
// 이번 달의 마지막 날.
int lastDay = now.getActualMaximum(Calendar.DATE);
System.out.println(timeZone + ":" + lastDay);
Java
복사
Wrapper 클래스
•
기본형 타입(byte, char, short, int, long, float, double, boolean)을 감쌀 수 있는 클래스
•
기본형 자료들을 객체로 다루기 위해서 사용 된다.
•
Boxing과 Unboxing
◦
Boxing : 기본형 타입을 래퍼 클래스에 넣는것
◦
Unboxing : 래퍼 클래스에서 기본형 을 빼내는 것
Integer n1 = Integer.valueOf(5);
Integer n2 = Integer.valueOf("1234");
// Integer = Wrapper Class
// Integer 클래스 안에는 "private final int value" 라는 int타입(기본형) 변수 선언이 되어 있음.
// 즉, Integer 클래스 안에 int타입 변수를 넣은 뒤, Integer 클래스의 다양한 메소드를 통해 활용 가능.
// Boxing과 Unboxing
Integer n3 = 5; // Boxing
int num1 = n3; // Unboxing
// 최선 버전의 자바는 자동으로 Boxing과 Unboxing 기능을 지원.
Java
복사
•
Wrapper 클래스, Integer의 메소드.
Integer n1 = Integer.valueOf(5);
Integer n2 = Integer.valueOf("1234"); // 가장 빈번히 사용 : 문자열을 숫자로 저장하기 위해.
// Integer 클래스가 지닌 간단한 메소드들.
System.out.println("둘 중 큰 수 : " + Integer.max(n1,n2));
System.out.println("둘 중 작은 수 : " + Integer.min(n1,n2));
System.out.println("두 수의 합 : " + Integer.sum(n1,n2));
System.out.println("2진수 표현 : "+ Integer.toBinaryString(12));
System.out.println("8진수 표현 : "+ Integer.toOctalString(12));
System.out.println("16진수 표현 : "+ Integer.toHexString(12));
System.out.println("정수의 최대값 : " + Integer.MAX_VALUE);
System.out.println("정수의 최소값 : " + Integer.MIN_VALUE);
// 9천경(Long형으로도 표현 불가)이 넘어가는 정수는..?
// BigInteger 클래스 사용.
BigInteger big1 = new BigInteger("10000000000000000000000");
BigInteger big2 = new BigInteger("-9999999999999999999999");
// BigInteger 클래스는 단순한 연산기호 사용 X
BigInteger result = big1.add(big2);
System.out.println("BigInteger 결과 : " + result);
result = big1.multiply(big2);
System.out.println("BigInteger 결과 : " + result);
Java
복사
Generic
•
상속을 통한 다형성의 활용에서 발생하는 문제를 해결하기 위해 생겨난 문법.
•
Generic 등장 이전의 코드
class Apple {
@Override
public String toString() {
return"나는 사과";
}
}
class Orange {
@Override
public String toString() {
return"나는 오랜지";
}
}
class Box {
private Object obj;
// 매개변수로 모든 객체를 받기 위해서 Object 클래스 사용.
public void set (Object obj) {
this.obj = obj;
}
public Object get() {
return this.obj;
}
}
public class Generic1 {
public static void main(String[] args) {
Box aBox = new Box();
Box oBox = new Box();
aBox.set(new Apple());
oBox.set(new Orange());
// set() 메소드에 Apple객체와 Orange객체가 들어갈 때, Object 클래스로 업캐스팅 됨.
Apple ap = (Apple) aBox.get();
Orange og = (Orange) oBox.get();
// 다시 자기 자신의 타입으로 꺼내려면, 다운 캐스팅 해야함.
// 즉, Generic 없이 다형성을 활용하기 위해서는 형변환 과정이 필수적임.
// 이는 컴파일러가 오류를 발견할 가능성을 낮추는 결과를 가져옴
// 오류의 예 (test 과정에서 발견 가능)
aBox.set("Apple");
oBox.set("Orange");
// set()은 Object를 매개변수로 작성함.
// 즉, 개발 의도와는 다른 객체도 대입이 가능함.
// Stirng 객체가 들어갔기 때문에, Apple과 Orange 클래스 타입으로 다운 캐스팅이 불가능(오류 발생)
Apple ap1 = (Apple) aBox.get();
Orange og1 = (Orange) oBox.get();
// 출력 test 과정에 와서야 명시적으로 오류가 드러남.
System.out.println(ap1);
System.out.println(og1);
// 오류의 예2 (test 과정에서도 발견하기 힘듬)
aBox.set("Apple");
oBox.set("Orange");
// 잘못된 객체 사용.
System.out.println(aBox.get());
System.out.println(oBox.get());
// 잘못된 객체를 사용 했음에도, 정상적으로 Apple과 Orange가 출력 됨.
// 코드에 오류가 있음에도 발견되지 않아 버림.
// 이러한 Object 클래스의 다형성 활용 문제를 해결하기 위해 제네릭 문법 사용.
}
}
Java
복사
•
Generic 문법을 사용한 코드
class Apple1 {
@Override
public String toString() {
return"나는 사과";
}
}
class Orange1 {
@Override
public String toString() {
return"나는 오랜지";
}
}
// Generic 문법을 적용한 Box1 클래스.
// 타입 매개변수 T를 사용해, Box1 각 객체마다 매개변수의 타입을 세분화 설정 할 수 있음.
// 즉, Box1 안에 다양한 객체를 넣고 빼는데 형변환이 필요 없어짐.
class Box1<T> {
private T obj;
public void set (T obj) {
this.obj = obj;
}
public T get() {
return this.obj;
}
}
public class Generic2 {
public static void main(String[] args) {
//제네릭 문법 사용
// 타입 매개변수 Apple에 의해, aBox에는 Apple 타입만 매개변수로 사용가능.
Box1<Apple> aBox = new Box1<>();
Box1<Orange> oBox = new Box1<>();
// Apple 타입 매개변수에 Apple타입 객체를 넣으므로 형변환 불필요.
aBox.set(new Apple());
oBox.set(new Orange());
// aBox.set("apple");
// <Apple>로 매개변수 타입을 결정했기 때문에, 바로 컴파일러가 오류를 잡아줌.
// 대입 과정에서 형변환이 없었으니, 꺼낼 때도 형변환 불필요.
Apple ap = aBox.get();
Orange og = oBox.get();
System.out.println(ap);
System.out.println(og);
}
}
Java
복사
•
상속을 사용해 세분화 된 Generic 문법 활용이 가능함.
// 타입 매개변수 T를 상속으로 제한 함.
// Number를 상속한 클래스만 타입 매개변수로 사용 가능.
class Box2<T extends Number> {
private T obj;
public void set (T obj) {
this.obj = obj;
}
public T get() {
return this.obj;
}
}
public class Generic3 {
public static void main(String[] args) {
Box2<Integer> iBox = new Box2<>(); // Integer는 Number를 상속한 하위 클래스.
iBox.set(24);
System.out.println(iBox.get());
Box2<Apple> aBox = new Box2<>(); // Apple은 Number를 상속하지 않기에, 오류 발생
// 타입 인자를 제한 하는 이유!
// 공통으로 상속한 상위 클래스의 메소드를 사용하기 위해서!
// class box<T>(){
// private t obj;
// System.out.println(obj.intValue);
// }
// .intValue를 사용하려면 Number 클래스를 상속받은 클래스들만 타입매개변수로 와야함
}
}
Java
복사
•
Generic 메소드 : 클래스가 아닌, 하나의 메소드에 generic을 활용한 것.
class Box3<T> {
private T ob;
public void set(T o) {
ob = o;
}
public T get() {
return ob;
}
}
// Generic 메소드를 활용한 클래스.
class BoxFactory {
public static <T> Box3<T> makeBox(T o) { // Generic 메소드
Box3<T> box = new Box3<T>();
box.set(o);
return box;
}
}
class GenericMethodBoxMaker {
public static void main(String[] args) {
// 메소드를 호출할 때 타입 매개변수도 선언
Box3<String> sBox = BoxFactory.<String>makeBox("Sweet");
System.out.println(sBox.get());
// 선언할 타입 매개변수가 같다면, 뒤에는 생략 가능.
Box3<Double> dBox = BoxFactory.makeBox(7.59);
System.out.println(dBox.get());
}
}
Java
복사