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클래스는 객체의 주소로 해시코드를 만들어 내기 때문에
실행할 때마다 해시코드값이 달라질 수 있다.

posted by changhozz 2012. 7. 18. 11:26

우선 Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다. Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것이다.

1. Iterator
iterator()는 Collection인터페이스에 정의된 메서드이므로 Collection인터페이스의 자손인 List와 Set에도 포함되어 있다.
그래서 LIst나 Set인터페이스를 구현하는 컬렉션은 iterator()가 각 컬렉션의 특징에 알맞게 작성되어 있다.

boolean    hasNext()     ㅡ> 읽어올 요소가 남아있는지 확인한다. 있으면 true, 없으면 false를 반환한다.

Object   next()     ㅡ>다음 요소를 읽어 온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전하다.

void     remove()      ㅡ>next()로 읽어 온 요소를 삭제한다. next()를 호출한 다음에 remove()를 호출해야한다.(선택적 기능)

 

posted by changhozz 2012. 7. 17. 22:00

LinkedList와 떨어질수없는 관계 배열.

우선 배열이라 하면 , 가장 기본적인 형태의 자료구조 구조가 간단하며 사용하기 쉽고 데이터를 읽어 오는데 걸리는 시간(접근시간)이 가장 빠르다는 장점을 가지고 있지만 다음과 같은 단점도 가지고 있다.

1.크기를 변경할 수 없다
-크기를 변경할 수 없기 때문에 새로운 배열을 생성해서 데이터를 복사하는 작업이 필요하다.
-실행속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야하므로 메모리가 낭비된다.

2.비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
-차례대로 데이터를 추가하고 마지막에서부터 데이터를 삭제하는 것은 빠르지만,
-배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야한다.

이처럼 배열은 모든 데이터가 연속적으로 존재하지만 LinkedList는 불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성되어 있기 때문에 데이터를 추가하거나나 삭제하기 용이하다.
그러나 각 요소들이 불연속적으로 연결되어 있기때문에 처음부터 찾고자하는 데이터까지 차례대로 따라가야만 원하는 값을 얻을 수 있다. 

 

배열은 배열 전체가 한개의 주소를 갖는반면 ,
LinkedList는 각 요소마다 주소값이 있어, 요소(node)가 그 다음 요소의 주소값을 가르켜 꼬리를 무는 형태이다.

'JAVA > 팀장님 JAVA수업' 카테고리의 다른 글

Collection 보충설명 HashSet  (0) 2012.07.18
Collection 보충설명중 Iterator  (0) 2012.07.18
Collection 보충설명중 (Vector와 ArrayList)  (0) 2012.07.17
팀장님 수업 10  (0) 2012.07.13
스트림정리  (0) 2012.07.10