dohun.log

[Java]06.클래스-확인문제 본문

Study/Java

[Java]06.클래스-확인문제

dohun31 2021. 12. 29. 21:50

1. 객체와 클래스에 대한 설명으로 틀린 것은 무엇입니까?

  1. 클래스는 객체를 생성하기 위한 설계도(청사진)와 같은 것이다.
  2. new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
  3. 하나의 클래스로 하나의 객체만 생성할 수 있다. -> 하나의 클래스로 여러개의 객체 생성 가능
  4. 객체는 클래스의 인스턴스이다.

2. 클래스의 구성 멤버가 아닌 것은 무엇입니까?

  1. 필드(field)
  2. 생성자(constructor)
  3. 메소드(method)
  4. 로컬 변수(local variable) -> 클래스의 구성 멤버에는 필드, 생성자, 메소드가 있다.

3. 필드, 생성자, 메소드에 대한 설명으로 틀린 것은 무엇입니까?

  1. 필드는 객체의 데이터를 저장한다.
  2. 생성자는 객체의 초기화를 담당한다.
  3. 메소드는 객체의 동작 부분으로, 실행 코드를 가지고 있는 블록이다.
  4. 클래스는 반드시 필드와 메소드를 가져야 한다. -> 있을 수도 있고 없을 수도 있다.

4. 필드에 대한 설명으로 틀린 것은 무엇입니까?

  1. 필드는 메소드에서 사용할 수 있다.
  2. 인스턴스 필드 초기화는 생성자에서 할 수 있다.
  3. 필드는 반드시 생성자 선언 전에 선언되어야 한다. -> 생성자에서 할 수 있다.
  4. 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화된다.

5. 생성자에 대한 설명으로 틀린 것은 무엇입니까?

  1. 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다. -> 생성자 호출 필요
  2. 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다.
  3. 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다.
  4. 외부에서 객체를 생성할 수 없도록 생성자에 private 접근 제한자를 붙일 수 있다.

6. 메소드에 대한 설명으로 틀린 것은 무엇입니까?

  1. 리턴값이 없는 메소드는 리턴 타입을 void로 해야 한다.
  2. 리턴 타입이 있는 메소드는 리턴값을 지정하기 위해 반드시 return문이 있어야 한다.
  3. 매개값의 수를 모를 경우 "..."을 이용해서 매개 변수를 선언할 수 있다.
  4. 메소드의 이름은 중복해서 선언할 수 있다.

7. 메소드 오버로딩에 대한 설명으로 틀린 것은 무엇입니까?

  1. 동일한 이름의 메소드를 여러 개 선언하는 것을 말한다.
  2. 반드시 리턴 타입이 달라야 한다. -> 같아도 상관 없음
  3. 매개 변수의 타입, 수, 순서를 다르게 선언해야 한다.
  4. 매개값의 타입 및 수에 따라 호출될 메소드가 선택된다.

8. 인스턴스 멤버와 정적 멤버에 대한 설명으로 틀린 것은 무엇입니까?

  1. 정적 멤버는 static으로 선언된 필드와 메소드를 말한다.
  2. 인스턴스 필드는 생성자 및 정적 블록에서 초기화될 수 있다. -> 인스턴스 필드는 생성자에서 초기화, 정적 필드는 정적 블록에서 초기화
  3. 정적 필드와 정적 메소드는 객체 생성 없이 클래스를 통해 접근할 수 있다.
  4. 인스턴스 필드와 메소드는 객체를 생성하고 사용해야 한다.

9. final 필드와 상수 (static final)에 대한 설명으로 틀린 것은 무엇입니까?

  1. final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다.
  2. final 필드와 상수는 생성자에서 초기화될 수 있다. -> final 필드는 생성자에서 초기화, 상수는 정적 블록에서 초기화 가능
  3. 상수의 이름은 대문자로 작성하는 것이 관례이다.
  4. 상수는 객체 생성 없이 클래스를 통해 사용할 수 있다.

10. 패키지에 대한 설명으로 틀린 것은 무엇입니까?

  1. 패키지는 클래스들을 그룹화시키는 기능을 한다.
  2. 클래스가 패키지에 소속되려면 패키지 선언을 반드시 해야 한다.
  3. import문은 다른 패키지의 클래스를 사용할 때 필요하다.
  4. mycompany 패키지에 소속된 클래스는 yourcompany에 옮겨 놓아도 동작한다.

11. 접근 제한에 대한 설명으로 틀린 것은 무엇입니까?

  1. 접근 제한자는 클래스, 필드, 생성자, 메소드의 사용을 제한한다.
  2. public 접근 제한은 아무런 제한 없이 해당 요소를 사용할 수 있게 한다.
  3. default 접근 제한은 해당 클래스 내부에서만 사용을 허가한다. -> 해당 클래스 내부에서만 사용을 허가 : private, 같은 패키지내에서 사용 가능 : default
  4. 외부에서 접근하지 못하도록 하려면 private 접근 제한을 해야 한다.

12. 다음 클래스에서 해당 멤버가 필드, 생성자, 메소드 중 어떤 것인지 빈칸을 채우세요.

public class Member {
    private String name; // 필드
    
    public Memeber(String name) {...} // 생성자
    
    public void setName(String name) {...} // 메소드
}

13.

데이터 이름 필드 이름 타입
이름 name 문자열
아이디 id 문자열
패스워드 password 문자열
나이 age 정수
public class Member {
    String name;
    String id;
    String password;
    int age;
}

14.

public class Member {
    String name;
    String id;
    String password;
    int age;

    Member(String name, String id) {
        this.name = name;
        this.id = id;
    }
    
    public static void main(String[] args) {
        Member user1 = new Member("홍길동", "hong");
        Member user2 = new Member("감자바", "java");
        System.out.println(user1);
    }
}

15.

  1. login() 메서드는 매개 값 id"hong", 매개 값 password"12345"일 경우에만 true로 리턴하고 그 이외의 값일 경우에는 false를 리턴하도록 하세요.
  2. logout() 메서드의 내용은 "로그아웃 되었습니다."가 출력되도록 하세요.
리턴 타입 메소드 이름 매개 변수(타입)
boolean login id(String), password(String)
void logout id(String)
public class MemberService {
    public boolean login(String id, String password) {
        return id == "hong" && password == "12345";
    }
    
    public void logout(String id) {
        System.out.println("로그아웃 되었습니다.");
    }

    public static void main(String[] args) {
        MemberService memberService = new MemberService();
        boolean result = memberService.login("hong", "12345");
        if(result) {
            System.out.println("로그인 되었습니다.");
            memberService.logout("hong");
        } else {
            System.out.println("id 또는 password가 올바르지 않습니다.");
        }
    }
}

16.

public class Printer {
    public void println(String strData) {
        System.out.println(strData);
    }

    public void println(int intData) {
        System.out.println(intData);
    }

    public void println(boolean boolData) {
        System.out.println(boolData);
    }

    public void println(double doubleData) {
        System.out.println(doubleData);
    }
}

println() 메소드를 overload 해서 사용

static으로 선언하지 않았기 때문에 인스턴스를 생성해야만 println() 메소드를 사용할 수 있다.

17. 

public class Printer {
    public static void println(String strData) {
        System.out.println(strData);
    }

    public static void println(int intData) {
        System.out.println(intData);
    }

    public static void println(boolean boolData) {
        System.out.println(boolData);
    }

    public static void println(double doubleData) {
        System.out.println(doubleData);
    }
}

다음과 같이 println() 메소드를 static으로 선언한다면 인스턴스 생성 없이 바로 메서드를 사용할 수 있다.

18.

ShopService객체를 싱글톤으로 만들기.

 

ShopService타입의 필드 shopServicestatic으로 선언한다.

private static ShopService shopService;

ShopService를 반환하는 getInstance() 메소드를 작성한다.

  • 현재 shopService가 생성되어 있지 않다면 -> shopService를 생성함.
  • 현재 shopService가 생성되어 있다면 -> shopService 그대로 반환 (static이기 때문에 모든 인스턴스는 똑같은 shopService를 공유)
public static ShopService getInstance() {
    if(shopService == null) {
        shopService = new ShopService();
    }
    return shopService;
}

전체 코드 👇

더보기
public class ShopService {
    private static ShopService shopService;

    public static ShopService getInstance() {
        if(shopService == null) {
            shopService = new ShopService();
        }
        return shopService;
    }
}
public class ShopServiceExample {
    public static void main(String[] args) {
        ShopService obj1 = ShopService.getInstance();
        ShopService obj2 = ShopService.getInstance();

        if(obj1 == obj2) {
            System.out.println("같은 ShopService 객체 입니다.");
        } else {
            System.out.println("다른 ShopService 객체 입니다.");
        }
    }
}
// 같은 ShopService 객체 입니다.

19.

잔고(balance) 필드를 가지고 있는 객체 Account

public class Account {
    private int balance;
}

하한 값(MIN_BALANCE) 필드, 상한 값(MAX_BALANCE) 필드 작성

private static int MIN_BALANCE = 0;
private static int MAX_BALANCE = 1000000;
  • 모든 인스턴트가 동일한 값을 가지므로 static으로 선언 

getter() 메소드 작성

public int getBalance() {
    return balance;
}

setter() 메소드 작성

  • 매개 값이 음수이거나 백만 원을 초과하면 현재 balance값을 유지해야 함.
  • 👉매개값이 범위 내의 값이라면 갱신
  • 매개 값이 처음부터 음수나 백만 원이라면? -> 현재 balance값은 0으로 초기화되어있음.
void setBalance(int balance) {
    if(MIN_BALANCE <= balance && MAX_BALANCE >= balance) {
        this.balance = balance;
    }
}

전체 코드 👇

더보기
public class Account {
    private int balance;
    private static int MIN_BALANCE = 0;
    private static int MAX_BALANCE = 1000000;

    public int getBalance() {
        return balance;
    }

    void setBalance(int balance) {
        if(MIN_BALANCE <= balance && MAX_BALANCE >= balance) {
            this.balance = balance;
        }
    }
}
public class AccountExample {
    public static void main(String[] args) {
        Account account = new Account();

        account.setBalance(10000);
        System.out.println("현재 잔고: " + account.getBalance());

        account.setBalance(-100);
        System.out.println("현재 잔고: " + account.getBalance());

        account.setBalance(2000000);
        System.out.println("현재 잔고: " + account.getBalance());

        account.setBalance(300000);
        System.out.println("현재 잔고: " + account.getBalance());
    }
}
// 현재 잔고 : 10000
// 현재 잔고 : 10000
// 현재 잔고 : 10000
// 현재 잔고 : 300000

20. 

반복되는 출력문 메서드 작성

private static void printMode(String selectMode) {
    System.out.println("-------");
    System.out.println(selectMode);
    System.out.println("-------");
    // 남아있는 개행문자 없애기
    scanner.nextLine();
}

마지막의 scanner.nextLine()은 개행문자를 없애주지 않으니까 계좌 생성할 때 계좌번호: 계좌주: 이렇게 출력이 돼서 넣어주었다.

 

createAccount() 메서드 작성

  • ano, owner, balance 입력받아야 함.
  • 받은 데이터로 accountArray에 기록해주어야 함.
  • 지금까지 생성된 Account의 개수를 저장할 변수가 필요함.
private static int count = 0;
private static void createAccount() {
    printMode("계좌 생성");

    System.out.print("계좌 번호: ");
    String ano =  scanner.nextLine();

    System.out.print("계좌주: ");
    String owner =  scanner.nextLine();

    System.out.print("초기입금액: ");
    int balance = scanner.nextInt();

    accountArray[count] = new Account(ano, owner, balance);
    count++;
}

처음에 아래 처럼 적었었는데 생각해보니까 accountArray에는 Account를 받을 공간만 준비한 거지 실제로 Account 100개가 생성되어 있는 게 아니다.

따라서 setter를 사용할 수 없는데 사용하려고 해서 에러가 났음.

accountArray[count].setAno(ano);
accountArray[count].setOwner(owner);
accountArray[count].setBalance(balance);
count++;

👇이렇게 해야 에러가 안남.

accountArray[count] = new Account(ano, owner, balance);
count++;

 

accountList() 메서드 작성

  • 현재까지 생성된 Account를 모두 출력
private static void accountList() {
    printMode("계좌 목록");
    for(int i = 0; i < count; i++) {
        System.out.println(accountArray[i].getAno() + "\t" + accountArray[i].getOwner() + "\t" + accountArray[i].getBalance());
    }
}

 

deposit() 메서드 작성

  • 계좌 번호 확인
  • 예금액 확인
  • balance 수정
  • 예외 케이스 -> 찾는 계좌가 없을 때
private static void deposit() {
    printMode("예금");

    System.out.print("계좌 번호: ");
    String ano = scanner.nextLine();

    for(int i = 0; i < count; i++) {
        // == 이걸로 비교하면 안됨
        if(Objects.equals(ano, accountArray[i].getAno())) {
            System.out.print("예금액: ");
            int balance = scanner.nextInt();
            // 현재 금액 + 예금액
            int lastBalance = accountArray[i].getBalance() + balance;
            accountArray[i].setBalance(lastBalance);
            return;
        }
    }
    System.out.println("찾으시는 계좌가 없습니다.");
}

처음에 아래와 같이 비교했는데 똑같은 문자열도 그냥 넘겨버렸다.

IntelliJ에서 Objects.equals()를 써보라고 해서 써봤는데 바로 해결.. 

참조 타입 부분에서 String값이 똑같아도 같지 않다고 하는 케이스가 있었는데 이 케이스인 것 같다.

if(ano == accountArray[i].getAno()) {...}

 

withdraw() 메서드 작성

  • 계좌 번호 확인
  • 출금액 확인
  • balance 수정
  • 예외 케이스 -> 계좌에 있는 돈보다 출금액이 더 클 때, 찾는 계좌가 없을 때
private static void withdraw() {
    printMode("출금");

    System.out.print("계좌 번호: ");
    String ano = scanner.nextLine();

    for(int i = 0; i < count; i++) {
        // == 이걸로 비교하면 안됨
        if(Objects.equals(ano, accountArray[i].getAno())) {
            System.out.print("출금액: ");
            int balance = scanner.nextInt();
            // 현재 금액 - 예금액
            int lastBalance = accountArray[i].getBalance() - balance;
            // 돈이 있는지 확인
            if(lastBalance < 0) {
                System.out.println("계좌에 돈이 없습니다...");
            } else {
                accountArray[i].setBalance(lastBalance);
            }
            return;
        }
    }
    System.out.println("찾으시는 계좌가 없습니다.");
}

 

출처: 이것이 자바다 Chapter06 클래스

'Study > Java' 카테고리의 다른 글

[Java]05.참조 타입  (2) 2022.01.18
[Java]01.자바 시작하기  (1) 2022.01.11
[Java]04.조건문과 반복문  (0) 2022.01.11
[Java]03.연산자  (0) 2022.01.10
[Java] 02.변수와 타입  (0) 2021.12.20
Comments