1. Object 클래스
**java.lang 패키지
=>import 없이 사용할 수 있는 패키지
2) 메소드(Method)
- protected Object clone(): 오버라이딩해서 사용하는 메소드로 객체를 복제해주는 메소드
- boolean equals(Object obj): 오버라이딩 해서 사용하는 메소드로 객체의 동일성 여부를 체크하는 메소드
- int hashCode(): 객체가 사용하고 있는 메모리의 주소
학습할 때 2개의 객체가 동일한 메모리의 주소를 가리키고 있는지 확인하는 용도로 주로 사용
- String toString(): 객체를 문자열로 리턴해주는 메소드인데 print 메소드에 객체 이름만 대입하면
자동으로 호출되는 메소드입니다.
기본적으로는 <클래스이름:해시코드>가 리턴되도록 되어 있습니다.
- notify(), notifyAll(), wait(): 멀티 스레드 환경에서 사용하는 메소드
=>이 클래스의 객체를 생성하는 경우는 거의 없습니다.
=>이 클래스는 다른 모든 클래스가 공통으로 가져야 하는 메소드를 정의하기 위해 만들어진 클래스
package java0104;
public class Main1 {
public static void main(String[] args) {
//Object 클래스의 객체를 생성
Object c = new Object();
//Object 클래스의 hashCode라는 메소드는 해시코드를 리턴
//해시코드: 메모리를 구분하기 위해 붙여주는 번호
//해시코드를 출력
System.out.println(c.hashCode());
//toString 이라는 메소드는 객체를 문자열로 변환시켜주는 메소드
//이 메소느느 print 하는 메소드에 객체의 이름만 대입하면
//자동으로 호출되는 메소드
//이 메소드를 이용해서 위에서 만든 객체를 문자열로 출력
System.out.println(c.toString());
System.out.println(c);
}
}
2.데이터 복제
=>value 형 데이터의 경우 다른 변수에 데이터를 복사하면 데이터 자체가 복사되기 때문에
복사본의 변화가 원본에 영향을 주지 않습니다.
=>reference 형 데이터의 경우 다른 변수에 데이터를 복사하게 되면
데이터를 저장하고 있는 참조가 복사되기 때문에 복사본의 변화가 원본에 영향을 주게 됩니다.
package java0104;
public class Main2 {
public static void main(String[] args) {
//value 형 데이터를 저장하는 변수를 생성
int n = 10;
//reference 형 데이터를 저장하는 변수를 생성
int [] ar = {10,20};
//위의 데이터를 다른 변수에 복사
int k = n;
int [] br = ar;
//복사본의 데이터를 변경
k = 20;
br[0] = 100;
//원본의 값을 확인
//value 형 데이터를 복사한 경우는 복사본의 변화가
//원본에 영향을 주지 않습니다.
System.out.println("n:" + n);
//reference 형 데이터를 복사한 경우는 복사본의 변화가
//원본에 영향을 주게 됩니다.
System.out.println("ar[0]:" + ar[0]);
}
}
3. Clone
java에서는 데이터를 복제할 때 clone 이라는 이름의 인스턴스 메소드를 재정의해서 사용하기를 권장합니다.
Clone 만들기
public 자료형 clone( ){
자료형 copy = new 생성자( );
copy 변수명 = 변수명;
.
.
.
return copy;
}
package java0104;
public class Data {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//Data 클래스의 객체를 복제해주는 메소드
//배열은 clone을 만들 수 없다.
public Data clone() {
//새로운 객체를 생성
Data copy = new Data();
//각각의 데이터를 복사
copy.num=num;
//새로만든 객체를 리턴
return copy;
}
}
package java0104;
public class Main3 {
public static void main(String[] args) {
//Data 클래스의 객체를 생성
Data src = new Data();
//객체의 num 값을 변경
src.setNum(10);
//겍체의 num 값을 출력
System.out.println("src.num: "+src.getNum());
System.out.println("Data 형의 인스턴스 생성 후, 기존 인스턴스 넣고 값 변경");
Data dst = src;
dst.setNum(50);
System.out.println("src.num: "+src.getNum());
System.out.println();
//src의 내용을 복제해서 clone 생성
Data clone = src.clone();
//현재까지 2개의 객체는 동일한 내용을 가지고 있습니다.
System.out.println("src.num: "+src.getNum());
System.out.println("clone.num: "+clone.getNum());
clone.setNum(100);
System.out.println("src.num: "+src.getNum());
System.out.println("clone.num: "+clone.getNum());
}
}
4. Wrapper Class
=> value 형 데이터를 참조형으로 사용할 수 있도록 해주는 클래스
=> 참조형을 사용하면 데이터 뿐만 아니라 메소드를 사용할 수 있습니다.
=> 모든 참조형 데이터는 Object 클래스로부터 상속 받기 때문에 Object 타입의 대입 할 수 있다.
boolean -> Boolean
byte -> Byte
short -> Short
char -> Character
int -> Integer
long -> Long
float ->Float
double -> Double
5. Double Class
1) 객체 생성
- 생성자 호출: Double (실수 또는 실수 문자열)
- 실수를 직접 대입
ex)
Double d1 = new Double(10.7);
Double d2 = 10.7;
2) 메소드
- 문자열을 실수로 변환
static Double parseDouble(String str)
- 실수를 문자열로 변환
String toString( )
3) double 과 Double은 서로 간에 직접 대입이 가능합니다.
java가 boxing을 알아서 처리해주기 때문에
package java0104;
public class Main4 {
public static void main(String[] args) {
Double d1 = new Double(3.14);
Double d2 = 3.14;
System.out.println("d1: "+d1);
System.out.println("d2: "+d2);
double d3 = 3.14;
//d1과 d2는 메소드 사용이 가능
//문자열을 실수로 변환
Double d4 = Double.parseDouble("2.34");
//실수를 문자열로 변환
String real = d4.toString();
System.out.println("real: "+real);
double d = 0.1;
double sum=0.0;
for(int i=0; i<2000 ;i=i+1) {
sum=sum+d;
}
System.out.println(sum);
}
}
**아주 큰 정수나 실수의 표현
=>int(Integer)는 큰 정수를 표현할 수 없습니다.
=>정수를 여러 부분으로 나누어서 저장하는 클래스가 java.math.BigInteger
=>실수는 정밀하게 표현이 되지 않아서 여러번 연산을 하게 되면 오류가 발생합니다.
=>실수의 정밀도를 해결하기 위해서 만든 클래스가 java.math.BigDecimal 입니다.
=>실수를 가지고 여러 번 연산을 수행하면 문제가 발생할 가능성이 있습니다.
6. System 클래스
=>Object 로부터 상속
=>모든 멤버가 static 이라서 객체 생성이 필요없습니다.(생성자가 없습니다.)
1) 주요 속성
- in : 표준 입력 장치 - 키보드
- out: 표준 출력 장치 - 모니터
- err: 표준 에러 - 모니터
2) 주요 메소드
- static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length): src 배열을 dest 배열로 복제
- static long currentTimeMillis(): 1970년 1월 1일 자정부터 지나온 시간을 1/1000초 단위의 정수로 리턴
- static void exit(int code): 시스템 종료 - code 값을 운영체제에게 전달하는데 0을 대입하면 정상 종료
- static String getenv(String name): name에 해당하는 환경변수 값 리턴
실습) Hello World를 10000번 출력하는데 걸리는 시간을 측정해서 출력하고 path 환경변수에 설정된 값을 출력
package java0104;
public class Main5 {
public static void main(String[] args) {
//로딩 시간, 다운시간을 측정할때 사용
long start_time = System.currentTimeMillis();
for(int i=0; i<1000; i=i+1) {
System.out.println("HelloWorld");
}
long end_time = System.currentTimeMillis();
long time = end_time-start_time;
System.out.println(time);
//환경변수 path의 값
//path: .설정된 티렉토리의 명령어를 이름만으로 실행하도록 해주는 환경변수
String path = System.getenv("path");
System.out.println(path);
}
}
7. Math 클래스
=>수학과 관련된 클래스
=>운영체제 별로 다른 결과를 리턴하는 경우가 있습니다.
=>random()이라는 메소드는 0.0 부터 1.0 사이의 숫자를 랜덤하게 리턴
실습) 1부터 10사이의 짝수를 랜덤하게 출력하도록 작성 =>2,4,6,8,10
//0.0 - 1.0 사이의 숫자를 랜덤하게 추출
double su1 = Math.random();
System.out.println("su1:" + su1);
//1-5사이의 숫자
int su2 = (int)(su1 * 100) % 5 + 1;
System.out.println("su2:" + su2);
//2,4,6,8,10
int su3 = su2 * 2;
System.out.println("su3:" + su3);
=>System 과 Math 클래스의 공통점은 모든 멤버가 static이어서 객체를 생성할 필요가 없다는 것 입니다.
8. Runtime 클래스
=>프로세스 실행과 관련된 클래스
=>모든 멤버가 static 이 아닌데 생성자(Contructor)가 없습니다.
=>이 클래스는 자신의 static 메소드를 호출해서 객체를 생성합니다.
1.객체 생성
static Runtime getRuntime()
2.주요 메소드
exec("실행 파일 이름")
=>실행 파일 이름 뒤에 하나의 공백을 주고 옵션을 주면 옵션을 실행 프로그램으로 실행
package java0104;
import java.io.IOException;
public class Main6 {
public static void main(String[] args) {
//1부터 10까지 짝수 랜덤 출력
for(int i=0; i<10; i=i+1) {
double num = Math.random();
System.out.println("랜덤출력: "+num);
num = ((int)((num*10)%5)+1)*2;
if(num%2==0&&num>1) {
System.out.println("짝수출력: "+(int)num);
}
else {
i=i-1;
}
}
//계산기 불러오기
Runtime r = Runtime.getRuntime();
try {
r.exec("calc");
}catch(Exception e) {
System.out.println(e.getMessage());
}
//그림판, 메모장 불러오기
Runtime r1 = Runtime.getRuntime();
try {
r1.exec("mspaint C:\\Users\\402-25\\Desktop\\1234.png");
r1.exec("notepad \\\\192.168.0.100\\data\\Java\\java\\0104.txt");
}catch(IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
9. String =>문자열 클래스
1) 객체 생성
- 문자열 상수를 직접 대입
- byte 배열을 가지고 만들 수 있습니다.
- char 배열을 가지고 만들 수 있습니다.
- 다른 문자열을 생성자에 대입해서도 만들 수 있습니다.
2) 주요 메소드
int length(): 문자열의 길이를 정수로 리턴
char charAt(int idx): idx 번째의 문자를 리턴
int indexOf(char 또는 String): 매개변수를 앞에서 부터 찾아서 찾은 위치를 정수로 리턴하는데
못찾으면 음수를 리턴
int lastIndexOf(char 또는 String): 매개변수를 뒤에서 부터 찾아서 찾은 위치를 정수로 리턴하는데
못찾으면 음수를 리턴
String toLowerCase(): 모두 소문자로 변경해서 리턴
String toUpperCase(): 모두 대문자로 변경해서 리턴
String trim(): 좌우 공백을 제거해서 리턴
boolean equals(String): 문자열의 내용이 일치하는지 리턴-대소문자 구별
boolean equalsIgnoreCase(String): 문자열의 내용이 일치하는지 리턴-대소문자 구별 안함
String[] split(String regex): regex 단위로 구분해서 문자열 배열로 리턴
String substring(int idx): idx 부터 끝까지 문자열을 분할
String substring(int start, int end): idx 부터 end 앞까지 문자열을 분할
package java0104;
public class Main7 {
public static void main(String[] args) {
//문자열 객체를 생성
String msg = "Hello World";
int len = msg.length();
//문자열의 각 글자를 순서대로 출력
//int length(): 문자열의 길이 리턴
//String charAt(int idx): idx 번째 문자를 리턴
System.out.println("문자열의 문자를 하나씩 출력");
for(int i=0; i<len; i=i+1) {
System.out.print(msg.charAt(i)+" ");
}
System.out.println("\n\n위의 코드를 변경해서 반대로 출력(내가 쓴 코드)");
for(int i=len-1; i>=0; i=i-1) {
System.out.print(msg.charAt(i)+" ");
}
System.out.println("\n\n위의 코드를 변경해서 반대로 출력(선생님이 쓴 코드)");
for(int i=0; i<len; i=i+1) {
System.out.print(msg.charAt(len-(i+1))+" ");
}
int idx=msg.indexOf("l");
System.out.println("\n\n앞에서부터 idx:" +idx);
idx=msg.lastIndexOf("l");
System.out.println("뒤에서부터 idx:" +idx);
idx=msg.indexOf("llo");
System.out.println("idx: "+idx);
System.out.println("\n"+msg.toUpperCase());
System.out.println(msg.toLowerCase());
System.out.println();
//split이라는 메소드는 특정 문자열 단위로 분할해서
//String 배열로 리턴해주는 메소드
String csv = "Morning,Afternoon,Evening";
String [] ar= csv.split(",");
int size = ar.length;
for(int i=0; i<size; i++) {
System.out.println(ar[i]);
}
//substinrg(int idx): idx부터 끌까지 문자열을 출력
//substring(int start, int end): start 부터 end-1까지 출력
String str = "Fighting Korea";
System.out.println(str.substring(3));
System.out.println(str.substring(3, 7));
}
}
실습) 확장자 추출하기, 대문자 개수 구하기, ',' 단위로 분할해서 정수로 변한 후 합계 구하기
package java0104;
public class Main8 {
public static void main(String[] args) {
//1. 확장자 추출하기
System.out.println("1. 확장자 추출하기");
String filename = "test.jpg";
//위의 문자열에서 확장자를 추출하기
//.의 위치를 찾아서 그 위치뒤부터 끝까지 잘라내기를 하면 됩니다.
int idx=filename.indexOf(".");
for (int i=idx+1; i<filename.length(); i=i+1) {
System.out.print(filename.charAt(i));
}
System.out.println("\n\n2. 대문자 개수 구하기");
//2. 대문자 개수 구하기
String pw = "dksaL3FJSIasd";
int num = 0;
//위의 문자열에서 대문자의 개수를 세서 출력
//각각의 문자를 검사해서 대문자에 속하는 경우만 개수를 증가
for(int i=0; i<pw.length(); i=i+1) {
if('A'<=pw.charAt(i)&&'Z'>=pw.charAt(i)) {
num = num+1;
}
}
System.out.println("대문자 갯수: "+num);//예상개수 5
System.out.println("\n3. ,단위로 분할해서 정수로 변한 후 합계 구하기");
//3. 다음 문자열을 , 단위로 분할해서 정수로 변환 한 수 함계를 구해서 출력
String data = "30,50,16,37";
//split 함수를 이용해서 분할 한 후 각 문자열을 정수로 변환해서 합계 구하기
//문자열을 정수로 변환해주는 함수는 Integer 클래스에 있습니다.
String [] ar = data.split(",");
int sum = 0;
int sum1 = 0;
for(int i=0; i<ar.length; i=i+1) {
sum = sum + Integer.decode(ar[i]);//내가 코딩한 부분
sum1 = sum1 + Integer.parseInt(ar[i]);//선생님이 코딩한 부분
}
System.out.println("합계(decode메소드): "+sum);//예상합계 133
//decode 메소드를 쓸 경우에는 Interger 리턴하게 된다.
System.out.println("합계(parseInt메소드): "+sum1);//예상합계 133
}
}
실습) 문자열 공백 제거 후, 출력 & 긴 문자열에 짧은 문자열이 몇번 포함 됐는지 찾기(위치 출력)
package java0104;
public class Main9 {
public static void main(String[] args) {
String msg = "Hello World !!";
System.out.println("1. '"+msg+"'의 공백을 제거하고 출력하기");
//1. 위의 문자열의 모든 공백을 제거하고 출력하시오
//System.out.println(msg.trim());앞뒤 문자 제거라 이거 안됌
for(int i=0; i<msg.length(); i=i+1) {
if(msg.charAt(i)==' ') {
msg =String.join("",msg.substring(0, i), msg.substring(i+1));
}
}
System.out.println("답: "+msg+"\n\n");
String pattern = "AOA";
String source = "BAOAOAOASDW2AOSDOAOA"; //예상답 1,5,17번째
System.out.println("2. '"+pattern+"'을 '"+source+"'에서 찾아 모든 위치 출력");
//2. source에서 pattern이 나오는 모든 위치를 출력하시오
//단 데이터가 중복 적용되는 경우는 없어야 합니다.
//AOAOA의 경우 처음 AOA만 되고 이전 것과 겹쳐서 나오는 AOA는 안됨
//할 수 있다면 length 메소드와 charAt만 사용
for(int i=0; i<source.length();i=i+1) {
if(source.charAt(i)==pattern.charAt(0)) { //첫번째 문자 동일한 곳 찾기
int num=i;
for(int j=1; j<pattern.length(); j=j+1) {//뒤에 문자도 동일한지 확인
i=i+1;
if(i>=source.length()) break; //긴 문자열의 길이 초과시 break
if(source.charAt(i)!=pattern.charAt(j)) {//뒤에 다른 문자가 있을시 break
break;
}
if(j==pattern.length()-1) //첫번째 문자부터 끝의 문자까지 동일하면 출력
System.out.println(num+"번째");
}
}
}
System.exit(0);
}
}
* 댓글 환영
'IT > JAVA (17.12.18~)' 카테고리의 다른 글
14일차 JAVA(14) (0) | 2018.01.09 |
---|---|
13일차 JAVA(13) (0) | 2018.01.05 |
11일차 JAVA(11) (0) | 2018.01.03 |
10일차 JAVA(10) (0) | 2018.01.02 |
9일차 JAVA(9) (0) | 2017.12.29 |