'JAVA/JAVA 공부'에 해당되는 글 9건

  1. 2012.07.20 StringBuffer클래스
  2. 2012.07.20 String클래스의 특징
  3. 2012.07.20 java.lang 패키지
  4. 2012.06.29 참조변수의 대한 설명
  5. 2012.06.26 수치형 범위
  6. 2012.06.21 JVM의 메모리 구조
  7. 2012.05.22 static 메서드
  8. 2012.05.22 public class
  9. 2012.05.21 import , package
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. 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. 6. 29. 11:13

변수란 값을 의미하는게 아니라, 값을 저장할 수 있는 메모리상의 공간을 의미.
ex) int A =3;
A가 변수 3은 변수값.

변수의 Type중
Primitive Type에는
boolean, char,
byte, short, int, long
float, double이 있고

Reference Type에는
8개의 기본형을 제외한 나머지타입이 속한다.
객체의 주소를 저장한다.
때문에 참조형 변수는 프로그래머가 직접 만들어 추가할 수 있으므로
그 수가 정해져 있지 않다.
ex)클래스명 변수명;
Date today;
타입이 클래스이름인 것들은 모두 참조변수이다.

참조형 변수는 null 또는 객체의 주소(4byte,0x0~0xffffffff)를 값으로 갖는다.
null은 어떤 값도 갖고 있지 않음, 즉 어떠한 객체도 참조하고 있지 않다는 것을 뜻한다.

따라서 참조변수의 초기화는 다음과 같이 한다.
Date today = null;
또는
Date today = new Date();

 


즉, 기본형 변수는 변수 자체가 값을 기억하고
참조형 변수는 변수 자체가 값을 기억하지 않고 값이
기억 된 위치의 주소를 기억한다.

 

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

String클래스의 특징  (0) 2012.07.20
java.lang 패키지  (0) 2012.07.20
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
static 메서드  (0) 2012.05.22
posted by changhozz 2012. 6. 26. 11:21

예를들어

byte형은 8bit로 수의 범위가 -2의7승~2의7승 -1 (-128~ 127 -1) 까지 인데

-1을 해주는 이유는 0때문인다.

 0

뒷자리부터 2의0승 2의1승....2의6승까지 곱한뒤 더하여 2진수를 10진수로 바꾸는 것인데,

맨 앞자리는 부호를 뜻한다. 0이면 플리스 1이면 마이너스.

여기서 중요한것은

0은 양수 음수가 있지않다.

맨 앞자리가 0으로 플러스일때 0을 표현하려면

 

 맨 앞자리가 1로 마이너스일때 0을 표현하려면

 1

으로 두개가 되어버린다.

따라서 전체개수에서 -1을 빼주는 것이다. 

 

또한 음수로는 128까지고 양수로는 127인 이유는

 127을 음수로 바꾸려면 1의보수후 2의보수처리를하여 1을증가해서

-128이된다.

때문에 양수최대값보다 1큰것이 최소값이 되는것이다.

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

java.lang 패키지  (0) 2012.07.20
참조변수의 대한 설명  (0) 2012.06.29
JVM의 메모리 구조  (0) 2012.06.21
static 메서드  (0) 2012.05.22
public class  (0) 2012.05.22
posted by changhozz 2012. 6. 21. 14:22

 

 

JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고
JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

JVM의 메모리구조는 메소드영역(Method area) 힙(Heap) 호출스텍(call stack)으로 구성되어있다.

1.메서드 영역(Method area)
메서드영역에는 JVM이 해당 클래스의 클래스파일(*.class)을 읽어서 분석하여
클래스에 대한 정보(클래스 데이터)를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도
이 영역에 함께 생성된다.

2.힙(Heap)
힙은 인스턴스가 생성되는 공간으로, 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다.
즉 인스턴스변수(instanace variable)들이 생성되는 공간이다.

3.호출스택(call stack)
호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면,
호출스택에 호출된 메서드를 위한 메모리가 할당되며, 이 메모리는 메서드가 작업을
수행하는 동안 지역변수(매개변수 포함)들과 연산의 중간결과 등을 저장하는데 사용된다.
그리고 메서드가 작업을 마치면 할당되었던 메모리공간은 반한되어 비워진다.
각 메서드를 위한 메모리상의 작업공간은 서로 구별되며, 첫 번째로 호출된 메서드를 위한 작업공간이
호출택의 맨 밑에 마련되고, 첫 번째 메서드 수행 중에 다른 메서드를 호출하게 되면, 첫 번째 메서드의
바로 위에 두 번째로 호출된 메서드를 위한 공간이 마련된다.
이 때 첫 번째 메서드는 수행을 멈추고, 두 번째 메서드가 수행되기 시작한다. 두 번째로
호출된 메서드가 수행을 마치게 되면, 두 번째 메서드를 위해 제공되었던 호출스택의 메모리공간이
반환되며, 첫 번째 메서드는 다시 수행을 계속하게 된다. 첫 번째 메서드가 수행을 마치면,
역시 제공되었던 메모리 공간이 호출스택에서 제거되며 호출스택은 완전히 비워지게 된다.
호출스택의 제일 상위에 위치하는 메서드가 현재 실행 중인 메서드이며, 나머지는 대기상태에 있게 된다.
따라서, 호출스택을 조사해 보면 메서드 간의 호출관계와 현재 수행중인 메서드가 어느것인지 알 수있다.

반환타입(return type)이 있는 메서드는 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다.
대기상태에 있던 호출한 메서드(caller)는 넘겨받은 반환값으로 수행을 계속 진행하게 된다.

*메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
*메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
*호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
*아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.


오르막 내르막 처럼 시작됐다 종료됨.
( 자신이 부른 위에 메소드가 수행을 마칠때 까지 대기하느라)

 

 

(1)~(2)위의 예제를 컴파일한 후 실행시키면, JVM에 의해서 main메서드가 호출됨으로써 프로그램이 시작된다. 이 때, 호출스택에는 main메서드를 위한 메모리공간이 할당되고 main메서드와 코드가 수행되기 시작한다.

(3)main메서드에서 firstMethod()를  호출한 상태이다. 아직 main메서드가 끝난 것은 아니므로 main메서드는 호출스택에 대기상태로 남아있고 firstMehtod()의 수행이 시작된다.

(4)firstMethod()에서 다시 secondMethod()를 호출했다. firstMethod()는 secondMethod()가 수행을 마칠 때까지 대기상태에 있게 된다. secondMethod()가 수행을 마쳐야 firstMethod()의 나머지 문장들을 수행할 수 있기 때문이다.

(5)secondMethod()에서 println메서드를 호출했다. println메서드에 의해서 'secondMethod()'가 화면에 출력된다.

(6)println메서드의 수행이 완료되어 호출스택에서 사라지고 자신을 호출한 secondMethod()로 되돌아간다. 대기 중이던 secondMethod()는 println메서드를 호출한 이후부터 수행을 재개한다.

(7)secondMethod()에 더이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 firstMethod()로 돌아간다.

(8)firstMethod()에도 더 이상 수행할 코드가 없으므로 종료되고, 자신을 호출한 main메서드로 돌아간다.

(9)main메서드에서도 더 이상 수행할 코드가 없으므로 종료되어, 호출스택은 완전히 비워지게 되고 프로그램은 종료된다.

 

 

 

 

 

 

 

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

참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
static 메서드  (0) 2012.05.22
public class  (0) 2012.05.22
import , package  (0) 2012.05.21
posted by changhozz 2012. 5. 22. 16:59

식별자란 - 클래스명, 메소드명, 멤버 변수명, 자동 변수명 등을 일컫는다.

main() 메소드에서 객체의 레퍼런스 없이 접근하려면 키워드인 static을 써야함.

static으로 선언된 메소드에서는 static으로 선언된 멤버 변수나 메소드에만 접근할 수 있다.

객체를 만들면 접근할수있음.

ex)

class Truth {

 boolean y;

 public static void main(String[] args) {
  boolean x = true;

  Truth t = new Truth();
  System.out.println(x);
  System.out.println(y);     // static이 아니기 때문에 그냥 y를 호출하지못함.
  System.out.println(t.y);   // static이 아니여도 객체를 생성해서 불러낼수있음.

 }

}

 

class Truth {

 boolean x;

 public static boolean aaa() {

  return false;
 }

 public static int bbb() {
  return 72;
 }

 public static int ccc(int x, int y) {
  int z = x + y;
  return z;

 }

 public static void main ( String [] args) {
  
  boolean a = aaa();
  System.out.println("a=" + a);
  int b = bbb();
  System.out.println("b="+b);
  int c = ccc(10,20);
  System.out.println(c);
 }
}

 

 

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

참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
public class  (0) 2012.05.22
import , package  (0) 2012.05.21
posted by changhozz 2012. 5. 22. 01:16

그리고 한 파일에 여러 클래스를 선언할 경우 public 클래스는 하나만 있어야 됩니다.
또한, main 메서드가 있는 클래스는 무조건 public이 되어야 하지만
여기에서는 예외로 public을 생략할 경우 public으로 인식됩니다.  

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

참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
static 메서드  (0) 2012.05.22
import , package  (0) 2012.05.21
posted by changhozz 2012. 5. 21. 19:26

자바에서 같은 디렉터리가 아닌 다른 디렉터리에 있는 클래스를 사용하러면

반드시 import문을 사용해야한다.(에를 들면 import java.awt.*;)

따라서 해당 패키기지(예를들면 import. javax.swing.*;)

혹은

해당 패키지명을 포함한 클래스명(예를들면 import javax.swing.JOptionPane;) 기술해야한다

예외포 java.lang 패키지는 자동 import된다.

 

관련있는 클래스들을 모아서 자신만의 패키지를 만들 수도 있다. 이 때 자신이 만든 클래스 파일을

패키지에 넣고 싶을 때는 package문을 프로그램의 맨 첫 번째 줄에 기술하면 된다.

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

참조변수의 대한 설명  (0) 2012.06.29
수치형 범위  (0) 2012.06.26
JVM의 메모리 구조  (0) 2012.06.21
static 메서드  (0) 2012.05.22
public class  (0) 2012.05.22