IT/JAVA (17.12.18~)

12일차 JAVA(12)

만두토끼 2018. 1. 4. 14:37

1. Object 클래스 


**java.lang 패키지

=>import 없이 사용할 수 있는 패키지


.java.lang.Object
=>자바의 최상위 클래스
=>모든 자바의 클래스는 이 클래스로부터 상속받습니다.
=>이 클래스가 가지고 있는 모든 메소드는 다른 모든 클래스에서 사용이 가능합니다.

1) 생성자(Constructor) Object()

=>객체 생성
Object 이름 = new Object();


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