posted by changhozz 2012. 7. 26. 17:12

 

   String 

  substring (int beginIndex) ㅡ> 시작 인덱스부터 끝인덱스 내용까지 반환.

   String

  substring (int beginindex , int endindex) ㅡ> 시작 인덱스부터 내가 정한 마지막 인덱스 전까지 반환.    고로 뒤에 파라미터는 원하는 개수임.

  boolean 

  contains(CharSequence s)  ㅡ> 특정 문자하나를 갖고있나 확인한다.  "d"

String 형 넣어줘야함.

  String  replace(char oldChar, char newChar) ㅡ>문자하나를 원하는 문자하나로 바꾼다.

  String

 replaceAll(String regex, String replacement) ㅡ> 내가 지정한 정규식에 걸리는 문자들을
모두 replacement에 들어간 문자로 바꾼다.

   
   
   
   
   

'JAVA > 여러가지 메서드' 카테고리의 다른 글

IndexOf , Substring  (0) 2012.07.20
기본형 ㅡ>문자열 , 문자열 ㅡ>기본형  (0) 2012.07.20
int를 String으로 parse  (0) 2012.07.20
Collection  (0) 2012.07.17
랜덤  (0) 2012.07.11
posted by changhozz 2012. 7. 20. 16:15

String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능하다. 내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.

이때, 편집할 문자열의 크기를 고려하여 버퍼의 크기를 충분히 잡아주는 것이 좋다. 편집 중인 문자열이 버퍼의 크기를 넘어서게 되면 버퍼의 크기를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어진다.

StringBuffer클래스는 String클래스와 유사한 점이 많다.
StringBuffer클래스는 String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를
인스턴스변수로 선언해 놓고 있다. StringBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.

 

-----------------------StringBuffer클래스의 생성자------------------------

StringBuffer클래스의 인스턴스를 생성할 때, 적절한 크기의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
StringBuffer인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장될 문자열의 크기를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.
StringBuffer인스턴스를 생성할 때 , 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.

public StringBuffer(int length){
value = new char[length];
}

public StringBuffer(){
this(16);
}                                //버퍼의 크기를 지정하지 않으면 버퍼의 크기는 16이 된다.

public StringBuffer(String str){
this(str.length() +16);
append(str);               //지정한 문자열의 길이보다 16이 더 크게 버퍼를 생성한다.
}

StringBuffer인스턴스로 문자열을 다루는 작업을 할 때, 버퍼의 크기가 작업하려는 문자열의 크기보다 작을 때는 내부적으로 버퍼의 크기를 증가시키는 작업이 수행된다.
배열의 크기는 변경될 수 없으므로 새로운 크기의 배열을 생성한 후에 이전 배열의 값을 복사한다.

 

 

-----------------------------StringBuffer인스턴스의 비교------------------------------------

String클래스에서는 equals메서드를 오버라이딩해서 문자열의 내용을 비교하도록 구현되어 있지만,
StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서  StringBuffer클래스의  equals메서드를
사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
반면에 toString()은 오버라이딩되어 있어서 StringBuffer인스턴스에 toString()을 호출하면,
담고있는 문자열을 String으로 반환한다.
그래서 StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에
toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야한다.

'JAVA > JAVA 공부' 카테고리의 다른 글

String클래스의 특징  (0) 2012.07.20
java.lang 패키지  (0) 2012.07.20
참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
posted by changhozz 2012. 7. 20. 14:32

public class StringEx {
public static void main (String [] args){
 
 String fullname = "Hello.java";
 int index = fullname.indexOf(".");   // "." 이 있는 index번호를 리턴함.  indexOf
 String filename = fullname.substring(0,index); //몇번째부터 몇번째까지 내용을 리턴함.  substring
 System.out.println(filename);
 String ext = fullname.substring(index+1,fullname.length());   
 String ext1 = fullname.substring(index+1);  //하나만 지정해주면 여기서부터 끝까지 출력.
 System.out.println(ext);
 System.out.println(ext1);
 
 
 
}
}
결과 :

Hello
java
java

'JAVA > 여러가지 메서드' 카테고리의 다른 글

String 클래스들.  (0) 2012.07.26
기본형 ㅡ>문자열 , 문자열 ㅡ>기본형  (0) 2012.07.20
int를 String으로 parse  (0) 2012.07.20
Collection  (0) 2012.07.17
랜덤  (0) 2012.07.11
posted by changhozz 2012. 7. 20. 14:10

 

기본형 ㅡ> 문자열 

문자열 ㅡ> 기본형 

String valueOf(boolean b) 

boolean  Boolean.getBoolean(String s) 

 String valueOf(char c)

 

 String valueOf(int i)

 Integer.parseInt(String s)

 String valueOf(long l)

 Long.parseLong(String s)

 String valueOf(float f)

 Float.parseFloat(String s)

 String valueOf(double d)

 Double.parseDouble(String s)

 

 Byte.parseByte(Sting s)

 

* raidx = 진법

[참고] Integer클래스의 static int parseInt(String s, int radix)를 사용하면 16진수 값으로 표현된 문자열도
변환할 수 있기 때문에 대소문자 구별없이 a,b,c,d,e,f도 사용할 수 있다. int result = Integer.parseInt("a",16);의 경우 result에는 정수값 10이 저장된다. (16진수 a는 10진수로는 10을 뜻한다.)

 

 

'JAVA > 여러가지 메서드' 카테고리의 다른 글

String 클래스들.  (0) 2012.07.26
IndexOf , Substring  (0) 2012.07.20
int를 String으로 parse  (0) 2012.07.20
Collection  (0) 2012.07.17
랜덤  (0) 2012.07.11
posted by changhozz 2012. 7. 20. 14:03

int를 String으로 변환하는 두가지 방법!!.

첫번째!!

int value = 100;

String strValue = String.valueOf(value);       //int를 String형으로 변환.

두번째!!

int value2 = 100;

String strValue2 = value2 + "";       //int를 String으로 변환하는 또다른 방법!

[참고] 참조변수에 String을 더하면, 참조변수가 가리키고 있는 인스턴스의
toString()을 호출하여 String을 얻은 다음 결합한다.

'JAVA > 여러가지 메서드' 카테고리의 다른 글

IndexOf , Substring  (0) 2012.07.20
기본형 ㅡ>문자열 , 문자열 ㅡ>기본형  (0) 2012.07.20
Collection  (0) 2012.07.17
랜덤  (0) 2012.07.11
string을 int로 parse  (0) 2012.05.31
posted by changhozz 2012. 7. 20. 13:59

String클래스에는 문자열을 저장하기 위해서 문자형 배열 변수 (char[]) value를 인스턴스변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char [])로 저장되는 것이다.

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.
예를 들어 "a" + "b"와 같이 +연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")이 담긴 String인스턴스가 생성되는 것이다.

---------------------------------------중요-----------------------------------------------

문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.

문자열 리터럴을 지정하는 방법 ㅡ> String str1 = "abc" ;     String str2 = "abc";

String클래스의 생성자를 사용해서 만드는 방법 ㅡ>String str3 = new String("abc");   
                                                                         String str4 = new String("abc");

 

equals(String s)를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우
str1.equals(str2)과 str3.equals(str4)는 모두 true를 갖는다.

하지만 ,각 String인스턴스의 주소값을 등가비교연산자(==)로 비교했을 때는 결과가 다르다.
리터럴로 문자열을 생성했을 경우, 같은 내용의 문자열들은 모두 하나의 String인스턴스를 참조하도록 되어 있다. 어차피 String인스턴스가 저장하고 있는 문자열은 변경할 수 없기 때문에 아무런 문제가 없다.

그러나 String 클래스의 생성사를 이용한 String인스턴스의 경우에는 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다.

 

 

 

이런식으로 문자열 리터럴을 지정한 방법에서 str1 과 str2 변수는 같은 주소 0x100(abc주소)를 가리키고 있기 때문에 str1==str2 경우에도 true가 나오는것이다.

반면 str3과 str4는 각각 new 연산자로 인해 새로운 메모리가 각각 할당되게 되는것이다. 

 

  

 

 

'JAVA > JAVA 공부' 카테고리의 다른 글

StringBuffer클래스  (0) 2012.07.20
java.lang 패키지  (0) 2012.07.20
참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
posted by changhozz 2012. 7. 20. 12:54


1)equals 메서드.
내가 알고있던 equals메서드는
객체의 주소를 비교하는 것이아니라, 변수의 값 자체를 비교하는 것으로 알고있었는데,
그것은 String클래스 equals메서드였던것이다.
String클래스의 equals메서드는 Object클래스의 equals메서드를 오버라이딩
했던 것이다. Object클래스의 equals메서드는 객체의 주소를 비교하기 때문에
내가 알던 결과와는 반대가 나오게 된다.
따라서 equals메서드를 상황에 맞게 오버라이딩을 하는데 주의해야될것같다.

2)hashCode메서드
이 메서드는 각 인스턴스의 같고다름을 비교하기 위한 인스턴스 구별 값인
해시코드를 반환한다. 해시코드는 인스턴스의 주소와 관련된 정수값(int)으로 서로 다른
인스턴스는 서로 다른 해시코드값을 가질 것을 보장한다.
그래서 서로 다른 두 인스턴스가 같은 해시코드값을 갖는 경우는 없다.

 

3)toString메서드
원래의 toString메서드(Object클래스의 toString메서드)는 클래스의 이름과 해시코드를 출력하는
메서드이다.그래서 이것을 String클래스와 Date클래스에서 오버라이딩 한것이다.
String클래스의 toString()은 String인스턴스가 갖고 있는 문자열을 반환하도록 오버라이딩되어 있고,
Date클래스의 경우, Date인스턴스가 갖고 있는 날짜와 시간을 문자열로 하여 반환하도록
오버라이딩되어 있다.
이처럼 toString()은 일반적으로 인스턴스나 클래스에 대한 정보 또는 인스턴스 변수들의 값을 문자열로
변환하여 반환하도록 오버라이딩된다.

따라서 내가 쓰던(알던) toString메서드는 String형에서 접근하였기 때문에
문자열을 반환했던것이다. 때문에 다른 Class에서 toString메서드를 사용하려면
Object클래스의 toString메서드가 호출되어 클래스명과 해시코드를 알려주게될거다.
그래서 따로 오버라이딩을 하여 써야되는것이다.

 
String a = "김창호"; String b = "짱";

System.out.println(a+b);      ㅡ> 결과 : 김창호짱

여기서 a.toString() + b.toString() 인데 생략된것뿐.

 

char a ='김'; char b ='형';

 System.out.println(a+b);      ㅡ> 결과 : langpackage.toStringTest@de6ced

이처럼 String형은 toString()을 자동 호출하여 글씨를 이어주는 것이고,

char형은 Object클래스의 toString()을 불러오기때문에 해시코드가 나오는 것이다.

 

 


 

 

'JAVA > JAVA 공부' 카테고리의 다른 글

StringBuffer클래스  (0) 2012.07.20
String클래스의 특징  (0) 2012.07.20
참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
posted by changhozz 2012. 7. 19. 16:41

FileOutputStream에서 바이트 배열에 값을 입력시킨 후
바이트배열 by를 write한 경우이다.

      package fileTest;

import java.io.File;
import java.io.FileOutputStream;


public class FileOutputStreamTest {
public static void main (String [] args) throws Exception{
 byte [] by = new byte[]{'a','b','c'};   // 내가 원하는곳에 쓸 내용을 byte배열에 담는다.
 File directory = new File("d:\\테스트중");       
 File file_name = new File  (directory, "test1.txt");     //여긴 FileIntputStream과 다를게 없다.
 if(!directory.isDirectory()){                 //*중요* 디렉토리가 없을수도 있으므로 없다면 
  directory.mkdir();                              만들어주는 if문을 만든다.
 }
 
 FileOutputStream fos = new FileOutputStream(file_name,true);  
 fos.write(by);
 fos.close();


}
}

--------------------------------String에 담은후 getBytes()메서드 이용 ----------------

package fileTest;

import java.io.File;
import java.io.FileOutputStream;

public class FileOutputStream2 {
public static void main (String [] args)throws Exception{
 
 
 File directory = new File("d:\\테스트중");
 File file_name = new File(directory,"test2.txt");
 if(!directory.isDirectory()){
  directory.mkdir();
 }
 
 FileOutputStream fos = new FileOutputStream(file_name,true);
 String msg = "안녕하세요,김창호입니다.";
 fos.write(msg.getBytes()); //String형 msg를 바이트로 바꾸어 줌.
 fos.close();
}
}

-----------------------BufferedOutputStream 사용!!----------------

package fileTest;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;

public class BufferedOutputStreamTest {
public static void main( String [] args)throws Exception{
 File directory = new File("d:\\테스트중");
 File file_name = new File(directory,"test3.txt");
 if(!directory.isDirectory()){
  directory.mkdir();
 }
  
FileOutputStream fos = new FileOutputStream(file_name,true);
 BufferedOutputStream bos= new BufferedOutputStream(fos);
 String msg = "dfdf안녕하세요,김창호입니다.";
 bos.write(msg.getBytes());
 bos.close();
}
}

 

------------------------------FileWriter--------------------------------

주의사항!!!!   쓰고싶은 메시지를 String형에 담고 write()를 해주기위해
char 배열로 형변환을 해줘야함 그것이 바로 toCharArray();

 

package fileTest;

import java.io.File;
import java.io.FileWriter;

public class FileWriterTest  {
 public static void main(String[] args) throws  Exception {
  File directory = new File("d:\\테스트중");
  File file_name = new File(directory, "test4.txt");
  if (!directory.isDirectory()) {
   directory.mkdir();
  }
  FileWriter fw = new FileWriter(file_name,true);
  String msg = "이야이오";
  
  fw.write(msg.toCharArray());   //이런식으로 toCharArray() 외워라!!
  fw.close();
  
  
 
 }
}

-----------------BufferedWriter도 똑같음!!------------------------------------------

package fileTest;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class BufferedWriterTest {

  public static void main(String[] args) throws  Exception {
   File directory = new File("d:\\테스트중");
   File file_name = new File(directory, "test5.txt");
   if (!directory.isDirectory()) {
    directory.mkdir();
   }
   FileWriter fw = new FileWriter(file_name,true);
   BufferedWriter bw = new BufferedWriter(fw);
   String msg = "이야이오";
   
   bw.write(msg.toCharArray());    //Char배열로 바꿔줘야함.
   bw.close();
   
   
  
  }
 }

 

 

 

 

posted by changhozz 2012. 7. 19. 15:49

(byte 기반)                                     (char 기반)
바이트기반 스트림은                      문자기반 스트림은

FIleInputStream              이고         FileReader
FileOutputStream                           FileWriter                 이다.

즉 InputStream =>  Reader
   OutputStream => writer  로 바뀐것뿐.

보조스트림 또한

BufferedInputStream        이고         BufferedReader
BuffredOutputStream                       BufferedWriter        이다.

 

FileInputStream에서 원하는 파일의 내용을 읽어올때.

public class FileInputStreamTest {
 public static void main(String[] args) throws Exception {
  byte[] by = new byte[100];   //바이트기반이므로 무조건 바이트단위로 읽어오기때문에
                                              //읽어올 내용을 바이트 형으로 담아줄 배열이 필요
  File directory = new File("d:\\"); // 원하는(찾고자하는 파일이있는) 디렉토리를 File객체에 담아줌.
  File file = new File(directory, "cv.txt"); //원하는 파일의 디렉토리와 원하는 파일의 이름을 File객체에 담음
  FileInputStream fis = new FileInputStream(file);   //이제 담은 파일 객체를 읽어올수있도록 스트림 형성.
  System.out.println(fis.read(by));  // read()메서드를 이용하여 파일을 읽어옴.
  
 }
}

read()에는 내용을 담아올 바이트 배열을 넣어줌.

근데 read는 int 형이기 때문에 숫자가 나올거임.

내가 cv.txt쓴글 "안녕해"를 그대로 출력하려면?

public class FileInputStreamTest {
 public static void main(String[] args) throws Exception {
  byte[] by = new byte[100];   //바이트기반이므로 무조건 바이트단위로 읽어오기때문에
                                              //읽어올 내용을 바이트 형으로 담아줄 배열이 필요
  File directory = new File("d:\\");       // 원하는(찾고자하는 파일이있는) 디렉토리를 File객체에 담아줌.
  File file = new File(directory, "cv.txt");   //원하는 파일의 디렉토리와 원하는 파일의 이름을 File객체에 담음
  FileInputStream fis = new FileInputStream(file);   //이제 담은 파일 객체를 읽어올수있도록 스트림 형성.
  fis.read(by);  // 배열 by에 파일 내용을 담았단 뜻.
  System.out.println(new String (by)); //byte는 1byte단위로 끊어 읽어오기때문에 String형으로 캐스팅해줌.(자바에서 한 문자는 2byte임)
fis.close();  //닫는버릇!

 }
}
 

근데 BufferedInputStream을 하면 성능이 좋아지기 땜에 웬만하면 BufferedInputStream을 이용하자
이용방법은 그냥 추가만하면됨

package fileTest;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;

public class BufferedInputStreamTest {

 public static void main (String [] args)throws Exception{
  
  byte [] by = new byte[100];
  File directory = new File ("d:\\");
  File file_name = new File(directory,"cv.txt");
  FileInputStream fis = new FileInputStream(file_name);
  BufferedInputStream bis = new BufferedInputStream(fis);     //FileInputStream의 객체를 넣고
  bis.read(by);    //read를 할때 BufferedInputStream객체를 통해 접근하면 됨.
  System.out.println(new String(by));    //그냥 버퍼가 파일인풋 안고 간다생각하면됨.
  bis.close()  //닫는버릇!
  
 }
}

-------------------------그리고 문자기반 스트림도 똑같음!!!-----------------------------

차이점이라곤 배열을 byte가 아닌 char형으로만해주면됨!!!!!!!!!!!


 package fileTest;

import java.io.File;
import java.io.FileReader;

public class FileReaderTest {
public static void main (String [] args)throws Exception{
 
 char [] ch = new char [100];
 //File directory = new File("d:\\");   //이거 밑에줄로 한번에 쓸수있음.
 File file_name = new File("d:\\","cv.txt");
 FileReader fr = new FileReader(file_name);
 fr.read(ch);
 System.out.println(ch);
fr.close(); //닫는버릇!
}
}

 

-------------------BufferedReader 또한 똑같음--------------------------------

package fileTest;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

public class BufferedReaderTest {
public static void main (String [] args)throws Exception{
 
 char [] ch = new char [100];
 File file_name = new File("d:\\","cv.txt");
 FileReader fr = new FileReader(file_name);
 BufferedReader br = new BufferedReader(fr);
 br.read(ch);
 System.out.println(ch);
 br.close();      //닫는버릇!

}
}

 

 

posted by changhozz 2012. 7. 18. 12:13

HashSet은 Set인터페이스를 구현한 가장 대표적인 컬렉션이며, Set인터페이스의 특징대로 HashSet은 중복된 요소를 저장하지 않는다.

HashSet에 새로운 요소를 추가할 때는 add메서드나 addAll메서드를 사용하는데, 만일 HashSet에 이미 저장되어 있는 요소와 중복된 요소를 추가하고자 한다면 이 메서드들은 false를 반환함으로써 중복된 요소이기 때문에 추가에 실패했다는 것을 알린다.

이러한 HashSet의 특징을 이용하면, 컬렉션 내의 중복된 요소들을 쉽게 제거할 수 있다.

ArrayList와 같이 List인터페이스를 구현한 컬렉션과 달리 HashSet은 저장순서를 유지하지 않으므로 저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.

 

생성자 또는 메서드  

설명 

HashSet() 

HashSet객체를 생성한다. 

HashSet(Collection c) 

주어진 컬렉션을 포함하는 HashSet객체를 생성한다. 

HashSet(int initialCapacity) 

주어진 값을 초기용량으로하는 HashSet객체를 생성한다. 

HashSet(int initialCapacity, float loadFactor) 

초기용량과 load factor를 지정하는 생성자. 

boolean add(Object o) 

새로운 객체를 저장한다. 

boolean addAll(Object o)

주어진 컬렉션에 저장된 모든 객체들을 추가한다.(합집합) 

void clear() 

저장된 모든 객체를 삭제한다. 

Object clone() 

HashSet을 복제해서 반환한다. 

boolean contains(Object o) 

지정된 객체를 포함하고 있는지 알려준다. 

boolean containsAll(Collection c) 

주어진 컬렉션에 저장된 모든 객체들을 포함하고 있는지 알려준다. 

boolean isEmpty() 

HashSet이 비어있는지 알려준다. 

Iterator iterator() 

iterator를 반환한다. 

 boolean remove(Object o)

지정된 객체를 HashSet에서 삭제한다.(성공하면 true, 실패하면 false) 

boolean removeAll(Collection c) 

주어진 컬렉션에 저장된 모든 객체와 동일한 것들을 HashSet에서 모두 삭제한다. 

 boolean retainAll(Collection c)

주어진 컬렉션에 저장된 객체와 동일한 것만 남기고 삭제한다.(교집합) 

int size() 

저장된 객체의 개수를 반환한다. 

 Object[] toArray()

저장된 객체들을 객체배열의 형태로 반환한다. 

Object[] toArray(Object[] a) 

저장된 객체들을 주어진 객체배열(a)에 담는다. 

HashSet의 add메서드는 새로운 요소를 추가하기 전에 기존에 저장된 요소와 같은 것인 판별하기 위해 추가하려는 요소의 equals()와 hashCode()를 호출하기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩해야 한다.

 

 

String클래스는 문자열의 내용으로 해시코드를 만들어 내기 때문에 내용이 같은 문자열에 대한 hashCode()호출은 항상 동일한 해시코드를 반환한다.
반면에 Object클래스는 객체의 주소로 해시코드를 만들어 내기 때문에
실행할 때마다 해시코드값이 달라질 수 있다.