//////
Search

220930

숙제 (참고)
배열 복사 메소드
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
복사