- [Java 기본]클래스, String, StringBuffer, static
//===========================================================================//
본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
기본으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. 클래스의 기본 구조
2. String & StringBuffer 클래스 API 확인
3. static
//---------------------------------------------------------------------------//
1. 클래스 구조
- this, super 는 모두 예약어 이다.
- class 는 특정 목적을 수행하기 위해 모인 집합이다.
1) class 예
class A { // 특정 점(point:좌표)을 관리하기 위한 class
private int x;
private int y; // 사용자 정의형 자료형
public A() { // 생성자
x = 0;
y = 0;
}
public A(int a) { // 생성자 오버로딩에 의해서 만듬
this();
x = a;
}
public A(int a, int b) { // 오버로딩에 의해서 생성자 만듬
this(a);
y = b;
}
public void setXY(int a, int b) {
x = a;
y = b;
}
public void disp() {
System.out.println("x = " + x);
System.out.println("y = " + y);
}
public String toString() { // Object의 toString() 메소드를 재정의 했다.
return "aaa"; // 재정의를 하지 않으면 해시코드(A@aldf23) 값이 리턴된다.
}
}
public class B {
public static void main(String[] ar) {
A ap = new new A();
System.out.println(ap); // -> A@aldf23 // 클래스이름@ + 해쉬코드 6자리
// 사용자 정의 자료형을 출력하려고 하면 위와 같은 형태를 출력 하도록 약속 되어 있다.
// System.out.println(ap); 은 자동적으로 ap.toString() 으로 바뀌고 위의 형태로 출력 된다.
// 객체. 에서의 . 은 멤버를 의미한다.
// A 라는 클래스 속에 ap.toString()이 있다는 것을 의미 한다.
// api에서 java.lang -> Object -> toString() 를 찾을 수 있다.
// 모든 클래스는 Object 클래스를 상속 받고, 자동으로 오브젝트 클래스의 메소드를 모두 사용할 수 있다.
// 클래스도 메모리만 할당하면 자동적으로 초기값을 할당 한다.
public String toString() { // 재정의 하면..
return "aaa";
}
가 A 클래스에 추가되었으므로,
System.out.println(ap);
를 하면 aaa 가 출력 된다.
이것은 자식 노드에서 메소드를 먼저 찾아 보고 있으면 그대로 실행하고, 없으면 부모 노드가서 메소드를 찾는 자바의 특징을 알 수 있다.
public class B {
public static void main(String[] ar) {
A ap = new new A();
A bp = new A(10, 20);
ap.disp(); // 여기서 . 은 해당 객체를 발생시킨 클래스로 부터 메소드를 찾는다.
//---------------------------------------------------------------------------//
2. String & StringBuffer 클래스
- 문자열을 저장 하였다가 출력 하는 클래스
String 은 '=' 이 오기 전에는 어떠한 메소드를 사용하여도 원본 데이타는 절대 변하지 않는다.
StringBuffer 는 어떠한 메소드를 사용하더라도 원본 데이타의 내용이 바뀐다.
도움말 -> java.lang -> String 클래스
String str = "Java"; // str은 문자열 기억하는 4byte 객체
// 도움말을 보면.. 많은 오버로딩 메소드를 발견 할 수 있다.
byte[] b = {(byte)'J', (byte)'a', (byte)'v', (byte)'a' };
String str = new String(b);
String str = new String("Java");
String str = "Java";
String str1 = "Java";
String 에 존재하는 Method 들 설명
1) charAt(int)
String str = "Java";
char ch = str.charAt(2); // v를 ch에 넣을 수 있다. // 위치를 알려주면 특정 문자 하나를 가져 올 수 있다.
// 소스 코드는 Ex0108_01 에 모두 정리 되어 있음
Ex1) System.in.read(); 에서 한문자씩 받아서 문제 되었던 것을 문자열로 받을수 있게 하시오.
2) concat("문자열"); // 문자열 뒤에 특정 문자열을 덧셈 시킬때 사용한다.
String str = "ABC";
String str1 = str + "DEF"; // 다음을 계산할때.. 덧셈이 존재하는 순간.. 4개의 라인으로 변환 된다. 실행 시간을 느리게 만든다.
= str.concat("DEF");
Ex2) System.out.println("ABC" + "DEF"); 을 바꾸시오..
3) getBytes() //문자열 자체를 바이트 배열로 바꿔서 주는 Method
//네트웍에서 문자열 전송시 사용할수 있다.
Ex3)
String str = "Hello";
byte[] b = str.getBytes();
System.out.println(b.length);
4) indexOf
indexOf (int) // 해당 문자를 찾으면 끝난다.
indexOf (int, int) //
laseIndexOf(int) //뒤에서 부터 찾아준다.
indexOf (String)
indexOf (String,int)
int x = str.indexOf('a'); // a라는 문자를 앞에서 부터 찾아줌
int x = str.indexOf('a', 2); // 두번째 부터.. a를 찾아줌.
int x = str.indexOf('ar', 문자위치);
Ex4) 이메일 주소 맞는지 채크하기..
5) length() //문자열의 길이를 리턴 받을 수 있다.
int[] i = new int[4];
System.out.println(i.length);
String str = "Java";
System.out.println(str.length());
6) substring(int, int) //특정(시작)위치에서 특정(끝) 위치까지 복사해 올수 있는 Method
substring(int) //시작 위치에서 끝 위치까지 복사해 오는 메소드
String str = "Java";
String str1 = str.substring(1,3); // av 만 str1에 복사됨
Ex) String str = "http://www.daum.net";
위의 문자열이 있다고 가정하고, 다음의 결과가 출력되도록 프로그래밍 하라
프로토콜 = http
지역 = net
7) toUpperCase() //문자열 전체를 대문자로 바꾸어 돌려줌
toLowerCase() // 문자열 전체를 소문자로 바꾸어준다.
String str = "JaVa";
String str1 = str.toUppperCase();
8) trim()
1 ~ 32, 127 : white Character;
글자열 시작 전이나 끝난 후에 문자열에 존재하는 화이트 캐릭터를 제거해주는 Method
- 스페이스바를 제거해 줄때 많이 사용한다.
이름 : l i t w a v e
String str = " l i t w a v e ";
str = str.trim(); // "l i t w a v e" 입력됨
9) valueOf() // 모든 자료형이 된다. 오버로딩 되어 있어서.
- static Method 로서 클래스 이름으로 접근 해야 하는 Method 이다.
String.valueOf(?); // ? - 특정 자료형
숫자를 문자열로 변경 시킬때..
String.valueOf(12);
숫자 12를 문자열 "12"로 변경할 때 사용한다.
//---------------------------------------------------------------------------//
오늘의 과제 1:
StringBuffer 로 위의 예제 처럼 모든 10개 정도의 메소드를 사용해 볼껏..
예
StringBuffer sb = new StringBuffer("Java");
sb.delete(1,3);
System.out.println(sb); -> // Ja // 원본 값이 바뀐 것 확인
// 결과형 리턴 값이.. StringBuffer인 것은 원본 값이 변경 된다.
//---------------------------------------------------------------------------//
String str = "ABC" + "DEF";
를 실행 시 아래의 코드로 변경되어 실행 되므로 시간이 오래 걸린다.(하위버젼)
Stringbuffer sb = new String("ABC");
Stringbuffer sb1 = new String("DEF");
sb.append(sb1);
string imsi = sb.toString();
return imsi;
//---------------------------------------------------------------------------//
** Static이 사용되는 영역 **
3. static
3.1 Field -> static
ex) static int i;
static {
i = 10;
}
- 하나의 클래스로 발생된 모든 객체가 공유하는 변수 공간 //static 선언의 목적(정의) : 공유 공간
- 클래스 이름으로도 객체로도 접근 가능 // System.out(in,err) 클래스 이름이나 객체 이름으로 Method 접속이 가능하다.
- this 예약어를 가지지 않는 Member Field // static 변수는 클래스의 멤버라고 이야기 한다. static로 선언된 변수는 this를 가지지 않는다.
- 초기화 :
static { 초기문구 }
- 프로그램 시작시 Constant 영역에 메모리 할당 //static Field는 void main() 보다 먼저 메모리가 할당 된다.
프로그램 종료시 소멸
// void main보다 먼저 실행되는 것이 있고, 늦게 실행 되는 것이 있다.
3.2 Method -> static
- static Field 의 값을 변경시키거나 리턴 or display 하기 위한 목적 // static 필드를 사용하는 시기
- 0 번째 매개변수를 가지지 않는 Method // static 은 this 를 가지지 않기 때문이다.
. Non-Static-Field와
Non-Static-Method는
Static-Method 내부에서 사용 불가 // this가 없으므로 Non-Static-Field와 Non-Static-Method는 사용할 수 없다.
// static 메소드는 객체 생성에 상관 없이 메모리에 올라가지만 일반 메소드는 객체 생성 후에 메모리에 올라가므로
// static 메소드에서 선언되지 않은 메소드를 사용하는 것은 불가능하다.
//그러나 Non-Static-Field와 Non-Static-Method는 Static-Method를 사용할 수 있다.
- 클래스 이름이나 객체 이름으로 호출 가능
// 아래와 같이 특정 메소드 안에서 A 클래스에 선언된 static field를 사용 가능하다.
main(----) {
System.out.---(A.x)
}
class A {
static int x = 10;
}
3.3 class -> static // 클래스 이름 앞에 static 가 붙을 수 있다.
-> 정적 중첩클래스에서 static 멤버를 포함하는 Inner 클래스를 만들기 위해 사용
static : 지정어로 사용된다.
//---------------------------------------------------------------------------//
과제 2. 단일 선형 링크드 리스트 사용하면 됨.
출력 값:
** 은행 시스템 가동 **
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 1 // 1 입력
o 신규 사용자를 등록 합니다.
이름 = litwave
저축할 금액 = 1000
2003년 1월 8일 21시 50분에 litwave님의 계좌가 개설 되었습니다.
현재 적용이율은 0.05% 입니다.
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 2 // 2 입력
o 등록된 사용자 정보
이름 원금 이율 총금액
litwave 1000 0.05 1050
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 3 // 3 입력
현재 적용 이율은 0.05% 입니다.
변경할 이율 = 2
0.05 -> 0.02 이율 변경을 하시겠습니까(y/n)? y // y 입력
2003년 1월 8일 21시 55분 부로 적용 이율이 0.02%로 변경 되었습니다.
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 2 // 2 입력
o 등록된 사용자 정보
이름 원금 이율 총금액
litwave 1000 0.02 1050
1. 신규 사용자 등록
2. 사용자 전체 보기
3. 이율 변경
4. 시스템 종료
-----------> 4 // 4 입력
** 시스템을 종료합니다. **
//---------------------------------------------------------------------------//
// Ex0108_01.java
class A {
static int x;
int y;
static {
x = 320;
}
A(int y) {
this.y = y;
}
public static void setX(int x) {
A.x = x;
}
}
public class Ex0108_01 {
public static void main(String[] ar) {
A ap = new A(10);//x = 320, y = 10;
A bp = new A(100);//x =320, y = 100;
A.setX(100);
System.out.println("ap x = " + ap.x + ", ap y = " + ap.y);
System.out.println("bp x = " + bp.x + ", bp y = " + bp.y);
}
}
//---------------------------------------------------------------------------//
// Ex0108_02.java
import java.io.*;
public class Ex0108_02 {
public static void main(String [] ar) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] num = new int [14];
String jumin = null;
System.out.print("주민번호 = ");
jumin = br.readLine();
for(int i=0; i < 14; i++) {
if(i == 6) continue;
num[i] = (int)jumin.charAt(i) - 48;
}
for(int i=0; i < 14; i++) {
if(i == 6) continue;
System.out.print(num[i]);
}
System.out.println();
//Ex2
// System.out.println("ABC".concat("DEF"));
/* Ex3
String str = "Hello";
byte[] b = str.getBytes();
System.out.println(b.length);
*/
/* Ex4
String str = "sellephoenix@dreamwiz.com";
if(str.indexOf('@') == -1 || str.lastIndexOf('.') == -1) {
System.out.println("잘못된 이메일 주소 입니다.");
} else
System.out.println("올바른 이이메일 주소 입니다.");
*/
/* Ex6
String str = "http://www.daum.net";
System.out.println("프로토콜 = " + str.substring(0,(str.indexOf("://"))));
System.out.println("지 역 = " + str.substring(str.lastIndexOf('.')+1));
*/
}
}
//---------------------------------------------------------------------------//
// Calculator.java
import java.io.*;
public class Calculator {
static BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
static int su1 = 0;
static char yon = 0;
static int su2 = 0;
private static int hap(int a, int b){
int c = a + b;
return c;
}
private static int cha(int a, int b){
int c = a - b;
return c;
}
private static int gob(int a, int b){
int c = a * b;
return c;
}
private static int na(int a, int b){
int c = a / b;
return c;
}
private static int per(int a, int b){
int c = a % b;
return c;
}
private static void input() throws IOException{
System.out.print("Su1 = ");
su1 = Integer.parseInt(br.readLine());
do{
System.out.print("Yon(+,-,*,/,%) = ");
yon = (char)System.in.read();
System.in.read();//엔터키 처리...\r--Cmd
//System.in.read();//\n--Cmd
}while(yon != '+' && yon != '-' && yon != '*' && yon != '/' && yon != '%');
do{
System.out.print("Su2 = ");
su2 = Integer.parseInt(br.readLine());
}while((yon == '/' && su2 == 0) ||
(yon == '%' && su2 == 0));
}
private static void output(){
int tot =0;
switch(yon){
case '+':tot = hap(su1, su2); break;
case '-':tot = cha(su1, su2); break;
case '*':tot = gob(su1, su2); break;
case '/':tot = na(su1, su2); break;
case '%':tot = per(su1, su2); break;
}
System.out.println(su1 + " " + yon + " " + su2 + " = " + tot);
}
Calculator() throws IOException {
input();
output();
}
}
'scrap > Java/JSP' 카테고리의 다른 글
- [Java 기본]예외처리, 클래스 상속 (0) | 2011.05.14 |
---|---|
- [Java 기본]INFO 클래스, Collection 객체(Set, Map, List), package (0) | 2011.05.14 |
- [Java 기본]다차원배열, 클래스 (1) | 2011.05.14 |
- [Java 기본]메소드, 1차원 배열 (0) | 2011.05.14 |
- [Java 기본]제어문 (0) | 2011.05.14 |