지금까지 C,C++,Python 만 주구장창 이용해왔었고, 코딩문제도 C++ 로 풀곤 하였었는데,
이제 자바 기반의 프로그램을 할 것이기 때문에 자바와 친해지고 코딩문제도 자바로 푸는 것이
도움이 될 것이라고 생각해서 자바 언어를 다시 공부한다.
String 클래스에 대해.
String str1=new String("abc");
String str2=new String("abc");
str1.equals(str2) ==> 같다.
String str1="wow";
String str2="wow"; 같은 인스턴스를 참조한다. 위의 new 는 그렇지 않다.
String str1="Coffee";
String str2="Bread";
String str3=str1.concat(str2);
str3 ==> CoffeeBread
String str4="Fresh".concat(str3);
str4 ==> FreshCoffeeBread
Concat 은 붙여준다.
System.out.println("funny"+"camp");
이거는 System.out.println("funny".concat("camp")); 으로 자동 변환된다.
String str ="01234567";
str.substring(2); ==> 234567
String str="01234567";
str.substring(2,6); ==> 2345
String str="my house";
str.equals("my house"); 도 있지만 더 자세히는
String str1="Lexicographically";
String str2="lexicographically";
int cmp=str1.compareTo(str2);
if cmp==0 일치
cmp<0 사전의 앞에 위치하는 문자는 str1
cmp>0 사전의 앞에 위치하는 문자는 str2
대소문자를 신경안쓰고 할 떄에는
str1.compareToIgnoreCase(str2)
기본 자료형의 값을 문자열로 바꿀때에는
double e=2.71;
String se=String.valueOf(e); 를 사용한다.
String str="age:" +17 ; 은 밑에와 같이 변환이 된다.
String str="age:" + String.valueOf(17); 를 사용하면 해결된다. 또는 "age:".concat(String.valueOf(17));
하지만 이는 기본 자료형의 값을 문자열로 변환하는 과정을 거치는 것인데 이게 길어지면 여러 번 거쳐야하고 이는 성능에 영향을 미친다. 그리고 concat 메소드는 호출될 때마다 새로운 String 인스턴스를 생성하게 되므로 더욱 성능에 영향을 미친다. 이를 위해 StringBuilder 클래스를 이용하는데 위의 내용을
String str=(new StringBuilder("age:").append(17)); 으로 처리하게되고 기본 자료형의 값 변환도 필요가 없고 String 인스턴스를 생성하지도 않는다.
StringBuilder 클래스는 내부적으로 문자열을 저장하기 위해 메모리 공간을 지닌다.
그리고 메모리 공간은 String 클래스의 메모리 공간과 달리 문자를 추가하거나 삭제하는 것이 가능하다.
따라서 수정하면서 유지해야 할 문자열이 있다면 이 클래스에 그 내용을 담아서 관리하는 것이 효율적이다.
append, delete, insert, replace, reverse, substring, toString 이 있다.
StringBuilder stbuf=new StringBuilder("123");
stbuf.append(45678);
System.out.println(stbuf.toString()); ==> 12345678
stbuf.delete(0,2);
System.out.println(stbuf.toString()); ==> 345678
stbuf.replace(0,3,"AB");
System.out.println(stbuf.toString()); ==> AB678
stbuf.reverse();
System.out.println(stbuf.toString()); ==> 876BA
String sub=stbuf.substring(2,4);
System.out.println(sub); ==> 6B
StringBuilder 인스턴스 내부에는 문자열 관리를 위한 메모리 공간이 존재하는데, 이 공간의 크기를 인스턴스 생성 과정에서 다음과 같이 지정해 줄 수 있다.
StringBuilder stbuf=new StringBuilder(64); => 생성자의 인자로 전달된 숫자의 크기만큼 문자를 저장할 공간 마련
StringBuilder 인스턴스는 메모리 공간을 스스로 관리한다. 즉 부족하면 그 공간을 늘린다. 그러나 이는 소모가 많은 작업이다. 따라서 사용 계획에 따라 적절한 크기를 초기에 만들면 그만큼의 성능 향상을 기대할 수 있다.
StringBuilder의 생성자는 다음과 같이 정의되어 있다.
public StringBuilder(int capacity) -> capacity 개의 문자를 저장할 수 있는 메모리 공간 확보
public StringBuilder(String str) -> 전달되는 문자열과 16개의 문자를 저장할 수 있는 메모리 공간 확보
재밌는 것은
StringBuilder stb1 = new StringBuilder("123");
StringBuilder stb2 = stb1.append(45678);
stb2.delete(0,2);
을 하고 stb1 값과 stb2 값을 비교해보면 동일하게 345678 이 나오고
stb1==stb2 는 참이라는 결과가 나온다. append를 하면서 stb1의 참조 값을 반환하기 때문이다.
즉 같은 인스턴스를 참조하고 있다는 뜻이다.
고로 위에서 String str1="age:"+17 도 따지고보면 new StringBuilder를 이용하여 append 해나가는 과정이라고 볼 수 있겠다.
ㅡㅡㅡ
Scanner
int nextInt()
byte nextByte()
String nextLine()/next() (next()는 공백만나면 끊어버림 nextLine은 쭉 간다. char 받으려면 string 으로 받아서 charAt() 을 사용하도록 하자)
double nextDouble()
boolean nextBoolean()
ㅡㅡㅡ
int [] box=new int[5];
box.length => 5
int [] arr=new int[3];
int [] arr=new int[] {1,2,3};
int [] arr= {1,2,3};
static int[] makeNewIntAry(int len){
int [] ar=new int[len];
return ar;
} 도 가능
배열이 생성되면 모든 요소는 0 또는 null로 초기화된다.
java.util.Arrays 클래스에
public static void fill(int [] a, int val) -> val 값으로 배열 초기화
public static void fill(int [] a, int fromIndex, int toIndex, int val)
-> 인덱스 fromIndex 부터 toIndex-1 까지 val 값으로 초기화
java.lang.System 클래스에
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
-> 복사 원본의 위치 : 배열 src의 인덱스 srcPos
-> 복사 대상의 위치 : 배열 dest의 인덱스 destPos
-> 복사할 요소의 수 : length
int [] ar1=new int[10];
int [] ar2=new int[10];
Arrays.fill(ar1,3);
System.arraycopy(ar1,0,ar2,3,3);
하면 ar2는 0003330000 이 나온다.
만약 범위가 이상이 있다면 exception이 나오게 된다.
enhanced for
int [] ar={1,2,3};
for(int e : ar){
System.out.println(e);
} 로 간략히 표현 가능하다.
여기서
for(int e:ar){
e=ar[2];
System.out.print(e+" ");
} 는 ar[2] 가 ar 의 length 만큼 반복되게 될 것이다.
ㅡㅡㅡ
C++ 에서는 vector를 사용하였지만, 자바에서는 ArrayList를 사용하는 것이 더 효율적이라고 한다.
import java.util.ArrayList;
.add 로 추가한다.
.add(1,6)은 1의 위치에 6을 삽입한다.
0 1 2 에서 0 6 1 2 가 되게된다.
arraylist2 는 6 5 에서 뒤에 arraylist가 붙어서 6 5 0 6 1 2가 되게된다.
.remove(인덱스위치) 를 통해 해당 인덱스 위치의 값을 제거해 줄 수 있다.
범위에 해당하는 값을 list로 받아올 수도 있는데,
List<Integer> list=arraylist.subList(1,4); 1~3 값을 list에다가 넣어줬다.
가지고 올 때에는 arraylist.get(인덱스 값) 을 사용한다.
수정은 arraylist.set(인덱스 값, 수정 값) 을 사용한다.
boolean isFind=arraylist.contains(value) 을 통해 arraylist 안에 value의 포함 유무를 알 수 있다.
int index=arraylist.indexOf(value) 를 통해 arraylist 안에 value의 index 위치를 알 수 있다.
.clear() 를 통해 전체 삭제와 .isEmpty() 를 통해 비어있는지를 확인할 수 있다.
ㅡㅡㅡ
set 사용법
set은 list와는 다르게 중복을 허용하지 않는다.
HashSet
Set<e> set=new HashSet<>();
데이터 중복저장 X, 순서 보장 X
TreeSet
Set<e> set=new TreeSet<>();
데이터 중복저장 X, 순서 오름차순
LinkedHashSet
Set<e> set=new LinkedHashSet<>();
데이터 중복저장 X, 순서 보장 O
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
와 같은 방법으로 접근한다.
set.add(value) 로 추가
.remove, .contains 등 명령어들이 list와 거의 똑같다.
ㅡㅡㅡ
map 사용법
map은 hashmap, linkehashmap, treemap 이 있다.
HashMap<String, String> map = new HashMap<String, String>();
map.put("people", "사람");
map.put("baseball", "야구");
System.out.println(map.get("people")); 다음을 통해 value를 얻을 수 있다.
System.out.println(map.containsKey("people")); key 존재여부를 확인한다. boolean 값으로 return 한다.
System.out.println(map.containsValue("baseball")); value 존재여부를 확인한다.
System.out.println(map.remove("people")); 삭제 후 그 value 값을 return 한다.
System.out.println(map.size()); map의 갯수를 return 한다.
.isEmpty() 비어있는지 여부 확인
Iterator<String> keys = map.keySet().iterator();
while(keys.hasNext()){
String keys=kesy.next();
System.out.println("key : %s , value : %s",keys,map.get(keys));
} 를 통해 표현 가능하다.
'Java' 카테고리의 다른 글
Java String 메서드 정리 (계속해서 추가) (0) | 2020.08.25 |
---|---|
Java 우선순위 큐, Priority Queue (0) | 2020.08.21 |
Java 형변환 정리 (0) | 2020.08.19 |
Set 에 대하여 (0) | 2020.08.18 |
Java 조합과 순열 (0) | 2020.08.18 |