public static void showData(Object obj)
{
System.out.println(obj);
}
이 메소드를 통해서 출력해야 할 데이터가 정수 3과 실수 7.15이다.
이러한 상황에서는 정수 3과 실수 7.15가 Object 클래스를 상속하는 인스턴스의 형태가 되어야만 위 메소드의 인자로 전달될 수 있다.
이것이 기본 자료형 데이터가 인스턴스로 표현되어야 하는 상황인데,
이렇듯 인스턴스의 참조 값을 요구하는 자리에 기본 자료형 데이터를 놓아야 하는 경우, 기본 자료형 데이터를 인스턴스로 표현해야 한다.
그러면 위에 있는 메소드를 이용하여 정수 3을 출력하도록 하자.
내가 푼 풀이
package com.test.memo;
public class Practice1 {
public static void showData(Object obj) {
System.out.println(obj);
}
public static void main(String[] args) {
Integer num1 = new Integer(3);
Double num2 = new Double(7.15);
showData(num1);
showData(num2);
}
}
String[] phoneNumArr = {
"012-3456-7890",
"099-2456-7980",
"088-2346-9870",
"013-3456-7890"
};
출력: 234
[012-3456-7890, 088-2346-9870]
package com.test.memo;
import java.util.Scanner;
import java.util.Vector;
public class Practice1 {
public static void main(String[] args) {
String[] phoneNumArr = { "012-3456-7890", "099-2456-7980", "088-2346-9870", "013-3456-7890" };
String findNum = null;
Vector<String> vec = new Vector<>();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.print("검색하실 전화번호를 입력하세요: ");
findNum = sc.nextLine().trim();
if (findNum.equals("")) {
continue;
} else if (findNum.equalsIgnoreCase("Q")) {// 대소문자 상관없이 저 문자를 입력하면 시스템 종료
System.exit(0);
}
for (int i = 0; i < phoneNumArr.length; i++) {
String phoneNum = phoneNumArr[i];
String temp = phoneNum.replace("-", " ");
if (temp.contains(findNum)) {// temp안에 findNum 문자열이 포함하는지의 여부
vec.add(temp.replace(" ", "-"));// 출력할떄 하이포 표시하기 위해서
}
}
if (vec.size() > 0) {
System.out.println(vec); // 검색 결과를 출력하고
vec.clear();// 검색 결과를 삭제 > 비워주기 위함
} else
System.out.println("일치하는 번호가 없습니다.");
}
}
}
char[] dest = new char[10];
char[] src = {'1', '2', '3', '4'};
왼쪽 정렬
1234000000
오른쪽 정렬
0000001234
가운데 정렬
0001234000
package com.test.memo;
import java.util.Arrays;
class Practice2 {
public static void main(String[] args) {
char[] dest = new char[10];
char[] src = { '1', '2', '3', '4' };
Arrays.fill(dest, '0');
// 왼쪽 정렬
System.out.println("왼쪽 정렬");
System.arraycopy(src, 0, dest, 0, src.length);
System.out.println(dest);
Arrays.fill(dest, '0');
// 오른쪽 정렬
System.out.println("오른쪽 정렬");
System.arraycopy(src, 0, dest, dest.length - src.length, src.length);
System.out.println(dest);
Arrays.fill(dest, '0');
// 가운데 정렬
System.out.println("가운데 정렬");
System.arraycopy(src, 0, dest, (dest.length - src.length) / 2, src.length);
System.out.println(dest);
}
}
Arrays.fill() 메서드를 생각하지 못해서 for문을 하나하나 다 쓸 뻔 했다.기본자료형에 8가지에 대한 래퍼 클래스를 서술하시오.
Byte
Character
Integer
Float
Double
Long
Short
Boolean
import java.util.regex.*; // Pattern과 Matcher가 속한 패키지
class RegularEx1 {
public static void main(String[] args)
{
String[] data = {"bat", "baby", "bonus",
"cA","ca", "co", "c.", "c0", "car","combat","count",
"date", "disc"};
Pattern p = Pattern.compile("c[a-z]*");
for(int i=0; i < data.length; i++) {
Matcher m = p.matcher(data[i]);
if(m.matches())
System.out.print(data[i] + ",");
}
}
}
import java.util.regex.*; // Pattern과 Matcher가 속한 패키지
class RegularEx2 {
public static void main(String[] args) {
String[] data = {"bat", "baby", "bonus", "c", "cA",
"ca", "co", "c.", "c0", "c#",
"car","combat","count", "date", "disc"
};
String[] pattern = {".*","c[a-z]*","c[a-z]", "c[a-zA-Z]",
"c[a-zA-Z0-9]","c.","c.*","c\\.","c\\w",
"c\\d","c.*t", "[b|c].*", ".*a.*", ".*a.+",
"[b|c].{2}"
};
for(int x=0; x < pattern.length; x++) {
Pattern p = Pattern.compile(pattern[x]);
System.out.print("Pattern : " + pattern[x] + " 결과: ");
for(int i=0; i < data.length; i++) {
Matcher m = p.matcher(data[i]);
if(m.matches())
System.out.print(data[i] + ",");
}
System.out.println();
}
} // public static void main(String[] args)
}
bat, baby, bonus, c, cA, ca, co, c., c0, c#m carm combatm count, datem disc
c, ca, co, car, combat, count
ca, co
cA, ca, co
cA, ca, co, c0
cA, ca, co, c., c0, c#
c, cA, ca, co, c.m c0, c#, car, combat, count
c.
cA, ca, co, c0
c0
combat, count
bat, baby, bonus, c, cA, ca, co, c., c0, c#, car, combat, count
bat, baby, ca, car, date
bat, baby, car, date
bat, car
실행 결과
123 숫자입니다.
012 숫자입니다.
3GT 숫자가 아닙니다.
안녕 숫자가 아닙니다.
Hello 숫자가 아닙니다.
String[] data = {"123","012", "3GT", "안녕", "Hello"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = { "123", "012", "3GT", "안녕", "Hello" };
Pattern pt = Pattern.compile("\\d{3}");
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 숫자 입니다.");
} else {
System.out.println(s + " 숫자가 아닙니다.");
}
}
}
}


배열을 이용하여, 실행결과가 다음과 같이 나오도록 하세요.
실행 결과
123 영문자가 아닙니다.
012 영문자가 아닙니다.
3GT 영문자가 아닙니다.
안녕 영문자가 아닙니다.
Hello 영문자입니다.
String[] data = {"123","012", "3GT", "안녕", "Hello"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = {"123","012", "3GT", "안녕", "Hello"};
Pattern pt = Pattern.compile("[A-Za-z]*");
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 영문자 입니다.");
} else {
System.out.println(s + " 영문자가 아닙니다.");
}
}
}
}

실행 결과
123 한글이 아닙니다.
012 한글이 아닙니다.
3GT 한글이 아닙니다.
안녕 한글입니다.
Hello 한글이 아닙니다.
String[] data = {"123","012", "3GT", "안녕", "Hello"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = { "123", "012", "3GT", "안녕", "Hello" };
Pattern pt = Pattern.compile("[가-힣]*");
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 한글 입니다.");
} else {
System.out.println(s + " 한글이 아닙니다.");
}
}
}
}

배열을 이용하여, 실행결과가 다음과 같이 나오도록 하세요.
실행 결과
hello 유효한 이메일 주소가 아닙니다.
hello@ 유효한 이메일 주소가 아닙니다.
hello@naver 유효한 이메일 주소가 아닙니다.
hello@naver.com 유효한 이메일 주소입니다.
good@good.co.kr 유효한 이메일 주소입니다.
String[] data = {"hello", "hello@", "hello@naver", "hello@naver.com", "good@good.co.kr"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = { "hello", "hello@", "hello@naver", "hello@naver.com", "good@good.co.kr" };
Pattern pt = Pattern.compile("\\w+@\\w+\\.\\w+(\\.\\w+)?");// {2,} > 영문자가 두개 이상이게 끝나야한다는 어설션
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 유효한 이메일 주소 입니다.");
} else {
System.out.println(s + " 유효한 이메일 주소가 아닙니다.");
}
}
}
}
[a-z]+@\\w+\\.* 로 조건을 두니까 hello@naver 만 유효한 이메일 주소 라고 나온다.실행 결과
02 유효한 전화번호가 아닙니다.
02-123 유효한 전화번호가 아닙니다.
02-123-456 유효한 전화번호가 아닙니다.
02-123-4567 유효한 전화번호입니다.
02-1234-4567 유효한 전화번호입니다.
031-1234-5678 유효한 전화번호입니다.
String[] data = {"02", "02-123", "02-123-456", "02-123-4567", "02-1234-4567", "031-1234-5678"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = { "02", "02-123", "02-123-456", "02-123-4567", "02-1234-4567", "031-1234-5678" };
Pattern pt = Pattern.compile("\\d{2,}-\\d{3,}-\\d{4,}");// {2,} > 영문자가 두개 이상이게 끝나야한다는 어설션
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 유효한 전화번호 입니다.");
} else {
System.out.println(s + " 유효한 전화번호가 아닙니다.");
}
}
}
}

하이폰을 []안에 두는게 아니고 밖에 꺼내놔야하는데 +랑 같이 두니까 안되서 그냥 몇 이상의 숫자만 지정해서 뒀다. 원래 번호는 4자리 이하니까 네개로 설정하는게 당연한건감..
실행 결과
010 유효한 핸드폰 번호가 아닙니다.
010-1234-5678 유효한 핸드폰 번호입니다.
02-123-456 유효한 핸드폰 번호가 아닙니다.
02-123-4567 유효한 핸드폰 번호가 아닙니다.
02-1234-4567 유효한 핸드폰 번호가 아닙니다.
031-1234-5678 유효한 핸드폰 번호가 아닙니다.
String[] data = {"010", "010-1234-5678", "02-123-456", "02-123-4567", "02-1234-4567", "031-1234-5678"};
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String[] data = { "010", "010-1234-5678", "02-123-456", "02-123-4567", "02-1234-4567", "031-1234-5678" };
Pattern pt = Pattern.compile("[0-1]+{3}-\\d{4}-\\d{4}");// {2,} > 영문자가 두개 이상이게 끝나야한다는 어설션
for (String s : data) {
Matcher m = pt.matcher(s);
if (m.matches()) {
System.out.println(s + " 유효한 전화번호 입니다.");
} else {
System.out.println(s + " 유효한 전화번호가 아닙니다.");
}
}
}
}

실행 결과
1: 011-1111-1111 -> 011, 1111, 1111
2: 02-999-9999 -> 02, 999, 9999
String source = "HP:011-1111-1111, HOME:02-999-9999 ";
String pattern = "(0\d{1,2})-(\d{3,4})-(\d{4})";
package com.test.memo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class Practice2 {
public static void main(String[] args) {
String source = "HP:011-1111-1111, HOME:02-999-9999 ";
String pattern = "(0\\d{1,2})-(\\d{3,4})-(\\d{4})";
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(source);
int cnt = 1;
while (m.find()) {
System.out.println(cnt++ + ":" + m.group() + "-> " + m.group(1) + ", " + m.group(2) + ", " + m.group(3));
}
}
}

다음 정규식에 해당하는 정규식 문자 또는 정규식의 의미를 서술하시오.
. : 임의의 한 문자를 나타낸다. > 온점
[] : 문자 집합 메타 문자 > 집합 내 포함된 문자는 OR로 작동
*: 없거나 한 개 이상을 의미한다.
+ : 한 개 이상
[A-Z] : 범위 지정 메타 문자 마이너스 > 왼쪽 문자를 시작으로 오른쪽 문자까지 순차적으로 문자를 증가
\d : digit의 약자로 한 개의 숫자를 의미한다. [0-9]의 의미와 동일
\s : 공백 문자를 의미
\w : [a-zA-Z0-9_] : 확장문자로, 한 개의 알파벳, 숫자, 언더바를 의미한다.
{n} : n개를 의미한다.
{n, } : n개 이상을 의미한다.
{n, m} : n개 이상 m개 이하를 의미한다.
? : 없음 또는 한개
() : 그룹핑 > 소괄호 안의 문자를 하나로 인식
^ : 문자열의 시작
$ : 문자열의 종료 지점
\. : 점 문자를 의미
실행결과
c1=3K
c2=3K
c1.equals(c2):true
package com.test.memo;
class SutdaCard {
int num;
boolean isKwang;
SutdaCard() {
this(1, true);
}
SutdaCard(int num, boolean isKwang) {
this.num = num;
this.isKwang = isKwang;
}
public boolean equals(Object obj) {
if (obj instanceof SutdaCard) {
SutdaCard tem = (SutdaCard) obj;
//if(obj instanceof SutdaCard tem){ > 이런 형식으로 위 두 줄을 한줄로 줄일 수 있다.
return this.num == tem.num && this.isKwang == tem.isKwang;
}
return false;
}
public String toString() {
return num + (isKwang ? "K" : "");
}
}
class Practice2 {
public static void main(String[] args) {
SutdaCard c1 = new SutdaCard(3, true);
SutdaCard c2 = new SutdaCard(3, true);
System.out.println("c1=" + c1);
System.out.println("c2=" + c2);
System.out.println("c1.equals(c2):" + c1.equals(c2));
}
}
실행결과
[1,2,3][1,2,3]
p1==p2?false
p1.equals(p2)?true
package com.test.memo;
class Point3D {
int x, y, z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
Point3D() {
this(0, 0, 0);
}
public boolean equals(Object obj) {
if (obj instanceof Point3D) {
Point3D pp = (Point3D) obj;
//if(obj instanceof Point3D pp){ 로 위 두 줄을 한 줄로 변경 가능
return this.x == pp.x && this.y == pp.y && this.z == pp.z;
}
return false;
}
public String toString() {
return "[" + x + "," + y + ", " + z + "]";
}
}
class Practice2 {
public static void main(String[] args) {
Point3D p1 = new Point3D(1, 2, 3);
Point3D p2 = new Point3D(1, 2, 3);
System.out.println(p1);
System.out.println(p2);
System.out.println("p1==p2?" + (p1 == p2));
System.out.println("p1.equals(p2)?" + (p1.equals(p2)));
}
}
다음과 같은 실행결과가 나오도록 코드를 완성하시오. 정답
실행결과
fullPath:c:\jdk1.8\work\PathSeparateTest.java
path:c:\jdk1.8\work
fileName:PathSeparateTest.java
내가 푼 풀이
package com.test.memo;
class Practice2 {
public static void main(String[] args) {
String fullPath = "c:\\jdk1.8\\work\\PathSeparateTest.java";
String path = "";
String fileName = "";
path = fullPath.substring(0, 14);
fileName = fullPath.substring(15, fullPath.length());
//substring(15); 와 같은 의미
System.out.println("fullPath:" + fullPath);
System.out.println("path:" + path);
System.out.println("fileName:" + fileName);
}
}
답지
class Exercise9_3 {
public static void main(String[] args) {
String fullPath = "c:\\jdk1.8\\work\\PathSeparateTest.java";
String path = "";
String fileName = "";
int pos = fullPath.lastIndexOf("\\");
if (pos != -1) {
path = fullPath.substring(0, pos);
fileName = fullPath.substring(pos + 1);
}
System.out.println("fullPath:" + fullPath);
System.out.println("path:" + path);
System.out.println("fileName:" + fileName);
}
}
메서드명 : printGraph
기 능 : 주어진 배열에 담긴 값만큼 주어진 문자를 가로로 출력한 후 값을 출력한다
반환타입 : 없음
매개변수 : int[] dataArr - 출력할 그래프의 데이터
char ch - 그래프로 출력할 문자
[ ] 실행결과
*3
*7
*1
****4
내가 푼 풀이
package com.test.memo;
class Practice2 {
static void printGraph(int[] dataArr, char ch) {
for (int i = 0; i < dataArr.length; i++) {
int num = dataArr[i];
for (int j = 0; j < num; j++) {
System.out.print(ch);
}
System.out.println(num);
}
}
public static void main(String[] args) {
printGraph(new int[] { 3, 7, 1, 4 }, '*');
}
}
class Exercise9_4 {
static void printGraph(int[] dataArr, char ch) {
for (int i = 0; i < dataArr.length; i++) {
for (int j = 0; j < dataArr[i]; j++) {
System.out.print(ch);
}
System.out.println(dataArr[i]);
}
}
public static void main(String[] args) {
printGraph(new int[] { 3, 7, 1, 4 }, '*');
}
}
메서드명 : count
기 능: . 주어진 문자열(src) 에 찾으려는 문자열(target) 이 몇 번 나오는지 세어서 반환한다
반환타입 : int
매개변수 : String src
String target
[실행결과
3
0
내가 푼 풀이
package com.test.memo;
class Practice2 {
public static int count(String src, String target) {
int count = 0; // 찾은 횟수
int pos = 0; // 찾기 시작할 위치
while ((pos = src.indexOf(target, pos)) != -1) {
// src문자열에서 target문자열을 pos위치부터 찾아서 그 위치를 반환한다.
count++;
pos += target.length();
}
return count;
}
public static void main(String[] args) {
System.out.println(count("12345AB12AB345AB", "AB"));
System.out.println(count("12345", "AB"));
}
}
답

찾은 인덱스 이후로 다시 찾아야 하니까 pos에 더해주는 것이다.
메서드명 : fillZero
기 능 주어진 문자열 숫자 로 주어진 길이의 문자열로 만들고 왼쪽 빈 공간은 으로 : ( ) , '0'
채운다.
만일 주어진 문자열이 이거나 문자열의 길이가 의 값과 같으면 그대로 null length
반환한다.
만일 주어진 의 값이 보다 같거나 작은 값이면 빈 문자열 을 반환한다 length 0 , ("") .
반환타입 : String
매개변수 변환할 문자열 : String src -
int length - 변환한 문자열의 길이
실행결과
0000012345
123
package com.test.memo;
import java.util.Arrays;
class Practice2 {
public static String fillZero(String src, int length) {
if (src == null || src.length() == length) {
return src;
}
if (length <= 0) {
return " ";
}
if (src.length() > length) {
return src.substring(0,length);
}
char[] ch = new char[length];
Arrays.fill(ch, '0');// 0으로 배열 채워주기
char[] srcChar = src.toCharArray();// String을 char배열로 변경
System.arraycopy(srcChar, 0, ch, length - src.length(), src.length());
return new String(ch);// String으로 생성해서 반환
}
public static void main(String[] args) {
String src = "12345";
System.out.println(fillZero(src, 10));
System.out.println(fillZero(src, -1));
System.out.println(fillZero(src, 3));
}
}
메서드명 : contains
기 능 첫 번째 문자열 에 두 번째 문자열 이 포함되어 있는지 확인한다 : (src) (target) .
포함되어 있으면 그렇지 않으면 를 반환한다 true, false .
반환타입 : boolean
매개변수 : String src
String target
실행결과
true
false
package com.test.memo;
class Practice2 {
private static boolean contains(String src, String target) {
return src.contains(target);
}
public static void main(String[] args) {
System.out.println(contains("12345", "23"));
System.out.println(contains("12345", "67"));
}
}
답

메서드명 : round
기 능 주어진 값을 반올림하여 소수점 이하 n 자리의 값을 반환한다 :
예를 들어 n의 값이 3이면 소수점 4째 자리에서 반올림하여 소수점 이하 3자리의 수를 반환한다.
반환타입 : double
매개변수- 변환할 값 : double d
int n - 반올림한 결과의 소수점 자리
실행결과
3.1
3.14
3.142
3.1415
3.1415
package com.test.memo;
class Practice2 {
private static double round(double d, int n) {
// Math.pow를 사용하여 10의 n승을 계산하여 소수점 이하를 반올림할 자리수를 지정합니다.
double num = Math.pow(10, n);
// 주어진 값 d에 10의 n승을 곱한 후 0.5를 더한 다음 정수로 변환하여 반올림합니다.
double roundedValue = Math.round(d * num);
// 정수로 변환된 값을 다시 10의 n승으로 나누어 원래의 자릿수로 복원합니다.
return roundedValue / num;
}
public static void main(String[] args) {
System.out.println(round(3.1415, 1));
//한번 제곱하면 31.415 > 반올림이 안되니까 31 > 다시 제곱으로 나누니까 3.1 (double로 자동 형변환 )
System.out.println(round(3.1415, 2));
System.out.println(round(3.1415, 3));
System.out.println(round(3.1415, 4));
System.out.println(round(3.1415, 5));
}
}

9.다음과 같이 정의된 메서드를 작성하고 테스트하시오. 정답
메서드명 : delChar
기 능 주어진 문자열에서 금지된 문자들을 제거하여 반환한다 : .
반환타입 : String
매개변수 변환할 문자열 : String src -
String delCh - 제거할 문자들로 구성된 문자열
실행결과
(1!2@3^4~5) -> 12345
(1 2 3 4 5) -> (12345)
package com.test.memo;
class Practice2 {
private static String delChar(String src, String delCh) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < src.length(); i++) {
char ch = src.charAt(i);
if (delCh.indexOf(ch) == -1) {
sb.append(ch);
}
}
return sb.toString();//StringBuffer를 String객체로 변환해서 반환한
}
public static void main(String[] args) {
System.out.println("(1!2@3^4~5)" + " -> " + delChar("(1!2@3^4~5)", "~!@#$%^&*()"));
System.out.println("(1 2 3 4\t5)" + " -> " + delChar("(1 2 3 4\t5)", " \t"));
}
}
StringBuffer 와 StringBuilder가 비슷한 기능을 한다.(동기화 가능 여부만 다름)
메서드명 : format
기 능 : 주어진 문자열을 지정된 크기의 문자열로 변환한다 나머지 공간은 공백으로 채운다 : . .
반환타입 : String
매개변수 :
String str - 변환할 문자열
int length - 변환된 문자열의 길이
int alignment - 변환된 문자열의 정렬조건
(0:왼쪽 정렬 1:가운데 정렬 2: 오른쪽 정렬)
실행결과
가나다
가나다
가나다
package com.test.memo;
import java.util.Arrays;
class Practice2 {
private static String format(String str, int length, int alignment) {
if (length < str.length()) {
return str.substring(0, length);
}
char[] ch = new char[length];
Arrays.fill(ch, ' ');
int startIndex;
switch (alignment) {
case 0:
startIndex = 0;
break;
case 1:
startIndex = (length - str.length()) / 2;
break;
case 2:
startIndex = length - str.length();
break;
default:
startIndex = 0;
}
for (int i = 0; i < str.length(); i++) {
ch[startIndex + i] = str.charAt(i);
}
return new String(ch);
}
public static void main(String[] args) {
String str = "가나다";
System.out.println(format(str, 7, 0)); // 왼쪽 정렬
System.out.println(format(str, 7, 1)); // 가운데 정렬
System.out.println(format(str, 7, 2)); // 오른쪽 정렬
}
}
답

switch-case보면 case0밑에 default가 존재하는데, 이는 0 과 1, 2이외의 값이라면 을 내포하고 있는것이다.
3과 5를 입력하면 3단부터 5단까지 출력한다.
package com.test.memo;
class Practice2 {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("시작 단과 끝 단, 두 개의 정수를 입력해주세요.");
}
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[1]);
if (num1 < 2 || num1 > 9 || num2 < 2 || num2 > 9) {
System.out.println("단의 범위는 2와 9사이의 값이어야 합니다.");
System.out.println("USAGE : GugudanTest 3 5");
}
for (; num1 <= num2; num1++) {
for (int i = 1; i <= 9; i++) {
System.out.println(num1 + "*" + i + "=" + num1 * i);
}
}
}
}


올바르지 않게 입력하면 메시지도 보내주게 처리
답

)
메서드명 : getRand
기 능 주어진 범위 에 속한 임의의 정수값을 반환한다 : (from~to) .
( ) 양쪽 경계값 모두 범위에 포함
from to . 의 값이 의 값보다 클 경우도 처리되어야 한다
반환타입 : int
매개변수 범위의 시작값 : int from -
int to - 범위의 끝값
내가 푼 풀이 - 틀림
package com.test.memo;
class Practice2 {
private static int getRand(int from, int to) {
if (from > to) {
int ran = (int) (Math.random() * (from + (-to)) + to);
return ran;
}
return 3;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++)
System.out.print(getRand(1, -3) + ",");
}
}
-2~0 > 난수 생성을 잘못 한듯
챗 gpt 풀이
package com.test.memo;
class Practice2 {
private static int getRand(int from, int to) {
int max = Math.max(from, to);
int min = Math.min(from, to);
if (min == max) {
return min;
}
int ran = (int) (Math.random() * (max - min + 1)) + min;
return ran;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++)
System.out.print(getRand(1, -3) + ",");
}
}
-3~1
답지

실행결과
aabbccAABBCCaa
aa를 2개 찾았습니다
내가 푼 풀이- 틀림
package com.test.memo;
class Practice2 {
public static void main(String[] args) {
String src = "aabbccAABBCCaa";
System.out.println(src);
System.out.println("aa를" + stringCount(src, "aa") + "개 찾았습니다.");
}
static int stringCount(String src, String key) {
return stringCount(src, key, 0);
}
static int stringCount(String src, String key, int pos) {
int count = 0;
int index = 0;
if (key == null || key.length() == 0)
return 0;
if (src.contains(key)) {
count++;
}
return count;
}
}
답
package com.test.memo;
class Practice2 {
public static void main(String[] args) {
String src = "aabbccAABBCCaa";
System.out.println(src);
System.out.println("aa를" + stringCount(src, "aa") + "개 찾았습니다.");
}
static int stringCount(String src, String key) {
return stringCount(src, key, 0);
}
static int stringCount(String src, String key, int pos) {
int count = 0;
int index = 0;
if (key == null || key.length() == 0)
return 0;
while ((index = src.indexOf(key, pos)) != -1) {
count++;
pos = index + key.length();
}
return count;
}
}


내가 푼 풀이 - 틀림
package com.test.memo;
import java.util.*;
import java.util.regex.*;
class Practice2 {
public static void main(String[] args) {
String[] phoneNumArr = { "012-3456-7890", "099-2456-7980", "088-2346-9870", "013-3456-7890" };
ArrayList list = new ArrayList();
Scanner s = new Scanner(System.in);
while (true) {
System.out.print(">>");
String input = s.nextLine().trim();
if (input.equals("")) {
continue;
} else if (input.equalsIgnoreCase("Q")) {
System.exit(0);
}
for (int i = 0; i < phoneNumArr.length; i++) {
String phonNum = phoneNumArr[i];
String temp = phonNum.replace("-", " ");
if (temp.contains(input)) {
list.add(temp.replace(" ", "-"));
}
}
if (list.size() > 0) {
System.out.println(list);
list.clear();
} else {
System.out.println("일치하는 번호가 없습니다.");
}
}
}
}
replace해서 띄어쓰기랑 하이폰 교체할때 제대로 안봐서 하이폰이 안나오거나 각 숫자마다 하이폰이 다나오거나..되어버렸다 근데 띄어쓰기하면..똑같은거아닌가 어떻게하지..
아 심지어 Pattern, Matcher이용하는거였네
답

Arrays에 정의된 메서드는 모두 static 메서드로, java.util.Arrays 클래스는 항목정렬, 항목 검색, 항목 비교와 같은 배열 조작에 도움을 주는 메소드들로 채워져있다.
모든 메소드는 static(정적) 메소드이므로, Arrays클래스로 바로 사용이 가능하다.
이 클래스에 정의된 메소드들을 사용하면 배열의 복사, 비교, 정렬 및 탐색과 관련된 코드를 비교적 쉽게 작성할 수 있다.
Arrays.copyOf()
배열을 복사하여 새로운배열을 생성하고 반환한다.
원본 배열의 일부를 복사하거나 전체 배열을 복사할 수 있다.
public static int[] copyOf(int[] original, int newLength)
original 배열을 첫 번째 요소부터 newLength의 길이만큼 복사
첫 번째 인자로 전달된 배열을 두 번째 인자로 전달된 길이만큼 복사하되 '새로운 배열을 생성'하여 복사한다. 그리고 이렇게 생성된 배열의 참조 값을 반환한다.
import java.util.Arrays;
class CopyOfArrays {
public static void main(String[] args) {
double[] arOrg = {1.1, 2.2, 3.3, 4.4, 5.5};
// 배열 전체를 복사하여 배열 생성
double[] arCpy1 = Arrays.copyOf(arOrg, arOrg.length);
// 배열의 세번째 요소까지만 복사하여 배열 생성 > 2번째 인덱스까지만 복사하는
double[] arCpy2 = Arrays.copyOf(arOrg, 3);
for(double d : arCpy1)
System.out.print(d + "\t");//출력 1.1 2.2 3.3 4.4 5.5
System.out.println();
for(double d : arCpy2)
System.out.print(d + "\t"); //출
System.out.println();
}
}
간단히 말해,
Arrays.copyOf()는 새로운 배열을 생성하고 복사하는 데 사용되고,
System.arraycopy()는 원본 배열의 일부를 다른 배열에 복사하는데 사용된다.
public static int[] copyOfRange(int[] original, int from, int to)
double[] arOrg = {1.1, 2.2, 3.3, 4.4, 5.5};
double[] arCpy2 = Arrays.copyOfRange(arOrg, 1, 4);
인덱스 1부터 3까지 복사한다!
Arrays.sort(arr)
기본 타입 / String 배열은 arr 배열을 사전순(오름차순)으로 정렬할 수 있다.
import java.util.Arrays;
class Person implements Comparable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Object o) {
//Comparable을 구현할 때 제네릭으로 구현한게 아니라면 인자값을 object로 제네릭이라면 해당 기준으로 Person
Person p = (Person)o;
if(this.age > p.age)
return 1;
else if(this.age < p.age)
return -1;
else
return 0;
/*
Person p = (Person)o;
return this.age - p.age;
*/
}
@Override
public String toString() {
return name + ": " + age;
}
}
class ArrayObjSort {
public static void main(String[] args) {
Person[] ar = new Person[3];
ar[0] = new Person("Lee", 29);
ar[1] = new Person("Goo", 15);
ar[2] = new Person("Soo", 37);
Arrays.sort(ar);
for(Person p : ar)
System.out.println(p);
}
}
//실행 결과
//Goo: 15
//Lee: 29
//Soo: 37
숫자는 컴퓨터가 기준을알고 있지만 현재 위의 Person은 개발자가 정의한 것이기 때문에 Comparable인터페이스를 구현해줘야 한다.
Comparable 의 compareTo메서드를 오버라이딩해서 기준을 지정해줘야 한다.
제네릭과 인터페이스가 있는데 제네릭이라면 <> 안에 뭐와 비교할 것인지 지정해주면 된다.
우리가 자주 쓰던, String, compareTo()메서드도 이 Comparable을 구현한 것이다.
예제 2
//Member 타입만 비교하기 위해 제네릭<> 사용
class Member implements Comparable<Member>{
String name;
Member(String name)
this.name = name;
@Override
int compareTo(Member m)
return name.compareTo(m.name);
//내림차순일 떄는 *(-1)를 하여 -1, 0, 1 를 구분한다.
}
public class Example{
public static void main(String[]args){
Member m1 = new Member("aa");
Member m2 = new Member("bb");
Member m3 = new Member("cc");
Member[] members = {m1, m2, m3};
Arrays.sort(members);
}
}
compareTo()의 구현방법
interface Comparable > int compareTo(Object o)
인자로 전달된 o가 작다면 양의 정수 반환
인자로 전달된 o가 크다면 음의 정수 반환
인자로 전달된 o와 같다면 0을 반환
검색은 반드시 정렬이 된 상태에서 해야한다.
정렬을 하지 않고 binarySearch()메소드를 사용하거나, 없는 항목을 찾으면 음수값이 리턴된다.
//Member[] members = {"aa", "bb", "cc"}; 일때
Arrays.sort(members);
int idx = Arrays.binarySearch(members, "bb");
// idx == 1
fill()메소드로 배열에 동일한 값을 저장할 수 있다.
int[] arr = new int [5];
Arrays.fill(arr, 0);
Arrays.fill(arr,0,3,1);
equals(배열, 배열) / deepEquals(배열, 배열)로 얕은 / 깊은 비교를 할 수 있다.
==연산자는 피연산자의 값과의 주소가 같은지 검사하는 것이다.
그러나 equals()메소드는 피연산자의 내용(값) 자체가 같은지를 검사한다.
예제1
import java.util.Arrays;
class ArrayEquals {
public static void main(String[] args) {
int[] ar1 = {1, 2, 3, 4, 5};
int[] ar2 = Arrays.copyOf(ar1, ar1.length);
System.out.println(Arrays.equals(ar1, ar2)); // true
}
}
이 메소드는 아래와 같이 object형 배열에 대해서도 오버로딩 되어있다.
public static boolean equals(Object[] a, Object[] a2)
이는 인스턴스의 참조 값을 저장하고 있는 두 배열에 대한 비교를 진행하는 것이다.
예제2
import java.util.Arrays;
class INum {
private int num;
public INum(int num) {
this.num = num;
}
@Override
public boolean equals(Object obj){
if(this == obj) // 두 인스턴스가 동일 인스턴스이면
return true;
else
return false;
} // 이렇듯 Object 클래스에 정의된 equals 메소드는 참조 값 비교를 한다.
}
class ArrayObjEquals {
public static void main(String[] args) {
INum[] ar1 = new INum[3];
INum[] ar2 = new INum[3];
ar1[0] = new INum(1); //객체를 생성해서 그 객체의 주소값을 배열에 넣는 것
ar2[0] = new INum(1);
ar1[1] = new INum(2);
ar2[1] = new INum(2);
ar1[2] = new INum(3);
ar2[2] = new INum(3);
System.out.println(Arrays.equals(ar1, ar2)); // false
}
}
숫자(= Integer)는 컴퓨터가 크고 작고의 개념을 가지고 있지만, INum은 개발자가 만든 클래스이므로, 컴퓨터는 뭐가 같고 다른지 기준을 모르기 때문에 그 기준을 equals메서드를 메서드 오버라이딩 해서 알려줘야한다.
배열의 참조 값 비교가 아닌 내용 비교가 목적이라면 다음과 같이 equals 메소드를 목적에 맞게 오버라이딩 해야 한다.
데이터를 복사하는데, 복사 객체는 원본 객체와 같은 메모리 주솔르 참조한다.
int a = 1; int b = a; //얕은 복사
객체를 복사할 때 해당 객체와 인스턴스 변수까지 복사하여 새 주소에 담는다.
clone()메소드를 이용한다. (Object클래스)오버라이딩 하는 코드
class Arr implements Cloneable{
String name;
Arr(String name){
this.name = name;
}
public Object clone() throws CloneNotSupportedException{
return super.clone();
}
}
//후에 clone()메소드 사용 시 CloneNotSupportedException 에러 try-catch
clone()메서드를 사용하려면 반드시 Cloneable 인터페이스를 구현해줘야 하고,
CloneNotSupportedException을 명시적으로 던져주고, 예외처리를 해줘야 한다.
내가 푼 문제
package com.test.memo;
import java.util.Arrays;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person p) {
if (this.age > p.age)
return -1;
else if (this.age < p.age)
return 1;
else
return 0;
}
@Override
public String toString() {
return name + ": " + age;
}
}
class Practice2 {
public static void main(String[] args) {
Person[] ar = new Person[3];
ar[0] = new Person("Lee", 29);
ar[1] = new Person("Goo", 15);
ar[2] = new Person("Soo", 37);
Arrays.sort(ar);
for (Person p : ar)
System.out.println(p);
}
}
정답
compareTo메서드 부분이 다르다.
return p.age - this.age; - 이렇게 하면 내림차순이 된다.
내가 푼 문제
package com.test.memo;
import java.util.Arrays;
class Person implements Comparable<Person> {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person p) {
if (this.name.length() > p.name.length())
return 1;
else if (this.name.length() < p.name.length())
return -1;
else
return 0;
}
@Override
public String toString() {
return name + ": " + age;
}
}
class Practice2 {
public static void main(String[] args) {
Person[] ar = new Person[3];
ar[0] = new Person("Threee", 29);
ar[1] = new Person("T", 15);
ar[2] = new Person("One", 37);
Arrays.sort(ar);
for (Person p : ar)
System.out.println(p);
}
}
정답
compareTo메서드에서
return name.length() - p.name.length(); 이렇게 해주면 길이순으로 정렬된다.
알파벳 순으로 정렬하고 싶다면
return name.compareTo(p.name); - 하면 사전적 순서대로 정렬이 된다.