정리/Java

자바의 정석 연습문제 ch 9 java.lang 패키지와 유용한 클래스

민발자 2023. 9. 3. 18:23
728x90

자바의 정석 3판 기초판 연습문제

https://github.com/castello/javajungsuk3

 

GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition

soure codes and ppt files of javajungsuk 3rd edition - GitHub - castello/javajungsuk3: soure codes and ppt files of javajungsuk 3rd edition

github.com

 

[9-1] 다음과 같은 실행결과를 얻도록 SutdaCard클래스의 equals()를 멤버변수인 num, isKwang의 값을 비교하도록 오버라이딩하고 테스트 하시오.

public class Ex9_1 {

	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));
	}
}

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) {
		// 1)
	}
	
	public String toString() {
		return num + (isKwang ? "K" : "");
	}
}
public boolean equals(Object obj) {
    // 1)
    if(obj instanceof Sutdacard) {
        Sutdacard c = (Sutdacard)obj;
        return num==c.num && isKwang==c.isKwang;
    }

    return false;
}

 

 

[9-2] 다음과 같은 실행결과를 얻도록 Point3D클래스의 equals()를 멤버변수인 x, y, z 의 값을 비교하도록 오버라이딩하고, toString()은 실행결과를 참고해서 적절히 오버라이 딩하시오.

public class Ex9_2 {
	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));
	}
}

class Point3D{
	int x, y, z;
	
	Point3D() {
		this(0, 0, 0);
	}
	
	Point3D(int x, int y, int z) {
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
	public boolean equals(Object obj) {
		// 1) 인스턴스 변수 x, y, z	를 비교하도록 오버라이딩
	}
	
	public String toString() {
		// 2) 인스턴슨 변수 x, y, z의 내용을 출력하도록 오버라이딩 
	}
}
public boolean equals(Object obj) {
    // 1) 인스턴스 변수 x, y, z	를 비교하도록 오버라이딩
    if(obj instanceof Point3D) {
        Point3D p = (Point3D)obj;
        return p.x==x && p.y==y && p.z==z;
    }

    return false;
}

public String toString() {
    // 2) 인스턴슨 변수 x, y, z의 내용을 출력하도록 오버라이딩 
    return "[" + x + "," + y + "," + z +"]";
}

 

[9-3] 다음과 같은 실행결과가 나오도록 코드를 완성하시오.

String fullPath = "c:\\jdk1.8\\work\\PathSeparateTest.java";
String path = "";
String fileName = "";

// 1) 

System.out.println("fullPath: " + fullPath);
System.out.println("path: " + path);
System.out.println("fileName: " + fileName);

 

// 1) 
int pos  = fullPath.lastIndexOf("\\");

if(pos!=-1) {
    path = fullPath.substring(0, pos);
    fileName = fullPath.substring(pos+1);
}
/*
lastIndexOf 마지막 구분자를 찾아 인덱스 반환
찾는 문자열이 없으면 -1 반환하기 때문에 조건문 사용해 확인 필요
subString은 문자열을 잘라주는 메서드로 매개변수를 한개만 전달하면 매개변수부터 끝까지 잘라줌
subString(시작, 끝) 주의할 점은 끝인덱스 문자를 포함하지 않는다는 것!
 */

 

[9-4] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : printGraph

기능 : 주어진 배열에 담긴 값만큼 주어진 문자를 가로로 출력한 후, 값을 출력

반환타입 : 없음

매개변수 : int[] dataArr - 출력할 그래프의 데이터

char ch - 그래프로 출력할 문자

public class Ex9_4 {
	static void printGraph(int[] arr, char ch) {
		// 1)
	}
	
	public static void main(String[] args) {
		printGraph(new int[] {3, 7, 1, 4}, '*');
	}
}
static void printGraph(int[] arr, char ch) {
    for(int i  = 0; i < arr.length; i++) {
        for(int j = 0; j < arr[i]; j++) {
            System.out.print(ch);
        }
        System.out.println(arr[i]);
    }
}

 

[9-5] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[Hint] String클래스의 indexOf(String str, int fromIndex)를 사용할 것

메소드명 : count

기능 : 주어진 문자열 src에 찾으려믄 문자열 target이 몇 번 나오는지 세어서 반환

반환타입 : int

매개변수 : Sring src, String target

public static int count(String src, String target) {
    int count = 0; // 찾은 횟수
    int pos = 0; // 찾기 시작할 위치

    // 1)
}
public static void main(String[] args) {
    System.out.println(count("12345AB12AB345AB", "AB"));
    System.out.println(count("12345", "AB"));
}
public static int count(String src, String target) {
    int count = 0; // 찾은 횟수
    int pos = 0; // 찾기 시작할 위치

    // 1)
    while(true) {
        pos = src.indexOf(target, pos);

        if(pos != -1) {
            count++;
            pos += target.length(); // pos의 위치를 다음 단어로 이동
        } else {
            break;
        }
    }

    return count;
}

 

[9-6] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : fillZero

기능 : 주어진 문자열로 주어진 길이의 문자열로 만들고, 왼쪽 빈 공간은 '0'으로 채운다. 만일 주어진 문자열이 null이거나 문자열의 길이가 length의 값과 같으면 그대로 반환, 주어진 length의 값이 0보다 같거나 작은 값이면 빈문자열""을 반환한다.

반환타입 : String

매개변수 : String src - 변환할 문자열, int length - 변환한 문자열의 길이

public class Ex9_6 {
	public static String fillZero(String src, int length) {
		/*
		 * src가 null이거나 src.length가 length와 같으면 src 그대로 반환 
		 * length의 값이 0보다 같거나 작으면 빈 문자열 "" 반환
		 * src의 길이가 length의 값보다 크면 src를 length만큼 잘라서 반환
		 * 길이가 length인 char배열 생성
		 * 위에서 생성한 char배열을 '0'으로 채운다
		 * src에서 문자배열을 뽑아내서 위에서 생성한 배열에 복사한다.
		 * 생성한 배열로 String을 생성해 반환
		 * */
		
		if(src == null || src.length() == length) { //src가 null이거나 src.length가 length와 같으면 src 그대로 반환 
			return src;
		
		} else if(length <= 0) { //length의 값이 0보다 같거나 작으면 빈 문자열 "" 반환
			return "";
		
		} else if(src.length() > length) { //src의 길이가 length의 값보다 크면 src를 length만큼 잘라서 반환
			return src.substring(0, length);
		}
		
		// 길이가 length인 char배열 생성
		char[] chArr = new char[length];
		
		//위에서 생성한 char배열을 '0'으로 채운다
		for(int i = 0; i < chArr.length; i++) {
			chArr[i] = '0';
		}
		
		//src에서 문자배열을 뽑아내서 위에서 생성한 배열에 복사한다.
		System.arraycopy(src.toCharArray(), 0, chArr, length-src.length(), src.length());
		/*
		 * toCharArray 문자열을 char[]에 한 글자씩 넣어주는 메서드
		 * arraycopy(복사하고자하는 소스, 소스의 시작위치, 복사 대상, 복사본 시작 위치, 복사할 길이)
		 * */
		
		//생성한 배열로 String을 생성해 반환
		return new String(chArr);
		// char[]을 합쳐서 하나의 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));
	}
}

 

[9-7] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[Hint] String클래스의 indexOf()를 사용할 것

메서드명 : contains

기능 : 첫번째 문자열 src에 두번째 문자열 target이 포함되어있는지 확인한다. 포함되어 있으면 true, 없으면 false 반환

반환타입 : boolean

매개변수 : String src, String target

public class Ex9_7 {
	public static boolean contains(String src, String target) {
		return src.indexOf(target) != -1;
	}

	public static void main(String[] args) {
		System.out.println(contains("12345", "23"));
		System.out.println(contains("12345", "67"));
	}
}

 

[9-8] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[Hint] Math.round()와 Math.pow()를 이용하라.

메서드명 : round

기능 : 주어진 값을 반올림하여, 소수점이하 n자이의 값을 반환한다. 예를 들어 n의 값이 3이면 소수점 4번째 자리에서 반올림하여 소수점이하 3자리의 수를 반환한다.

반환타입 : double

매개변수 : double d - 변환할 값, int n - 반올림한 결과의 소수점 자리

public class Ex9_8 {
	public static double round(double d, int n) {
		return Math.round(d * Math.pow(10, n)) / Math.pow(10, n);
		// Math.pow 제곱함수(밑수, 지수)
		// Math.round 반올림함수 소수점 첫번째 자리 반올림
		
	}
	public static void main(String[] args) {
		System.out.println(round(3.1415, 1));
		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-9] 다음과 같이 정의된 메서드를 작성하고 테스트하시오

[힌트] StringBuffer와 String클래스의 charAt(int i)과 indexOf(int ch)를 사용하라.

메서드명 : delChar

기능 : 주어진 문자열에서 금지된 문자들을 제거하여 반환한다.

반환타입 : String

매개변수 : String src - 반환할 문자열, String delCh - 제거할 문자들로 구성된 문자열

public static String delChar(String src, String delCh) {
    StringBuffer sb = new StringBuffer(src.length());

    for(int i = 0; i < src.length(); i++) {
        char c = src.charAt(i);
        // src문자열을 하나씩 분리

        if(delCh.indexOf(c) == -1) { 
            // 지울 문자열에 c가 포함되어있지 않으면 buffer에 추가
            sb.append(c);
        }
    }
    return sb.toString();
}

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"));
}

 

[9-10] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

메서드명 : format

기능 : 주어진 문자열을 지정된 크기의 문자열로 변환한다. 나머지 공간은 공백으로 채운다.

반환타입 : String

매개변수 : String str - 반환할 문자열, int length - 변환된 문자열의 길이, int allignment -변환된 문자열 정렬조건(0왼, 1가운데, 2오)

public class Ex9_10 {
	public static String format(String str, int length, int alignment) {
		// length가 str 길이보다 작으면 length 만큼 자름
		if(length - str.length() < 0) {
			return str.substring(0, length);
		}
		
		// str 문자 배열로 변경
		char[] strArr = str.toCharArray();
		
		char[] arr = new char[length];
		
		// 공백 넣기
		for(int i = 0; i < arr.length; i++) {
			arr[i] = ' ';
		}
		
		// 정렬 
		switch(alignment) {
			case 0:
			default:
				System.arraycopy(strArr, 0, arr, 0, strArr.length);
				break;
			case 1:
				System.arraycopy(strArr, 0, arr, (length - str.length())/2, strArr.length);
				break;
			case 2:
				System.arraycopy(strArr, 0, arr, length - str.length(), strArr.length);
				break;
		}
		
		return new String(arr);
	}
	
	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));
	}
}

 

[9-12] 다음과 같이 정의된 메서드를 작성하고 테스트하시오.

[힌트] Math.random()과 절대값을 반환하는 Math.abs(int a), 그리고 둘 중 작은 값을 반환하는 Math.min(int a, int b)를 사용하라.

메서드명 : getRand

기능 : 주어진 범위에 속한 임의의 정수값을 반환한다.(양쪽 경계값 모두 범위에 포함), from값이 to의 값보다 클 경우도 처리되어야 한다.

반환타입 : int

매개변수 : int from - 범위의 시작값, int to - 범위의 끝값

public class Ex9_12 {
	public static int getRand(int from, int to) {
		return (int)(Math.random() * Math.abs(to-from -1)) + 1 + Math.min(from, to);
	}
	public static void main(String[] args) {
		for(int i = 0; i < 20; i++) {
			System.out.println(getRand(1, -3));
		}
	}
}

 

 

[9-13] 다음은 하나의 긴 문자열(source) 중에서 특정 문자열과 일치하는 문자열의 개수 를 구하는 예제이다. 빈 곳을 채워 예제를 완성하시오.

public class Ex9_13 {
	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;
		}
		
		// 1)
		
		return count;
	}
}
// 1)
// src에 key와 일치하는 부분의 위치 index가 -1이 아니면 계속 반복
while((index = src.indexOf(key, pos)) != -1) {
    count++; // 같은 문자열 찾으면 증가
    pos = index + key.length(); // 검색 시작 위치 변
}

 

 

728x90