본문 바로가기
개념

[이것이 자바다] chapter.11 확인 문제

by cook_code 2023. 2. 22.
반응형

1. Object 클래스에 대한 설명 중 틀린 것은 무엇입니까?

  1. 모든 자바 클래스의 최상위 부모 클래스이다. 
  2. Object의 equals() 메소드는 == 연산자와 동일하게 번지를 비교한다. 
  3. Object의 clone() 메소드는 얕은 복사를 한다. 
  4. Object의 toString() 메소드는 객체의 필드값을 문자열로 리턴한다.  

2. 여러분이 작성하는 클래스를 동등 비교하는 컬렉션 객체인 HashSet, HashMap, Hashtable을 사용하려고 합니다. 

Object의 equals()와 hashCode() 메소드를 오버라이딩 했다고 가정할 경우, 메소드 호출 순서를 생각하고 다음 괄호 () 안을 채워보세요.

정답: hashcode() - equals()

3. Student 클래스를 작성하되, Object의 equals()와 hashCode()를 오버라이딩해서 Student의 학번(StudentNum)이 같으면 동등 객체가 될 수 있도록 해보세요. Student 클래스의 필드는 다음과 같습니다. hashCode()의 리턴값은 studentNum 필드의 해시코드를 리턴하도록 하세요.

package chapter11_2;

public class Student {
    private String studentNum;

    public Student(String studentNum) {
        this.studentNum = studentNum;
    }

    public String getStudentNum() {
        return studentNum;
    }

    //여기에 코드를 작성하세요.

    @Override
    public int hashCode() {
        return studentNum.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Student) {
            Student compateStudentNum = (Student) obj;
            if (this.studentNum == compateStudentNum.studentNum) {
                return true;
            }
        }
        return false;
    }
}
package chapter11_2;

import java.util.HashMap;

public class StudentExample {
    public static void main(String[] args) {
        //Student키로 총점을 저장하는 HashMap 객체 생성
        HashMap<Student, String> hashmap = new HashMap<Student, String>();

        //new Student("1")의 점수 95를 저장
        hashmap.put(new Student("1"), "95");

        //new Student("1")로 점수를 읽어옴
        String score = hashmap.get(new Student("1"));
        System.out.println("1번 학생의 총점: "+score);
    }
}

4. Member 클래스를 작성하되, Object의 toString 메소드를 오버라이딩 해서 MemberExample 클래스의 실행결과처럼 나오도록 작성해보세요.

public class Member1 {
    private String name;
    private String id;

    public Member1(String name, String id) {
        this.name = name;
        this.id = id;
    }
    //여기서 코드를 작성하세요.

    @Override
    public String toString() {
        return name + ": " + id;
    }
}
import chapter11_2.Member;

public class MemberExample {
    public static void main(String[] args) {
        Member1 member = new Member1("blue", "이파란");
        System.out.println(member);
    }
}

5. Class 객체에 대한 설명 중 틀린 것은 무엇입니까?

  1. Class.forName() 메소드 또는 객체의 getClass() 메소드로 얻을 수 있다.
  2. 클래스의 생성자, 필드, 메소드에 대한 정보를 알아낼 수 있다. 
  3. newInstance() 메소드는 기본 생성자를 이용해서 객체를 생성시킨다. 
  4. newInstance()의 리턴 타입은 생성된 객체의 클래스 타입이다. 
더보기

+) 클래스 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체 생성이 가능하다. 

이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 매우 유용하게 사용된다. 

- Class.forName() 메소드로 Class 객체를 얻은 다음, newInstance() 메소드를 호출하면 Object 타입의 객체를 얻을 수 있다. 

- 해당 메소드는 기본 생성자를 호출해서 객체를 생성하기 때문에 반드시 클래스에 기본 생성자가 존재해야 한다. 

6. 다음에 주어진 바이트 배열을 문자열로 변환시켜보세요.

package chapter11_2;

public class BytesTOStringExample {
    public static void main(String[] args) {
        byte[] bytes = {73, 32, 108, 111, 118, 101, 32, 121, 111, 117};
        String str = new String(bytes);
        System.out.println(str);
    }
}

7. 다음 문자열에서 "자바"문자열이 포함되어 있는지 확인하고, "자바"를 Java로 대치한 새로운 문자열을 만들어보세요.

package chapter11_2;

public class FindAndReplaceExample {
    public static void main(String[] args) {
        String str = "모든 프로그램은 자바 언어로 개발될 수 있다.";
        int index = str.indexOf("자바");
        if(index == -1){
            System.out.println("자바 문자열이 포함되어 있지 않습니다.");
        }else {
            System.out.println("자바 문자열이 포함되어 있습니다.");
            str = str.replace("자바", "java");
            System.out.println("--->"+str);
        }

    }
}

8. 다음 문자열에서 쉼표(,)로 구분되어 있는 문자열을 String의 split()메소드 또는 StringTokenizer를 이용해서 분리해보세요.

package chapter11_2;

import java.util.Arrays;
import java.util.StringTokenizer;

public class SplitExample {
    public static void main(String[] args) {
        String str = "아이디,이름,패스워드";

        //방법1. split() 메소드 이용
        String[] result1 = str.split(",");
        for(String s : result1){
            System.out.println(s);
        }
        System.out.println();

        //방법2. StringTokenizer 이용
        //남아있는 토큰을 확인하고, while문으로 루핑
        StringTokenizer st = new StringTokenizer(str, ",");
        while(st.hasMoreTokens()){
            String token = st.nextToken();
            System.out.println(token);
        }
    }
}

9. 다음 코드는 1부터 100까지의 숫자를 통 문자열로 만들기 위해서 += 연산자를 이용해서 100번 반복하고 있습니다. 이것은 곧 100개 이상의 String 객체를 생성하는 결과를 만들기 때문에 좋은 코드라고 볼 수 없습니다. StringBuilder를 사용해서 좀 더 효율적인 코드로 개선시켜보세요.

package chapter11_2;

public class StringBuilderExample {
    public static void main(String[] args) {
        String str = "";
        for (int i = 1; i <= 100; i++) {
            str += i;
        }
        System.out.println(str);

        //개선 코드 작성 위치
        StringBuilder sb = new StringBuilder();
        for (int i = 1; i <= 100; i++) {
            sb.append(i);
        }
        System.out.println(sb);
    }
}

10. 첫 번째는 알파벳으로 시작하고 두 번째부터 숫자와 알파벳으로 구성된 8자 - 12자 사이의 ID값인지 검사하고 싶습니다. 알파벳은 대소문자를 모두 허용할 경우에 정규 표현식을 이용해서 검증하는 코드를 작성해보세요.

package chapter11_2;

import java.util.regex.Pattern;

public class PatternMatchExample {
    public static void main(String[] args) {
        String id = "5Angel1004";
        String reqExp = "/^[a-zA-Z]/[0-9a-zA-Z]{8,12}";
        boolean isMatch = Pattern.matches(reqExp, id);
        if(isMatch){
            System.out.println("ID로 사용할 수 있습니다.");
        }else {
            System.out.println("ID로 사용할 수 없습니다.");
        }
    }
}

참고:

 

[JS] 📚 정규표현식(RegExp) - 이해하기 쉽게 정리 + 응용 예제

정규표현식(Regular Expression) 정규식(Regular Expression)은 문자열에서 특정 내용을 찾거나 대체 또는 발췌하는데 사용된다. 대표적으로 입력칸에 전화번호나 이메일을 입력하라고 했을때 옳지 않은

inpa.tistory.com

11. 숫자 100과 300으로 각각 박싱된 Integer 객체를 == 연산자로 비교했습니다. 100을 박싱한 Integer 객체는 true가 나오는데 300을 박싱한 Integer 객체는 false가 나오는 이유를 설명해보세요.

package chapter11_2;

public class IntegerCompareExample {
    public static void main(String[] args) {
        Integer obj1 = 100;
        Integer obj2 = 100;
        Integer obj3 = 300;
        Integer obj4 = 300;

        System.out.println(obj1 == obj2);
        System.out.println(obj3 == obj4);
    }
}

정답: 박싱된 객체 내부의 값은 기본적으로 ==, != 연산자로 비교가 불가능하나, 

다음과 같은 값의 범위 내부에 해당하는 값일 경우, 예외적으로 비교가 가능하다. 

따라서 범위 내의 값인 100을 비교한 obj1 == obj2의 경우, true가 출력되지만

범위 외의 값이 300을 비교한 obj3 == obj4의 경우, false가 출력된다. 

더보기

 

+) 포장 객체는 내부의 값을 비교하기 위해 == 과 != 연산자를 사용할 수 없다. 

이 연산자는 내부의 값을 비교하는 것이 아니라 포장 객체의 참조를 비교하기 때문이다. 

포장 객체에 어떤 값이 저장될 지 모르는 상황이라면, 

직접 내부 값을 언박싱해서 비교하거나 (1), equals() 메소드로 내부 값을 비교(2) 하는 것이 좋다.

12. 문자열 "200"을 정수로 변환하는 코드와 숫자 150을 문자열로 변환하는 코드를 작성해보세요.

package chapter11_2;

public class StringConvertExample {
    public static void main(String[] args) {
        String strData1 = "200";
        int intData1 = Integer.parseInt(strData1);

        int intDate2 = 150;
        String strData2 = Integer.toString(intDate2);
    }
}

13. SimpleDateFormat 클래스를 이용해서 오늘의 날짜를 다음과 같이 출력하는 코드를 작성해보세요. 

package chapter11_2;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DatePrintExample {
    public static void main(String[] args) {
        Date now = new Date();

        //여기서 코드를 작성하세요.
        SimpleDateFormat sdf = new SimpleDateFormat(
                "yyyy년 MM월 dd일 E요일 hh시 mm분"
        );
        System.out.println(sdf.format(now));
    }
}

 

반응형