프로그래밍/자바(java) 융합개발자 2차

[자바 8일차] 27일차 - String 클래스(p.369~)

aSpring 2021. 1. 21. 12:52
728x90
728x90

 

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공", ",/"); // 앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens()); // 토큰의 수 : 5
		int len = st.countTokens();
		// 홍길동 장화 홍련 팥쥐 주인공
		// for(int i = 0; i < len; i++) { //i=0 i<5까지 돌아감, i=1 i<4, i=2 i<3
		// System.out.println("count : " + st.countTokens());
		// System.out.println(st.nextToken()); //홍길동 장화 홍련
		// } 이렇게 하는 것 보다는 while문 사용하는게 나음
		while (st.hasMoreTokens()) {
			System.out.println("count : " + st.countTokens());
			System.out.println(st.nextToken());
		}
		
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";
		//StringTokenizer을 이용해서 16진수, 8진수, 2진수 출력
		
	}
}

2021/01/20 - [공부/자바(java) 융합개발자 2차] - [자바 7일차] 26일차 - 상속, 추상클래스, 추상메서드 , 인터페이스(Do it 공부단 p.234~)


StringTest02.java 다시 보기 + 추가

System.out.println(tmp2.lastIndexOf('d'));//lastIndexOf : 'd'가 마지막으로 나오는 위치 알려줌

29

 

com.day08

StringTest03.java

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
	}
}

//tmp길이 구하기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
	}
}

tmp 길이 : 32

 

//tmp 마지막 숫자 구하기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4

 

//숫자의 합 구하기

1. 배열의 길이 구하기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12

 

2. //마지막 숫자가 있는 위치

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14

 

3. 숫자의 합 구하기

숫자를 더해야 하는데.. arr[i] 속 내용은 -> 문자형임

-> 문자 -> 숫자로 바꾸는 작업이 필요

 

api > java.lang > Classes > Interger > 

()안에 문자가 들어가면 return값이 int

- 앞에 static이 붙어 있다 -> 클래스 이름으로 접근해야 한다.

 

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143

 

이런 클래스가 있다는 얘기는 : 메서드가 있다는 얘기

-> 클래스 : 메서드를 가지고 있기 때문에 다양한 형태로 바꿀 수 있다.

Interger : 래퍼 클래스

 

//sum을 16진수로 표현하기

- 숫자 관련 : api에서 찾아보기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1)
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f

 

ex) 987 (10진수)

100 10 1의 자리

9    8   7

================

f 6  (f : 15)

 

16진수 : 0~15까지를 얘기함, 9까지는 표현 가능, 10부터는 a b c d e f -> f : 15

 

//16진수 표기를 대문자로 표기해달라

위에서 8f는 문자로 반환된 것이므로

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f
sum을 16진수로 표현 : 8F

 

//arr의 값을 16, 8, 2진수로 표현하기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 

		String hex="";
		String oct="";
		String bin="";
		//arr의 값을 16, 8, 2진수로 표현하기
		
		System.out.println("16진수 : " + Integer.toHexString(hex)); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
	}
}

==>

toHexString()안에는 int형이 들어가야 하는데 arr[i]는 문자형이므로 에러남

-> 넣기 전에 int형으로 바꿔주어야 함

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 

		String hex="";
		String oct="";
		String bin="";
		//arr의 값을 16, 8, 2진수로 표현하기
		for(int i = 0; i < arr.length; i++) {
			int v = Integer.parseInt(arr[i]);//문자 -> 숫자로 변환
			hex += Integer.toHexString(v) + " ";//toHexString()안에는 int형이 들어가야 하는데 arr[i]는 문자형이므로 에러남 -> 넣기 전에 int형으로 바꿔주어야 함
			oct += Integer.toOctalString(v) + " ";
			bin += Integer.toBinaryString(v) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f
sum을 16진수로 표현 : 8F
16진수 : 1 0 f      17      6       15     11     a      b       c     d       e 
8진수 :   1 0 17    27      6       25     21    12    13     14    15     16 
2진수 :   1 0 1111 10111 110 10101 10001 1010 1011 1100 1101 1110

 

//substring 으로 문자 추출하기

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 

		String hex="";
		String oct="";
		String bin="";
		//arr의 값을 16, 8, 2진수로 표현하기
		for(int i = 0; i < arr.length; i++) {
			int v = Integer.parseInt(arr[i]);//문자 -> 숫자로 변환
			hex += Integer.toHexString(v) + " ";//toHexString()안에는 int형이 들어가야 하는데 arr[i]는 문자형이므로 에러남 -> 넣기 전에 int형으로 바꿔주어야 함
			oct += Integer.toOctalString(v) + " ";
			bin += Integer.toBinaryString(v) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
		
		//             012345678
		String test = "abce test hi java";
		System.out.println(test.substring(3, 8));//3은 e, 8은 e로, 3~8번째 Index까지를 가져와서 문자 추출
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f
sum을 16진수로 표현 : 8F
16진수 : 1 0 f 17 6 15 11 a b c d e 
8진수 : 1 0 17 27 6 25 21 12 13 14 15 16 
2진수 : 1 0 1111 10111 110 10101 10001 1010 1011 1100 1101 1110 
e tes

 

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 

		String hex="";
		String oct="";
		String bin="";
		//arr의 값을 16, 8, 2진수로 표현하기
		for(int i = 0; i < arr.length; i++) {
			int v = Integer.parseInt(arr[i]);//문자 -> 숫자로 변환
			hex += Integer.toHexString(v) + " ";//toHexString()안에는 int형이 들어가야 하는데 arr[i]는 문자형이므로 에러남 -> 넣기 전에 int형으로 바꿔주어야 함
			oct += Integer.toOctalString(v) + " ";
			bin += Integer.toBinaryString(v) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
		
		//             012345678
		String test = "abce test hi java";
		System.out.println(test.substring(3, 8));//3은 e, 8은 e로, 3~8번째 Index까지를 가져와서 문자 추출
		System.out.println(test.substring(3));
		//java 추출
		System.out.println(test.substring(13, 17));
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f
sum을 16진수로 표현 : 8F
16진수 : 1 0 f 17 6 15 11 a b c d e 
8진수 : 1 0 17 27 6 25 21 12 13 14 15 16 
2진수 : 1 0 1111 10111 110 10101 10001 1010 1011 1100 1101 1110 
e tes
e test hi java
java

 

// java를 검색해서 위치를 추출하면 되지 않을까?

package com.day08;

public class StringTest03 {

	public static void main(String[] args) {
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";//배열X, 처음부터 끝까지 문자
		//tmp길이 구하기
		System.out.println("tmp 길이 : " + tmp.length());
		//tmp 마지막 문자(숫자)
		System.out.println("tmp 마지막 숫자 : " + tmp.charAt(tmp.length()-1));
		//숫자의 합 구하기 -> 이걸 하나의 문자라고생각하면 안 되고, 공백으로 나누어 1 0 15 .. 를 각각 더해야 함  
		String[] arr = tmp.split(" "); //split(구분자) -> 여기서는 공백이 구분자이므로 " " 라고 적어줌 -> 공백으로 구분해 배열에 담는다
		System.out.println("arr의 길이 : " + arr.length); //배열의 길이 구하기
		//마지막 숫자가 있는 위치
		System.out.println("arr의 길이 : " + arr[arr.length-1]);
		//배열에 들어있는 숫자의 합 구하기
		int sum = 0;
		for(int i = 0; i < arr.length; i++) {
			// sum += arr[i];//arr[i]에 저장되어있는 내용 -> 문자 : 문자 -> 숫자로 바꾸는 작업이 필요함
			sum += Integer.parseInt(arr[i]); 
		}
		System.out.println("arr에 들어있는 숫자의 합 : " + sum);
		//sum을 16진수로 표현하기 //8f가 나올 것
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum)); //8f(8*16 + 15*1) -> 문자로 반환됨
		//16진수 표기를 대문자로 표기해달라
		System.out.println("sum을 16진수로 표현 : " + Integer.toHexString(sum).toUpperCase()); 

		String hex="";
		String oct="";
		String bin="";
		//arr의 값을 16, 8, 2진수로 표현하기
		for(int i = 0; i < arr.length; i++) {
			int v = Integer.parseInt(arr[i]);//문자 -> 숫자로 변환
			hex += Integer.toHexString(v) + " ";//toHexString()안에는 int형이 들어가야 하는데 arr[i]는 문자형이므로 에러남 -> 넣기 전에 int형으로 바꿔주어야 함
			oct += Integer.toOctalString(v) + " ";
			bin += Integer.toBinaryString(v) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
		
		//             012345678
		String test = "abce test hi java";
		System.out.println(test.substring(3, 8));//3은 e, 8은 e로, 3~8번째 Index까지를 가져와서 문자 추출
		System.out.println(test.substring(3));
		//substring 사용하여 java 추출
		System.out.println(test.substring(13, 17));
		//이렇게 하지 말고 java를 검색해서 위치를 추출하면 되지 않을까?
		int i = test.indexOf('j');
		System.out.println(test.substring(i, i+4));
	}
}

tmp 길이 : 32
tmp 마지막 숫자 : 4
arr의 길이 : 12
arr의 길이 : 14
arr에 들어있는 숫자의 합 : 143
sum을 16진수로 표현 : 8f
sum을 16진수로 표현 : 8F
16진수 : 1 0 f 17 6 15 11 a b c d e 
8진수 : 1 0 17 27 6 25 21 12 13 14 15 16 
2진수 : 1 0 1111 10111 110 10101 10001 1010 1011 1100 1101 1110 
e tes
e test hi java
java
java

 

StringTest04.java

package com.day08;

public class StringTest04 {

	public static void main(String[] args) {
		String msg = "This/is/a/java";
		//split()을 이용해서 java a is This 출력하기
	}
}

//split()을 이용해서 java a is This 출력하기

package com.day08;

public class StringTest04 {

	public static void main(String[] args) {
		String msg = "This/is/a/java";
		//split()을 이용해서 java a is This 출력하기
		String[] arr = msg.split("/");
		for(int i = arr.length-1; i >= 0; i--) {
			System.out.print(arr[i] + "\t");
		}
	}
}

java a is This

 

//This is a java ===> java a is This ==> avaja a si sihT

package com.day08;

public class StringTest04 {

	public static void main(String[] args) {
		String msg = "This/is/a/java";
		//split()을 이용해서 java a is This 출력하기
		String[] arr = msg.split("/");
		for(int i = arr.length-1; i >= 0; i--) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		//This is a java ===> java a is This ==> avaja a si sihT
		for(int i = arr.length-1; i >= 0; i--) {
			for(int j = arr[i].length()-1; j>=0; j--) {
				System.out.print(arr[i].charAt(j));
			}
			System.out.print(" ");
		}
		System.out.println();
	}
}

java a is This
avaj a si sihT 

 

package com.day08;

public class StringTest04 {

	public static void main(String[] args) {
		String msg = "This/is/a/java";
		//split()을 이용해서 java a is This 출력하기
		String[] arr = msg.split("/");
		for(int i = arr.length-1; i >= 0; i--) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		//This is a java ===> java a is This ==> avaja a si sihT
		for(int i = arr.length-1; i >= 0; i--) {
			for(int j = arr[i].length()-1; j>=0; j--) {
				System.out.print(arr[i].charAt(j));
			}
			System.out.print(" ");
		}
		System.out.println();
		
		String str = "Hi...Glad to meet you!!!!!";
		for(int i = 0; i < str.length(); i++) {
			System.out.print(str.charAt(i)+2);
		}
		System.out.println();
	}
}

java a is This
avaj a si sihT 
7410748484873110991023411811334111103103118341231131193535353535

 

아스키 코드 값을 숫자로 생각하고 +2한 결과

package com.day08;

public class StringTest04 {

	public static void main(String[] args) {
		String msg = "This/is/a/java";
		//split()을 이용해서 java a is This 출력하기
		String[] arr = msg.split("/");
		for(int i = arr.length-1; i >= 0; i--) {
			System.out.print(arr[i] + "\t");
		}
		System.out.println();
		
		//This is a java ===> java a is This ==> avaja a si sihT
		for(int i = arr.length-1; i >= 0; i--) {
			for(int j = arr[i].length()-1; j>=0; j--) {
				System.out.print(arr[i].charAt(j));
			}
			System.out.print(" ");
		}
		System.out.println();
		
		String str = "Hi...Glad to meet you!!!!!";
		for(int i = 0; i < str.length(); i++) {
			System.out.print((char)(str.charAt(i)+2));
		}
		System.out.println();
	}
}

java a is This
avaj a si sihT 
Jk000Incf"vq"oggv"{qw#####

 

StringExam01.java

// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력

package com.day08;

import java.util.Scanner;

public class StringExam01 {

	public static void main(String[] args) {
		// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			if (line.equals("exit"))
				break;
			String[] arr = line.split(" ");
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);

			}
			sc.close();
		}
	}
}

돌고 있는데 sc.close()를 해버려서 에러

package com.day08;

import java.util.Scanner;

public class StringExam01 {

	public static void main(String[] args) {
		// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			if (line.equals("exit"))
				break;
			String[] arr = line.split(" ");
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);

			}
		}
		sc.close();
	}
}

 

Exit를 입력했을 때는 종료가 안됨. 첫 글자가 대문자라서

package com.day08;

import java.util.Scanner;

public class StringExam01 {

	public static void main(String[] args) {
		// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			//if (line.equals("exit")) break;
			if(line.toLowerCase().equals("exit")) break; //또는 대문자로 바쭤주고 "EXIT"와 일치하면 break;
			String[] arr = line.split(" ");
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);

			}
		}
		sc.close();
	}
}

또는

package com.day08;

import java.util.Scanner;

public class StringExam01 {

	public static void main(String[] args) {
		// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			//if (line.equals("exit")) break;
			//if(line.toLowerCase().equals("exit")) break; //또는 대문자로 바쭤주고 "EXIT"와 일치하면 break;
			if(line.toUpperCase().equals("EXIT")) break;
			String[] arr = line.split(" ");
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);

			}
		}
		sc.close();
	}
}

또는

package com.day08;

import java.util.Scanner;

public class StringExam01 {

	public static void main(String[] args) {
		// split() 이용하여 입력한 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			//if (line.equals("exit")) break;
			//if(line.toLowerCase().equals("exit")) break; //또는 대문자로 바쭤주고 "EXIT"와 일치하면 break;
			//if(line.toUpperCase().equals("EXIT")) break;
			if(line.equalsIgnoreCase("exit")) break; //대, 소문자 구분하지 않겠다.
			String[] arr = line.split(" ");
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);
			}
		}
		sc.close();
	}
}

//배열 -> 순서에 의미를 두는 것, 중복 허용 -> 우리는 아직 중복을 구분하지 못함

 

break; 대신 system.exit(0); 써도 되긴 하지만 반복문을 벗어나는 것은 break;

그런데 여기서는 break;가 프로그램 종료의 의미로 쓰였기 때문에 대신 system.exti(0);을 써주어도 됨

 

split(); () 속 문자 등으로 구분 -> 이러한 기능을 구현한 클래스가 있다.

api > java.util > classes > StringTokenizer > 

생성자는 안에 문자열 인수가 있어야 한다.

 

구분자없으면 공백이 기준

 

 

 

 

 

 

StringTok.java

//클래스 이름을 StringTokenizer로 하면 안됨 -> 자바에서 만든 StringTokenizer를 사용하지 못함 : 자기 클래스가 우선이므로 클래스 내에서 StringTokenizer를찾음..

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공","/"); //앞의 문자를 /로 구분 -> 4개가 만들어질 것
		System.out.println(st.countTokens());
	}
}

4

 

//쉼표도 넣어 보면?

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공",",/"); //앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens());
	}
}

5

 

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공",",/"); //앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens());
		for(int i = 0; i < st.countTokens(); i++) {
			System.out.println(st.nextToken());
		}
	}
}

5
홍길동
장화
홍련

 

5
count : 5
홍길동
count : 4
장화
count : 3
홍련

 

token 수가 계속 줄어든다.

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공",",/"); //앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens()); //토큰의 수 : 5
		int len = st.countTokens();
		//홍길동 장화 홍련 팥쥐 주인공
		for(int i = 0; i < len; i++) { //i=0 i<5까지 돌아감, i=1 i<4, i=2 i<3
			System.out.println("count : " + st.countTokens());
			System.out.println(st.nextToken()); //홍길동                  장화     홍련
		}
	}
}

5
count : 5
홍길동
count : 4
장화
count : 3
홍련
count : 2
팥쥐
count : 1
주인공

 

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공", ",/"); // 앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens()); // 토큰의 수 : 5
		int len = st.countTokens();
		// 홍길동 장화 홍련 팥쥐 주인공
		// for(int i = 0; i < len; i++) { //i=0 i<5까지 돌아감, i=1 i<4, i=2 i<3
		// System.out.println("count : " + st.countTokens());
		// System.out.println(st.nextToken()); //홍길동 장화 홍련
		// } 이렇게 하는 것 보다는 while문 사용하는게 나음
		while (st.hasMoreTokens()) {
			System.out.println("count : " + st.countTokens());
			System.out.println(st.nextToken());
		}
	}
}

5
count : 5
홍길동
count : 4
장화
count : 3
홍련
count : 2
팥쥐
count : 1
주인공

StringTest03의 String tmp = "1 0 15 23 6 21 17 10 11 12 13 14"; 그대로 복사

//StringTokenizer을 이용해서 16진수, 8진수, 2진수 출력

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공", ",/"); // 앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens()); // 토큰의 수 : 5
		int len = st.countTokens();
		// 홍길동 장화 홍련 팥쥐 주인공
		// for(int i = 0; i < len; i++) { //i=0 i<5까지 돌아감, i=1 i<4, i=2 i<3
		// System.out.println("count : " + st.countTokens());
		// System.out.println(st.nextToken()); //홍길동 장화 홍련
		// } 이렇게 하는 것 보다는 while문 사용하는게 나음
		while (st.hasMoreTokens()) {
			System.out.println("count : " + st.countTokens());
			System.out.println(st.nextToken());
		}
		
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";
		//StringTokenizer을 이용해서 16진수, 8진수, 2진수 출력
		StringTokenizer stk = new StringTokenizer(tmp); //tmp 속 문자를 기본인 " " 으로 구분
		String hex="";
		String oct="";
		String bin="";
		while (stk.hasMoreTokens() ) {
			String value = stk.nextToken(); //1
			hex += Integer.toHexString(Integer.parseInt(value)) + " ";
			oct += Integer.toOctalString(Integer.parseInt(value)) + " ";
			bin += Integer.toBinaryString(Integer.parseInt(value)) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
	}
}

또는 간단하게

package com.day08;

import java.util.StringTokenizer;

public class StringTok {

	public static void main(String[] args) {
		StringTokenizer st = new StringTokenizer("홍길동,장화/홍련/팥쥐/주인공", ",/"); // 앞의 문자를 /와 ,로 구분
		System.out.println(st.countTokens()); // 토큰의 수 : 5
		int len = st.countTokens();
		// 홍길동 장화 홍련 팥쥐 주인공
		// for(int i = 0; i < len; i++) { //i=0 i<5까지 돌아감, i=1 i<4, i=2 i<3
		// System.out.println("count : " + st.countTokens());
		// System.out.println(st.nextToken()); //홍길동 장화 홍련
		// } 이렇게 하는 것 보다는 while문 사용하는게 나음
		while (st.hasMoreTokens()) {
			System.out.println("count : " + st.countTokens());
			System.out.println(st.nextToken());
		}
		
		String tmp = "1 0 15 23 6 21 17 10 11 12 13 14";
		//StringTokenizer을 이용해서 16진수, 8진수, 2진수 출력
		StringTokenizer stk = new StringTokenizer(tmp); //tmp 속 문자를 기본인 " " 으로 구분
		String hex="";
		String oct="";
		String bin="";
		while (stk.hasMoreTokens() ) {
		//	String value = stk.nextToken(); //1
			int value = Integer.parseInt(stk.nextToken());
			hex += Integer.toHexString(value) + " ";
			oct += Integer.toOctalString(value) + " ";
			bin += Integer.toBinaryString(value) + " ";
		}
		System.out.println("16진수 : " + hex); //16진수
		System.out.println("8진수 : " + oct); //8진수
		System.out.println("2진수 : " + bin); //2진수
	}
}

5
count : 5
홍길동
count : 4
장화
count : 3
홍련
count : 2
팥쥐
count : 1
주인공
16진수 : 1 0 f 17 6 15 11 a b c d e 
8진수 : 1 0 17 27 6 25 21 12 13 14 15 16 
2진수 : 1 0 1111 10111 110 10101 10001 1010 1011 1100 1101 1110 

 

StringExam01을 복사해서 StringExam02.java 만들기

package com.day08;

import java.util.Scanner;

public class StringExam02 {

	public static void main(String[] args) {
		// StringTokenizer() 이용하여 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			
			if(line.equalsIgnoreCase("exit")) break; //대, 소문자 구분하지 않겠다.
			//StringTokenizer stk 생성
			
			System.out.println("단어수 : " + arr.length);
			for (String word : arr) {
				System.out.println("단어 : " + word);
			}
		}
		sc.close();
	}
}

StringTokenizer로 바꿔보기

package com.day08;

import java.util.Scanner;
import java.util.StringTokenizer;

public class StringExam02 {

	public static void main(String[] args) {
		// StringTokenizer() 이용하여 문장의 단어와 총 단어 수 출력
		Scanner sc = new Scanner(System.in);
		while (true) {
			System.out.println("문장을 입력하세요. 종료는 exit >>");
			String line = sc.nextLine();
			
			if(line.equalsIgnoreCase("exit")) break; //대, 소문자 구분하지 않겠다.
			//StringTokenizer stk 생성
			StringTokenizer stk = new StringTokenizer(line);
			System.out.println("단어수 : " + stk.countTokens());
			while (stk.hasMoreTokens()) {
				System.out.println("단어 : " + stk.nextToken());
			}
		}
		sc.close();
	}
}

문장을 입력하세요. 종료는 exit >>
dskfjdskfj dskfjsdkfj  eorjeoiei dkfjdkfk fdkfjkd
단어수 : 5
단어 : dskfjdskfj
단어 : dskfjsdkfj
단어 : eorjeoiei
단어 : dkfjdkfk
단어 : fdkfjkd
문장을 입력하세요. 종료는 exit >>
dhfld kfddjkf eifhowe qperesak dkfdjfk
단어수 : 5
단어 : dhfld
단어 : kfddjkf
단어 : eifhowe
단어 : qperesak
단어 : dkfdjfk
문장을 입력하세요. 종료는 exit >>
exit

 

StringBuilderTest.java

//String : 정적클래스로 한 번 만들어지면 변경 안 됨 -> 바꾸면 없어지고 새로 만들어짐
//내용이 자꾸 바뀔것 같으면 String같은 정적 클래스 사용 시 : 부하가 많이 걸림
//정적 클래스가 아닌 동적 클래스로 만들어 주자.

StringBuffer : 동기화 -> 조금 더 안정적임 -> 그러나 속도 등에서 보면 Builder를 쓰는 것이 더 낫다

StringBuilder

package com.day08;

public class StringBuilderTest {

	public static void main(String[] args) {
		//String : 정적클래스로 한 번 만들어지면 변경 안 됨 -> 바꾸면 없어지고 새로 만들어짐
		//내용이 자꾸 바뀔것 같으면 String같은 정적 클래스 사용 시 : 부하가 많이 걸림
		//정적 클래스가 아닌 동적 클래스로 만들어 주자.
		String str = "Hi.. Glad to meet you!!";
		StringBuilder sb = new StringBuilder(str);
		System.out.println(sb);		
	}

}

Hi.. Glad to meet you!!

 

package com.day08;

public class StringBuilderTest {

	public static void main(String[] args) {
		//String : 정적클래스로 한 번 만들어지면 변경 안 됨 -> 바꾸면 없어지고 새로 만들어짐
		//내용이 자꾸 바뀔것 같으면 String같은 정적 클래스 사용 시 : 부하가 많이 걸림
		//정적 클래스가 아닌 동적 클래스로 만들어 주자.
		String str = "Hi.. Glad to meet you!!";
		StringBuilder sb = new StringBuilder(str);
		System.out.println(sb);
		System.out.println("길이 : " + sb.length());
	}

}

Hi.. Glad to meet you!!
길이 : 23

 

package com.day08;

public class StringBuilderTest {

	public static void main(String[] args) {
		//String : 정적클래스로 한 번 만들어지면 변경 안 됨 -> 바꾸면 없어지고 새로 만들어짐
		//내용이 자꾸 바뀔것 같으면 String같은 정적 클래스 사용 시 : 부하가 많이 걸림
		//정적 클래스가 아닌 동적 클래스로 만들어 주자.
		String str = "Hi.. Glad to meet you!!";
		StringBuilder sb = new StringBuilder(str); //얘는 내용이 바뀌어질 수 있음
		System.out.println(sb);
		System.out.println("길이 : " + sb.length());
		System.out.println("반대로 출력 : " + sb.reverse()); //바뀐대로 들어감
		sb.append("java");
		System.out.println(sb);
		sb.insert(2, "oracle");
		System.out.println(sb);
		sb.replace(2, 4, "  database  ");
		System.out.println(sb);
		sb.delete(2, 6);
		System.out.println(sb);
		System.out.println(sb.charAt(5));
	}
}

Hi.. Glad to meet you!!
길이 : 23
반대로 출력 : !!uoy teem ot dalG ..iH
!!uoy teem ot dalG ..iHjava
!!oracleuoy teem ot dalG ..iHjava
!!  database  acleuoy teem ot dalG ..iHjava
!!tabase  acleuoy teem ot dalG ..iHjava
a

 

따라서 계속 변하는 내용은 정적 클래스 String이 아니라 동적 클래스 Stringbuilder 같은 것으로 사용해주기

 

EncTest.java

package com.day08;

public class EncTest {

	public static void main(String[] args) {
		EncTest enc = new EncTest();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); //+2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); //-2
	}
}

오류 없도록 만들기

package com.day08;

public class EncTest {
	
	public String encrypt(String msg) {
		return null;
	}
	
	private String decrypt(String msg) {
		return null;
	}

	public static void main(String[] args) {
		EncTest enc = new EncTest();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); //+2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); //-2
	}
}

암호화 전 : Hi.. Glad to meet you!!!
암호화 후 : null
복호화 후 : null

 

오류 사라지고 실행 됨 : 암호화 2씩 증가, 복호화 2씩 감소 시키기(StringTest04.java 참고)

현재 msg 에는 Hi.. Glad to meet you!! 들어있음

 

package com.day08;

public class EncTest {
	
	public String encrypt(String msg) {
		String result = "";
		for(int i = 0; i < msg.length(); i++) {
			result += (char)(msg.charAt(i)+2);
		}
		return result;
	}
	
	private String decrypt(String msg) {
		String result = "";
		for(int i = 0; i < msg.length(); i++) {
			result += (char)(msg.charAt(i)-2);
		}
		return result;
	}

	public static void main(String[] args) {
		EncTest enc = new EncTest();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); //+2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); //-2
	}
}

암호화 전 : Hi.. Glad to meet you!!!
암호화 후 : Jk00"Incf"vq"oggv"{qw###
복호화 후 : Hi.. Glad to meet you!!!

 

조건 : 공백은 +2하지 않고 그대로 출력

 

package com.day08;

public class EncTest {

	public String encrypt(String msg) {
		// 단, 공백은 그대로 출력 -> 공백이 아닐 때만 +2
		String result = "";
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				result += msg.charAt(i); //charAt()은 문자 하나 리턴(문자 하나는 ' ' 홑따옴표)
			} else {
				result += (char) (msg.charAt(i) + 2);
			}
		}
		return result;
	}

	private String decrypt(String msg) {
		String result = "";
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				result += msg.charAt(i); //charAt()은 문자 하나 리턴(문자 하나는 ' ' 홑따옴표)
			} else {
				result += (char) (msg.charAt(i) - 2);
			}
		}
		return result;
	}

	public static void main(String[] args) {
		EncTest enc = new EncTest();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); // +2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); // -2
	}
}

암호화 전 : Hi.. Glad to meet you!!!
암호화 후 : Jk00 Incf vq oggv {qw###
복호화 후 : Hi.. Glad to meet you!!!

 

EncTest2.java -> EncTest.java 복사

package com.day08;

public class EncTest2 {

	public String encrypt(String msg) {
		// 단, 공백은 그대로 출력 -> 공백이 아닐 때만 +2
		//String result = "";
		//StringBuilder 사용
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				result += msg.charAt(i); //charAt()은 문자 하나 리턴(문자 하나는 ' ' 홑따옴표)
			} else {
				result += (char) (msg.charAt(i) + 2);
			}
		}
		return result;
	}

	private String decrypt(String msg) {
		//String result = "";
		//StringBuilder 사용
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				result += msg.charAt(i); //charAt()은 문자 하나 리턴(문자 하나는 ' ' 홑따옴표)
			} else {
				result += (char) (msg.charAt(i) - 2);
			}
		}
		return result;
	}

	public static void main(String[] args) {
		EncTest2 enc = new EncTest2();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); // +2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); // -2
	}
}

==> StringBuilder 사용해서 바꾸기

package com.day08;

public class EncTest2 {

	public String encrypt(String msg) {
		// 단, 공백은 그대로 출력 -> 공백이 아닐 때만 +2
		//String result = "";
		//StringBuilder 사용
		//StringBuilder sb = new StringBuilder(msg); 또는 추가(append)시킬거니까 msg 안적고 () 만 적어도 됨
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				sb.append(msg.charAt(i));
			} else {
				sb.append((char)(msg.charAt(i)+2));
			}
		}
		return sb.toString();
	}

	private String decrypt(String msg) {
		//String result = "";
		//StringBuilder 사용
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < msg.length(); i++) {
			if (msg.charAt(i) == ' ') {
				sb.append(msg.charAt(i));
			} else {
				sb.append((char)(msg.charAt(i)-2));
			}
		}
		return sb.toString();
	}

	public static void main(String[] args) {
		EncTest2 enc = new EncTest2();
		String msg = "Hi.. Glad to meet you!!!";
		System.out.println("암호화 전 : " + msg);
		String str = enc.encrypt(msg); // +2
		System.out.println("암호화 후 : " + str);
		System.out.println("복호화 후 : " + enc.decrypt(str)); // -2
	}
}

암호화 전 : Hi.. Glad to meet you!!!
암호화 후 : Jk00 Incf vq oggv {qw###
복호화 후 : Hi.. Glad to meet you!!!

 

MathEx.java

package com.day08;

public class MathEx {

	public static void main(String[] args) {
		double a = Math.PI;
		System.out.println(a); //원주율
		System.out.println(Math.ceil(a)); //올림
		System.out.println(Math.floor(a)); //버림
		System.out.println(Math.round(a)); //반올림
		System.out.println(Math.round(3.6)); //반올림
		System.out.println(Math.sqrt(9)); //제곱근
		System.out.println(Math.exp(2)); //e의 2승
		//난수(0~1사이 난수)
		System.out.println(Math.random());
	}
}

3.141592653589793
4.0
3.0
3
4
3.0
7.38905609893065
0.9152348924275858

 


조퇴 후 수업내용

 


CalendarEx.java

api > java.util > Classes > Calendar

캘린더(날짜와 관련됨)라는 클래스는 추상 클래스로, 추상 클래스는 생성할 수 없다 -> 아래의 getInstance()같은 함수를 이용해서 Calendar라는객체를 만든다

인자가 없을 수도 있고

 

Locale, TimeZone 같은 인자를 받을 수도 있다.

 

 

 

=> static이므로 new라는 이름으로 객체를 객성하지 않고 getInstance(~)같은 함수를 이용해서 static Calendar라는 객체를 return 시킨다.

 

package com.day08;

import java.util.Calendar;

public class CalendarEx {

	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성X -> 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}

}

-> 더 입력

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}

}

 

-> 더 입력

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH);
		System.out.println(msg + " : " + year + "/" + month);
		
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}

}

현재 :  : 2021/0

달은 0부터 count 함 -> 1월  : 0 -> +1을 해주어야 우리가 아는 달로 표시 가능

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH)+1; //0부터 시작하므로 +1 해주어야 함
		int day = cal.get(Calendar.DAY_OF_MONTH);//한 달에 몇 번째
		System.out.println(msg + " : " + year + "/" + month + "/" + day);
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}
}

현재 :  : 2021/1/21

- 현재 연, 월, 일이 나왔다!

 

-> 요일 구하기

int dayOfweek = cal.get(Calendar.DAY_OF_WEEK);
System.out.println("요일 : " + dayOfweek);

요일 : 5

우리가 아는 대로 '목요일' 이라고 알려주지 않고 int형으로 알려준다.

문자형으로 바꾸어 주자 : switch문 이용

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int dayOfweek = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println("요일 : " + dayOfweek); //int형으로, 숫자로 요일 알려줌, 일요일~토요일 : 1~7
		switch(dayOfweek) {
		case 1 : System.out.println("일요일"); break;
		case 2 : System.out.println("월요일"); break;
		case 3 : System.out.println("화요일"); break;
		case 4 : System.out.println("수요일"); break;
		case 5 : System.out.println("목요일"); break;
		case 6 : System.out.println("금요일"); break;
		case 7 : System.out.println("토요일"); break;
		}
	}
	
	public static void main(String[] args) {
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}
}

요일 : 5
목요일

 

그러나 우리가 1이 일요일이다 이런걸 모를 수도 있음! 따라서 다른 방법으로 적어줘보자

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH)+1; //0부터 시작하므로 +1 해주어야 함
		int day = cal.get(Calendar.DAY_OF_MONTH);//한 달에 몇 번째
		int dayOfweek = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println(msg + " : " + year + "/" + month + "/" + day);
		System.out.println("요일 : " + dayOfweek); //int형으로, 숫자로 요일 알려줌, 일요일~토요일 : 1~7
		switch(dayOfweek) {
		case Calendar.SUNDAY : System.out.println("일요일"); break;
		case Calendar.MONDAY : System.out.println("월요일"); break;
		case Calendar.TUESDAY : System.out.println("화요일"); break;
		case Calendar.WEDNESDAY : System.out.println("수요일"); break;
		case Calendar.THURSDAY : System.out.println("목요일"); break;
		case Calendar.FRIDAY : System.out.println("금요일"); break;
		case Calendar.SATURDAY : System.out.println("토요일"); break;
		}
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}
}

현재 :  : 2021/1/21
요일 : 5
목요일

 

또 다른 방법 : 배열 이용하기

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH)+1; //0부터 시작하므로 +1 해주어야 함
		int day = cal.get(Calendar.DAY_OF_MONTH);//한 달에 몇 번째
		int dayOfweek = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println(msg + " : " + year + "/" + month + "/" + day);
		System.out.println("요일 : " + dayOfweek); //int형으로, 숫자로 요일 알려줌, 일요일~토요일 : 1~7
		switch(dayOfweek) {
		case Calendar.SUNDAY : System.out.println("일요일"); break;
		case Calendar.MONDAY : System.out.println("월요일"); break;
		case Calendar.TUESDAY : System.out.println("화요일"); break;
		case Calendar.WEDNESDAY : System.out.println("수요일"); break;
		case Calendar.THURSDAY : System.out.println("목요일"); break;
		case Calendar.FRIDAY : System.out.println("금요일"); break;
		case Calendar.SATURDAY : System.out.println("토요일"); break;
		}
		//배열로 int형으로 출력된 요일을 우리가 아는 문자로 바꾸기
		String[] days = {"일", "월", "화", "수", "목", "금", "토"};
		System.out.println("배열요일 : " + days[dayOfweek-1]);
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌 
	}
}

현재 :  : 2021/1/21
요일 : 5
목요일
배열요일 : 목

 

배열로 구할 때는 일요일을 맨 앞에 넣어주기!

static은 클래스 이름으로 접근 가능 -> new로 객체를 만들지 않고 그냥 부르면 됨.

CalendarEx. 이렇게 

 

항상 매개변수는 위치와 형을 정확하게 매치 시켜주면 된다.

오전 : 0, 오후 : 1

 

특정 날짜 구하기

- 객체 만들고, 날짜 지정 후 출력

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
	
	}
	
	public static void main(String[] args) {
		
		//특정 날짜 구하기
		Calendar someday = Calendar.getInstance();
		someday.set(2020, 11, 25);
		CalendarEx.printCalendar("어느 날 ", someday);
	}
}

어느 날  : 2020/12/25
요일 : 6
금요일
배열요일 : 금

=================
7 : 51 : 20 : 666
ampm : 1
오후

 

아 월은 0부터 시작하니까 2020 11 25 라고 하면 작년인 20/12/25이고 그 날은 금요일.

시간은 따로 정해주지 않아서 현재 내 시간 나옴

 

package com.day08;

import java.util.Calendar;

public class CalendarEx {
	public static void printCalendar(String msg, Calendar cal) { //static을 쓰지 않으려면 CalendarEx에 대한 객체를 만들면 되는데 현재는 만들지 않은 상태라서 static이라고 써줘야 함
		int year = cal.get(Calendar.YEAR);
		int month = cal.get(Calendar.MONTH)+1; //0부터 시작하므로 +1 해주어야 함
		int day = cal.get(Calendar.DAY_OF_MONTH);//한 달에 몇 번째
		int dayOfweek = cal.get(Calendar.DAY_OF_WEEK);
		System.out.println(msg + " : " + year + "/" + month + "/" + day);
		System.out.println("요일 : " + dayOfweek); //int형으로, 숫자로 요일 알려줌, 일요일~토요일 : 1~7
		switch(dayOfweek) {
		case Calendar.SUNDAY : System.out.println("일요일"); break;
		case Calendar.MONDAY : System.out.println("월요일"); break;
		case Calendar.TUESDAY : System.out.println("화요일"); break;
		case Calendar.WEDNESDAY : System.out.println("수요일"); break;
		case Calendar.THURSDAY : System.out.println("목요일"); break;
		case Calendar.FRIDAY : System.out.println("금요일"); break;
		case Calendar.SATURDAY : System.out.println("토요일"); break;
		}
		//배열로 int형으로 출력된 요일을 우리가 아는 문자로 바꾸기
		String[] days = {"일", "월", "화", "수", "목", "금", "토"};
		System.out.println("배열요일 : " + days[dayOfweek-1]);
		System.out.println("=================");
		
		int hour = cal.get(Calendar.HOUR); //Caldenar라는 객체에 HOUR라는게 있다.
		int min = cal.get(Calendar.MINUTE);
		int sec = cal.get(Calendar.SECOND);
		int millis = cal.get(Calendar.MILLISECOND); // 1sec = 1000ms
		int ampm = cal.get(Calendar.AM_PM);
		System.out.println(hour + " : " + min + " : " + sec + " : " + millis);
		System.out.println("ampm : " + ampm);
		if(ampm == Calendar.AM) {
			System.out.println("오전");
		} else { //ampm = Calendar.PM
			System.out.println("오후");
		}
	}
	
	public static void main(String[] args) {
		
		Calendar now = Calendar.getInstance(); //new로 생성하지 않고 now라는 객체 만듦 -> 아무 조건을 주지 않았기 때문에 현재 날짜 알려줌
		CalendarEx.printCalendar("현재 : ", now); //이건 강사님이 만든 것, 클래스 이름으로 접근 -> 6번에 적어줌
		
		//특정 날짜 구하기
		Calendar someday = Calendar.getInstance();
		someday.set(2020, 11, 25);
		CalendarEx.printCalendar("어느 날 ", someday);
	}
}

현재 :  : 2021/1/21
요일 : 5
목요일
배열요일 : 목
=================
7 : 51 : 20 : 648
ampm : 1
오후
어느 날  : 2020/12/25
요일 : 6
금요일
배열요일 : 금
=================
7 : 51 : 20 : 666
ampm : 1
오후

 

아~ 이런 것이 있구나~ 정도만 알고 기억이 안나면 나중에 찾아서 쓰면 된다!

 

CalendarTest.java 생년월일을 입력 받아서 나이, 태어난 요일을 알려주기

package com.day08;

import java.util.Scanner;

public class CalendarTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//생년월일 입력 받기
		System.out.println("생년월일 입력(yyyyMMdd >>"); //19801115 이런 식으로 입력
		String birth = sc.next(); //19801115
		
		//나이, 성별, 태어난 요일 알려주기
		System.out.println("나이 : "); //2021-1980
		System.out.println("성별 : ");
		System.out.println("태어난 날의 요일 : ");
	}
}

==>

package com.day08;

import java.util.Calendar;
import java.util.Scanner;

public class CalendarTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//생년월일 입력 받기
		System.out.println("생년월일 입력(yyyyMMdd) >>"); //19801115 이런 식으로 입력
		
		Calendar today = Calendar.getInstance();
		
		String birth = sc.next(); //19801115 -> 문자열로 받는 것이 나음
		//나이, 성별, 태어난 요일 알려주기
		
		int year = Integer.parseInt(birth.substring(0,4));//1980 연도만 추출한 뒤 문자형 -> int형으로 변경해주기
		System.out.println("나이 : " + (today.get(Calendar.YEAR)-year)); //올해연도-입력받은 년도
		int month = Integer.parseInt(birth.substring(4,6));
		int day = Integer.parseInt(birth.substring(6,8));
		
		Calendar birthday = Calendar.getInstance();
		birthday.set(year, month-1, day);
		
		String[] arr = {"일","월","화","수","목","금","토"};
		
		System.out.println("태어난 요일 : " + arr[birthday.get(Calendar.DAY_OF_WEEK)-1]);//0부터 카운트 되므로 -> 금요일이면 6을 알려줬을 것. 위의 배열에서 금요일의 위치는 5이므로 -1해줘야 함
	}
}

생년월일 입력(yyyyMMdd) >>
20201225
나이 : 1
태어난 요일 : 금

 

ObjectPropertyEx.java

package com.day08;

class Point{
	private int x;
	private int y;
	public Point(int x, int y) { //생성자
		this.x = x;
		this.y = y;
	}
}

public class ObjectPropertyEx {
	
	public static void main(String[] args) {
		Point p = new Point(2, 3); //Point 객체 만들기
		ObjectPropertyEx.print(p); //클래스 이름으로 print에 접근했다? -> static으로 만들겠다는 소리
	}

}

 

package com.day08;

class Point{
	private int x;
	private int y;
	public Point(int x, int y) { //생성자
		this.x = x;
		this.y = y;
	}
}

public class ObjectPropertyEx {
	public static void print(Object obj) { //return값 없음 : void
		System.out.println(obj.getClass().getName()); //클래스 객체를 가져와서 이름 출력 -> com.day08.Point : 클래스를 가져오는 방법
		System.out.println(obj.hashCode()); //p.363  index처럼 주소값 알려줌 -> 1435084085
		System.out.println(obj); //com.day08.Point@5594a1b5 -> getClass().getName() + @ + hashCode(); 16진수로 바꿔서 표현
		System.out.println(obj.toString());//com.day08.Point@5594a1b5 -> 이렇게 주소값을 찍어주기보다는 toString을 오버라이드해서 객체에 대한 정보를 알아보기 쉽게 알려주기
	}
	
	public static void main(String[] args) {
		Point p = new Point(2, 3); //Point 객체 만들기
		ObjectPropertyEx.print(p); //클래스 이름으로 print에 접근했다? -> static으로 만들겠다는 소리
	}

}

 

com.day08.Point
1435804085
com.day08.Point@5594a1b5
com.day08.Point@5594a1b5

package com.day08;

class Point{
	private int x;
	private int y;
	public Point(int x, int y) { //생성자
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
}

public class ObjectPropertyEx {
	public static void print(Object obj) { //return값 없음 : void
		System.out.println(obj.getClass().getName()); //클래스 객체를 가져와서 이름 출력 -> com.day08.Point : 클래스를 가져오는 방법
		System.out.println(obj.hashCode()); //p.363  index처럼 주소값 알려줌 -> 1435084085
		System.out.println(obj); //com.day08.Point@5594a1b5 -> getClass().getName() + @ + hashCode(); 16진수로 바꿔서 표현
		System.out.println(obj.toString());//com.day08.Point@5594a1b5 -> 이렇게 주소값을 찍어주기보다는 toString을 오버라이드해서 객체에 대한 정보를 알아보기 쉽게 알려주기
	}
	
	public static void main(String[] args) {
		Point p = new Point(2, 3); //Point 객체 만들기
		ObjectPropertyEx.print(p); //클래스 이름으로 print에 접근했다? -> static으로 만들겠다는 소리
	}

}
com.day08.Point
1435804085
(2,3)
(2,3)

기본적으로 obj는 toString을 부르기 때문에 System.out.println(obj); 했을 때 오버라이딩 전처럼 com.day08.Point@5594a1b5이 나오는게 아니라 둘 다 toString을 오버라이딩 한 후 값인 (2,3)이 나오는 것

 

p와 p2는 같다고 할 수 있을까?

아무것도 출력되지 않음

package com.day08;

class Point{
	private int x;
	private int y;
	public Point(int x, int y) { //생성자
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
}

public class ObjectPropertyEx {
	public static void print(Object obj) { //return값 없음 : void
		System.out.println(obj.getClass().getName()); //클래스 객체를 가져와서 이름 출력 -> com.day08.Point : 클래스를 가져오는 방법
		System.out.println(obj.hashCode()); //p.363  index처럼 주소값 알려줌 -> 1435084085
		System.out.println(obj); //com.day08.Point@5594a1b5 -> getClass().getName() + @ + hashCode(); 16진수로 바꿔서 표현
		System.out.println(obj.toString());//com.day08.Point@5594a1b5 -> 이렇게 주소값을 찍어주기보다는 toString을 오버라이드해서 객체에 대한 정보를 알아보기 쉽게 알려주기
	}
	
	public static void main(String[] args) {
		Point p = new Point(2, 3); //Point 객체 만들기
		ObjectPropertyEx.print(p); //클래스 이름으로 print에 접근했다? -> static으로 만들겠다는 소리
		Point p1 = new Point(2, 3);
		Point p2 = new Point(3, 4); //p와 p1은 같다고 할 수 있을까?
		if(p==p1) { //당연히 주소 다름
			System.out.println("p==p1");
		} if(p.equals(p1)) { //p와 p1의 내용 비교 -> 객체의 내용이 같을 때 같다고 함 -> 어디까지가 객체인가? -> 두 사람이 같다는 것은 성적이 같다? 평균이 같다? 키가 같다? 같다는 말이 애매모호하다. -> equals라는 걸 재정의해줄 필요가 있다 -> equals를 오버라이딩 시키자.
			System.out.println("p equals p1");
		} if(p.equals(p2)) {
			System.out.println("p equals p2");
		}
	}
}

 

p와 p1은 당연히 주소 다름

-> 출력X

p와 p1의 객체의 내용이 같은가?

p와 p2의 객체의 내용이 같은가?

 

 

 

equals

어디까지가 객체인가? -> 두 사람이 같다는 것은 성적이 같다? 평균이 같다? 키가 같다? 같다는 말이 애매모호하다. -> equals라는 걸 재정의해줄 필요가 있다 -> equals를 오버라이딩 시키자.

 

package com.day08;

class Point{
	private int x;
	private int y;
	public Point(int x, int y) { //생성자
		this.x = x;
		this.y = y;
	}
	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
	
	@Override
	public boolean equals(Object obj) {//Object로 받음 -> 특정 객체, ex Point 로 변환 되어져야 함
		// 두 좌표가 같다면 같은 걸로 정의해주어야 같은지 다른지 비교가 가능
		Point p = (Point) obj;
		if(x==p.x && y==p.y) return true;
		else return false;
	} //equals는 Object가 가지고 있는 것이기 때문에 오버라이딩 할 수 있다.
}

public class ObjectPropertyEx {
	public static void print(Object obj) { //return값 없음 : void
		System.out.println(obj.getClass().getName()); //클래스 객체를 가져와서 이름 출력 -> com.day08.Point : 클래스를 가져오는 방법
		System.out.println(obj.hashCode()); //p.363  index처럼 주소값 알려줌 -> 1435084085
		System.out.println(obj); //com.day08.Point@5594a1b5 -> getClass().getName() + @ + hashCode(); 16진수로 바꿔서 표현
		System.out.println(obj.toString());//com.day08.Point@5594a1b5 -> 이렇게 주소값을 찍어주기보다는 toString을 오버라이드해서 객체에 대한 정보를 알아보기 쉽게 알려주기
	}
	
	public static void main(String[] args) {
		Point p = new Point(2, 3); //Point 객체 만들기
		ObjectPropertyEx.print(p); //클래스 이름으로 print에 접근했다? -> static으로 만들겠다는 소리
		Point p1 = new Point(2, 3);
		Point p2 = new Point(3, 4); //p와 p1은 같다고 할 수 있을까?
		if(p==p1) { //당연히 주소 다름
			System.out.println("p==p1");
		} if(p.equals(p1)) { //p와 p1의 내용 비교 -> 객체의 내용이 같을 때 같다고 함 -> 어디까지가 객체인가? -> 두 사람이 같다는 것은 성적이 같다? 평균이 같다? 키가 같다? 같다는 말이 애매모호하다. -> equals라는 걸 재정의해줄 필요가 있다 -> equals를 오버라이딩 시키자.
			System.out.println("p equals p1");
		} if(p.equals(p2)) {
			System.out.println("p equals p2");
		}
	}
}

com.day08.Point 
1435804085 
(2,3) 
(2,3) 
p equals p1

 

equals는 Object가 가지고 있는 것이기 때문에 오버라이딩 할 수 있다.

 


 

상속 예제

ShapeMain.java

 

package com.day08;

import java.util.Scanner;

class ShapeManager {
	//도형 입력(원 또는 사각형) -> 원 : 중심좌표 x, y와 반지름 r 입력받고, 사각형 : x, y, 가로와 세로 w, h
	public void inputData(int choice) { //choice가 1이면 원, 2이면 사각형
		System.out.println("도형입력...");
		System.out.println("x좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int x = ShapeMain.sc.nextInt();
		System.out.println("y좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int y = ShapeMain.sc.nextInt();
		if(choice == 1) { //원
			System.out.println("반지름 >> ");
			int r = ShapeMain.sc.nextInt();
		} else if(choice == 2) { //사각형
			System.out.println("가로 폭 >> ");
			int w = ShapeMain.sc.nextInt();
			System.out.println("세로 높이 >> ");
			int h = ShapeMain.sc.nextInt();
		}
	}
	public void viewData() {
		
	}
}

public class ShapeMain {
	static Scanner sc = new Scanner(System.in);
	static void showMenu() {
		System.out.println("선택하세요");
		System.out.println("1.원, 2.사각형, 3.보기, 4.종료");
	}
	
	public static void main(String[] args) {
		ShapeManager sm = new ShapeManager();
		
		while(true) { //언제까지 돌릴지 모르니까 while(true)
			ShapeMain.showMenu(); //일부러 static으로 접근
			int choice = ShapeMain.sc.nextInt();
			switch(choice) {
			case 1 : //원 -> 어차피 아래 inputData()로 내려가니까 적어주지 않음
			case 2 : sm.inputData(choice); break; //1, 2둘 다 inputData();
			case 3 : sm.viewData(); break;
			case 4 : System.out.println("종료");
					 System.exit(0);
			default : System.out.println("입력오류");
			}
			
		}
	}
}

 

여기까지 함께 입력하고 조건을 주면 혼자 해보기

ArrayList 이용

원 ==> Circle

사각형 ==> Square

부모 ==> Shape

출력 : 입력한 좌표 x, y +원 : 반지름r, 사각형 : 가로 세로 w, h까지 출력

 

==> ArrayList 만들고 객체를 원, 사각형 만들고 이 두개를 아우르는 부모 Shape 까지 합해서 3개의 클래스(Circle, Square, Shape) 만들기

package com.day08;

import java.util.ArrayList;
import java.util.Scanner;
//ArrayList 이용 -> 매니저가 가지고 있어야 함
// 원 ==> Circle
// 사각형 ==> Square
// 부모 ==> Shape
// 출력 : 입력한 x, y좌표 + 원이면 반지름 r까지, 사각형이면 가로 세로 w, h까지 출력
class Shape {
	private int x, y; //자식이 공통으로 가지는 것
	public Shape(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

class Circle extends Shape {
	private int r; //공통으로 가지는 것 외에 자기만 가지는 것 : 반지름 r
	public Circle(int x, int y, int r) {//x, y는 부모가 가지고 있음
		super(x,y);
		this.r = r;
	}
}

class Square extends Shape {
	private int w, h; //공통으로 가지는 것 외에 자기만 가지는 것 : 가로 w, 세로 h
	public Square(int x, int y, int w, int h) { //x, y는 부모가 가지고 있음
	super(x,y);
	this.w = w;
	this.h = h;
	}
}

class ShapeManager {
	//도형 입력(원 또는 사각형) -> 원 : 중심좌표 x, y와 반지름 r 입력받고, 사각형 : x, y, 가로와 세로 w, h
	ArrayList<Shape> alist = new ArrayList<>(); //alist는 Circle형과 Square형을 아우르는 부모 Shape형을 가져야 한다
	
	public void inputData(int choice) { //choice가 1이면 원, 2이면 사각형
		System.out.println("도형입력...");
		System.out.println("x좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int x = ShapeMain.sc.nextInt();
		System.out.println("y좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int y = ShapeMain.sc.nextInt();
		if(choice == 1) { //원
			System.out.println("반지름 >> ");
			int r = ShapeMain.sc.nextInt();
			alist.add(new Circle(x,y,r)); //인자 있는 생성자 필요 -> 16번
		} else if(choice == 2) { //사각형
			System.out.println("가로 폭 >> ");
			int w = ShapeMain.sc.nextInt();
			System.out.println("세로 높이 >> ");
			int h = ShapeMain.sc.nextInt();
			alist.add(new Square(x,y,w,h));
		}
	}
	
	public void viewData() {

	}
}

public class ShapeMain {
	static Scanner sc = new Scanner(System.in);
	static void showMenu() {
		System.out.println("선택하세요");
		System.out.println("1.원, 2.사각형, 3.보기, 4.종료");
	}
	
	public static void main(String[] args) {
		ShapeManager sm = new ShapeManager();
		
		while(true) { //언제까지 돌릴지 모르니까 while(true)
			ShapeMain.showMenu(); //일부러 static으로 접근
			int choice = ShapeMain.sc.nextInt();
			switch(choice) {
			case 1 : //원 -> 어차피 아래 inputData()로 내려가니까 적어주지 않음
			case 2 : sm.inputData(choice); break; //1, 2둘 다 inputData();
			case 3 : sm.viewData(); break;
			case 4 : System.out.println("종료");
					 System.exit(0);
			default : System.out.println("입력오류");
			}
		}
	}
}

 

이제 viewData() 남음!

이렇게 해주면 x, y만 출력 가능.. 

그러나 Circle은 r도 출력해야하고 Square은 w, h도 출력 해야 함 -> print()를 오버라이딩 시켜주기!

package com.day08;

import java.util.ArrayList;
import java.util.Scanner;
//ArrayList 이용 -> 매니저가 가지고 있어야 함
// 원 ==> Circle
// 사각형 ==> Square
// 부모 ==> Shape
// 출력 : 입력한 x, y좌표 + 원이면 반지름 r까지, 사각형이면 가로 세로 w, h까지 출력
class Shape {
	private int x, y; //자식이 공통으로 가지는 것
	public Shape(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public void print() {
		System.out.println("좌표(x,y) = " + x + "," + y);
	}
}

class Circle extends Shape {
	private int r; //공통으로 가지는 것 외에 자기만 가지는 것 : 반지름 r
	public Circle(int x, int y, int r) {//x, y는 부모가 가지고 있음
		super(x,y);
		this.r = r;
	}
	@Override
	public void print() {
		super.print();
		System.out.println("반지름 : " + r);
	}
}

class Square extends Shape {
	private int w, h; //공통으로 가지는 것 외에 자기만 가지는 것 : 가로 w, 세로 h
	public Square(int x, int y, int w, int h) { //x, y는 부모가 가지고 있음
	super(x,y);
	this.w = w;
	this.h = h;
	}
	@Override
	public void print() {
		super.print();
		System.out.println("가로 : " + w + "세로 : " + h );
	}
}

class ShapeManager {
	//도형 입력(원 또는 사각형) -> 원 : 중심좌표 x, y와 반지름 r 입력받고, 사각형 : x, y, 가로와 세로 w, h
	ArrayList<Shape> alist = new ArrayList<>(); //alist는 Circle형과 Square형을 아우르는 부모 Shape형을 가져야 한다
	
	public void inputData(int choice) { //choice가 1이면 원, 2이면 사각형
		System.out.println("도형입력...");
		System.out.println("x좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int x = ShapeMain.sc.nextInt();
		System.out.println("y좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int y = ShapeMain.sc.nextInt();
		if(choice == 1) { //원
			System.out.println("반지름 >> ");
			int r = ShapeMain.sc.nextInt();
			alist.add(new Circle(x,y,r)); //인자 있는 생성자 필요 -> 16번
		} else if(choice == 2) { //사각형
			System.out.println("가로 폭 >> ");
			int w = ShapeMain.sc.nextInt();
			System.out.println("세로 높이 >> ");
			int h = ShapeMain.sc.nextInt();
			alist.add(new Square(x,y,w,h));
		}
	}
	
	public void viewData() {
		for(Shape s : alist) {
			s.print(); //좌표 두개는 부모가 가지고 있다. -> Shape에 print() 추가 해주기
		}
	}
}

public class ShapeMain {
	static Scanner sc = new Scanner(System.in);
	static void showMenu() {
		System.out.println("선택하세요");
		System.out.println("1.원, 2.사각형, 3.보기, 4.종료");
	}
	
	public static void main(String[] args) {
		ShapeManager sm = new ShapeManager();
		
		while(true) { //언제까지 돌릴지 모르니까 while(true)
			ShapeMain.showMenu(); //일부러 static으로 접근
			int choice = ShapeMain.sc.nextInt();
			switch(choice) {
			case 1 : //원 -> 어차피 아래 inputData()로 내려가니까 적어주지 않음
			case 2 : sm.inputData(choice); break; //1, 2둘 다 inputData();
			case 3 : sm.viewData(); break;
			case 4 : System.out.println("종료");
					 System.exit(0);
			default : System.out.println("입력오류");
			}
		}
	}
}

선택하세요
1.원, 2.사각형, 3.보기, 4.종료
1
도형입력...
x좌표 >> 
3
y좌표 >> 
4
반지름 >> 
3
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
2
도형입력...
x좌표 >> 
1
y좌표 >> 
2
가로 폭 >> 
3
세로 높이 >> 
1
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
1
도형입력...
x좌표 >> 
4
y좌표 >> 
6
반지름 >> 
4
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
2
도형입력...
x좌표 >> 
2
y좌표 >> 
3
가로 폭 >> 
4
세로 높이 >> 
2
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
3
좌표(x,y) = 3,4
반지름 : 3
좌표(x,y) = 1,2
가로 : 3세로 : 1
좌표(x,y) = 4,6
반지름 : 4
좌표(x,y) = 2,3
가로 : 4세로 : 2
선택하세요
1.원, 2.사각형, 3.보기, 4.종료

4

종료

 

조금 더 보기 쉽도록 만들어주기

package com.day08;

import java.util.ArrayList;
import java.util.Scanner;
//ArrayList 이용 -> 매니저가 가지고 있어야 함
// 원 ==> Circle
// 사각형 ==> Square
// 부모 ==> Shape
// 출력 : 입력한 x, y좌표 + 원이면 반지름 r까지, 사각형이면 가로 세로 w, h까지 출력
class Shape {
	private int x, y; //자식이 공통으로 가지는 것
	public Shape(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public void print() {
		System.out.println("좌표(x,y) = " + x + "," + y);
	}
}

class Circle extends Shape {
	private int r; //공통으로 가지는 것 외에 자기만 가지는 것 : 반지름 r
	public Circle(int x, int y, int r) {//x, y는 부모가 가지고 있음
		super(x,y);
		this.r = r;
	}
	@Override
	public void print() {
		super.print();
		System.out.println("반지름 : " + r);
		System.out.println();
	}
}

class Square extends Shape {
	private int w, h; //공통으로 가지는 것 외에 자기만 가지는 것 : 가로 w, 세로 h
	public Square(int x, int y, int w, int h) { //x, y는 부모가 가지고 있음
	super(x,y);
	this.w = w;
	this.h = h;
	}
	@Override
	public void print() {
		super.print();
		System.out.println("가로 폭 : " + w);
		System.out.println("세로 높이 : " + h);
		System.out.println();
	}
}

class ShapeManager {
	//도형 입력(원 또는 사각형) -> 원 : 중심좌표 x, y와 반지름 r 입력받고, 사각형 : x, y, 가로와 세로 w, h
	ArrayList<Shape> alist = new ArrayList<>(); //alist는 Circle형과 Square형을 아우르는 부모 Shape형을 가져야 한다
	
	public void inputData(int choice) { //choice가 1이면 원, 2이면 사각형
		System.out.println("도형입력...");
		System.out.println("x좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int x = ShapeMain.sc.nextInt();
		System.out.println("y좌표 >> "); //원, 사각형 모두 공통되는 중심좌표 x, y 먼저 물어보기
		int y = ShapeMain.sc.nextInt();
		if(choice == 1) { //원
			System.out.println("반지름 >> ");
			int r = ShapeMain.sc.nextInt();
			alist.add(new Circle(x,y,r)); //인자 있는 생성자 필요 -> 16번
		} else if(choice == 2) { //사각형
			System.out.println("가로 폭 >> ");
			int w = ShapeMain.sc.nextInt();
			System.out.println("세로 높이 >> ");
			int h = ShapeMain.sc.nextInt();
			alist.add(new Square(x,y,w,h));
		}
	}
	
	public void viewData() {
		for(Shape s : alist) {
			s.print(); //좌표 두개는 부모가 가지고 있다. -> Shape에 print() 추가 해주기
		}
	}
}

public class ShapeMain {
	static Scanner sc = new Scanner(System.in);
	static void showMenu() {
		System.out.println("선택하세요");
		System.out.println("1.원, 2.사각형, 3.보기, 4.종료");
	}
	
	public static void main(String[] args) {
		ShapeManager sm = new ShapeManager();
		
		while(true) { //언제까지 돌릴지 모르니까 while(true)
			ShapeMain.showMenu(); //일부러 static으로 접근
			int choice = ShapeMain.sc.nextInt();
			switch(choice) {
			case 1 : //원 -> 어차피 아래 inputData()로 내려가니까 적어주지 않음
			case 2 : sm.inputData(choice); break; //1, 2둘 다 inputData();
			case 3 : sm.viewData(); break;
			case 4 : System.out.println("종료");
					 System.exit(0);
			default : System.out.println("입력오류");
			}
		}
	}
}

선택하세요
1.원, 2.사각형, 3.보기, 4.종료
1
도형입력...
x좌표 >> 
2
y좌표 >> 
2
반지름 >> 
4
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
2
도형입력...
x좌표 >> 
3
y좌표 >> 
3
가로 폭 >> 
4
세로 높이 >> 
2
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
1
도형입력...
x좌표 >> 
3
y좌표 >> 
3
반지름 >> 
5
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
2
도형입력...
x좌표 >> 
4
y좌표 >> 
6
가로 폭 >> 
3
세로 높이 >> 
4
선택하세요
1.원, 2.사각형, 3.보기, 4.종료
3
좌표(x,y) = 2,2
반지름 : 4

좌표(x,y) = 3,3
가로 폭 : 4
세로 높이 : 2

좌표(x,y) = 3,3
반지름 : 5

좌표(x,y) = 4,6
가로 폭 : 3
세로 높이 : 4

선택하세요
1.원, 2.사각형, 3.보기, 4.종료
4
종료

 

 


오버라이딩 : 부모에게 있는 원본을 자식이 자기에게 맞게 가져다 바꿔서 사용하는 것

 

728x90
728x90