이것이 자바다 6장 클래스 Quiz
안녕하세요. pitang입니다.
6장, 20문제를 살펴보겠습니다.
1번
객체와 클래스에 대한 설명으로 틀린 것은 무엇입니까?
1. 클래스는 객체를 생성하기 위한 설계도(청사진)와 같은 것이다.
2. new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
3. 하나의 클래스로 하나의 객체만 생성할 수 있다.
4. 객체는 클래스의 인스턴스이다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
3번
설계도가 클래스이고, 객체를 인스턴스라고 한다.
하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있다.
new 클래스(); 는 클래스로부터 객체를 생성시키는 연산자이다.
2번
클래스의 구성 멤버가 아닌 것은 무엇입니까?
1. 필드(field)
2. 생성자(constructor)
3. 메서드(method)
4. 로컬 변수(local variable)
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
4번
클래스에는 필드와 메서드 그리고 생성자로 구성되어있다.
필드는 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳이다.
필드 선언은 클래스 중괄호 {} 블록 어디서든 존재할 수 있다.
생성자 선언과 메서드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다.
하지만, 생성자와 메서드 중괄호 블록 내부에는 선언될 수 없다. 거기에 선언된 것을 로컬 변수라 부른다.
즉, 로컬 변수는 생성자와 메서드 중괄호 블록 내부에 선언된 것이다.
3번
필드, 생성자, 메서드에 대한 설명으로 틀린 것은 무엇입니까?
1. 필드는 객체의 데이터를 저장한다.
2. 생성자는 객체의 초기화를 담당한다.
3. 메서드는 객체의 동작 부분으로, 실행 코드를 가지고 있는 블록이다.
4. 클래스는 반드시 필드와 메서드를 가져야 한다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
4번
클래스의 구성 멤버들은 생략되거나 복수 개가 작성될 수 있다.
필드는 객체의 데이터가 저장되는 곳,
생성자는 객체 생성 시 초기화 역할 담당,
메서드는 객체의 동작에 해당하는 실행 블록이다.
4번
필드에 대한 설명으로 틀린 것은 무엇입니까?
1. 필드는 메서드에서 사용할 수 있다.
2. 인스턴스 필드 초기화는 생성자에서 할 수 있다.
3. 필드는 반드시 생성자 선언 전에 선언되어야 한다.
4. 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화된다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
3번
생성자 선언과 메서드 선언의 앞과 뒤 어떤 곳에서도 필드 선언이 가능하다.
필드를 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다.
객체가 생성될 때 필드는 기본 초기값으로 자동 설정된다.
5번
생성자에 대한 설명으로 틀린 것은 무엇입니까?
1. 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다.
2. 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다.
3. 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다.
4. 외부에서 객체를 생성할 수 없도록 생성자에 private 접근 제한자를 붙일 수 있다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
1번
생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다.
클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동 추가시킨다.
this()는 자신의 다른 생성자를 호출할 수 있고 반드시 생성자의 첫 줄에서만 허용된다.
private 접근 제한은 동일 패키지이건 다른 패키지이건 상관없이 필드와 메서드를 사용하지 못하도록 제한한다.
private 접근 제한자는 오로지 클래스 내부에서만 사용 가능하다.
또는 Getter와 Setter 메서드를 통해 사용 가능하다.
6번
메서드에 대한 설명으로 틀린 것은 무엇입니까?
1. 리턴 값이 없는 메서드는 리턴 타입을 void로 해야 한다.
2. 리턴 타입이 있는 메서드는 리턴 값을 지정하기 위해 반드시 return문이 있어야 한다.
3. 매개 값의 수를 모를 경우 "..."를 이용해서 매개 변수를 선언할 수 있다.
4. 메서드의 이름은 중복해서 선언할 수 없다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
4번
매개변수를 "..."를 사용해서 선언하게 되면,
메서드 호출 시 넘겨준 값의 수에 따라 자동으로 배열이 생성되고 매개 값으로 사용된다.
클래스 내에 같은 이름의 메서드를 여러 개 선언하는 것을 메서드 오버 로딩이라고 한다.
7번
메서드 오버 로딩에 대한 설명으로 틀린 것은 무엇입니까?
1. 동일한 이름의 메서드를 여러 개 선언하는 것을 말한다.
2. 반드시 리턴 타입이 달라야 한다.
3. 매개 변수의 타입, 수, 순서를 다르게 선언해야 한다.
4. 매개 값의 타입 및 수에 따라 호출될 메서드가 선택된다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
2번
클래스 내에 같은 이름의 메서드를 여러 개 선언하는 것을 메서드 오버 로딩이라 하고
조건은 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
리턴 타입만 다르고 매개 변수가 동일하다면 그것은 오버 로딩이 아니다.
8번
인스턴스 멤버와 정적 멤버에 대한 설명으로 틀린 것은 무엇입니까?
1. 정적 멤버는 static으로 선언된 필드와 메서드를 말한다.
2. 인스턴스 필드는 생성자 및 정적 블록에서 초기화될 수 있다.
3. 정적 필드와 정적 메서드는 객체 생성 없이 클래스를 통해 접근할 수 있다.
4. 인스턴스 필드와 메서드는 객체를 생성하고 사용해야 한다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
2번
정적 메서드와 정적 블록을 선언할 때 주의할 점은 객체가 없어도 실행된다는 특징 때문에,
이들 내부에 인스턴스 필드나 인스턴스 메서드를 사용할 수 없다. 또한 객체 자신의 참조인 this 키워드도 사용 불가능이다.
정적 메서드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 한다.
9번
final 필드와 상수(static final)에 대한 설명으로 틀린 것은 무엇입니까?
1. final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다.
2. final 필드와 상수는 생성자에서 초기화될 수 있다.
3. 상수의 이름은 대문자로 작성하는 것이 관례이다.
4. 상수는 객체 생성 없이 클래스를 통해 사용할 수 있다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
2번
final 필드는 한 번 초기화되면 수정할 수 없는 필드이다.
final 필드는 객체마다 저장되고, 생성자의 매개 값을 통해서 여러 가지 값을 가질 수 있다.
상수는 static 이면서 final 이어야 한다.
상수 이름은 모두 대문자로 작성하는 것이 관례이며 혼합된 이름이라면 언더 바로 단어들을 연결해준다.
static final 필드는 객체마다 저장되지 않고, 클래스에만 포함되며 한 번 초기값이 저장되면 변경할 수 없다.
10번
패키지에 대한 설명으로 틀린 것은 무엇입니까?
1. 패키지는 클래스들을 그룹화시키는 기능을 한다.
2. 클래스가 패키지에 소속되려면 패키지 선언을 반드시 해야 한다.
3. import문은 다른 패키지의 클래스를 사용할 때 필요하다.
4. mycompany 패키지에 소속된 클래스는 yourcompany에 옮겨 놓아도 동작한다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
4번
패키지는 단순히 파일 시스템의 폴더 기능만 하는 것이 아니라 클래스의 일부분이다.
패키지는 클래스를 유일하게 만들어주는 식별자 역할을 한다.
패키지가 중요한 이유는 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스는 사용할 수 없기 때문이다.
11번
접근 제한에 대한 설명으로 틀린 것은 무엇입니까?
1. 접근 제한자는 클래스, 필드, 생성자, 메서드의 사용을 제한한다.
2. public 접근 제한은 아무런 제한 없이 해당 요소를 사용할 수 있게 한다.
3. default 접근 제한은 해당 클래스 내부에서만 사용을 허가한다.
4. 외부에서 접근하지 못하도록 하려면 private 접근 제한을 해야 한다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
3번
접근 제한자는 public, protected, default, private와 같이 네 가지 종류가 있다.
public - 외부 클래스가 자유롭게 사용할 수 있는 공개 멤버
protected - 같은 패키지 또는 자식 클래스에서 사용할 수 있는 멤버
default - 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버, 다른 패키지 사용 불가.
private - 외부에 노출되지 않는 멤버
이다.
12번
다음 클래스에서 해당 멤버가 필드, 생성자, 메서드 중 어떤 것인지 빈칸을 채우세요.
public class Member { private String name; //(1) public Member(String name) {...} //(2) public void setName(String name) {...} //(3) }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
(1) 필드
(2) 생성자
(3) 메서드
13번
현실 세계의 회원을 Member 클래스로 모델링하려고 합니다. 회원의 데이터로는 이름, 아이디, 패스워드, 나이가 있습니다.
이 데이터들을 가지는 Member 클래스를 선언해보세요.
데이터 이름 | 필드 이름 | 타입 |
이름 | name | 문자열 |
아이디 | id | 문자열 |
패스워드 | password | 문자열 |
나이 | age | 정수 |
public class Member { //작성 위치 }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Member { String name; String id; String password; int age; }
14번
위에서 작성한 Member 클래스에 생성자를 추가하려고 합니다.
다음과 같이 Member 객체를 생성할 때 name 필드와 id 필드를 외부에서 받은 값으로 초기화하려면 생성자를 어떻게 선언해야 합니까?
Member user1 = new Member("홍길동", "hong");
Member user2 = new Member("강자바", "java");
public class Member { //작성 위치 }
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Member {
String name;
String id;
String password;
int age;
Member(String name, String id) {
this.name = name;
this.id = id;
}
}
15번
MemberService 클래스에 login() 메서드와 logout() 메서드를 선언하려고 합니다.
login() 메서드를 호출할 때에는 매개 값으로 id와 password를 제공하고, logout() 메서드는 id만 매개 값으로 제공합니다. MemberService 클래스와 login(), logout() 메서드를 선언해보세요.
1. login() 메서드는 매개 값 id가 "hong", 매개 값 password가 "12345"일 경우에만 true로 리턴하고 그 이외의 값일 경우에는 false를 리턴하도록 하세요.
2. logout() 메서드의 내용은 "로그아웃 되었습니다."가 출력되도록 하세요.
리턴 타입 | 메소드 이름 | 매개 변수(타입) |
boolean | login | id(String), password(String) |
void | logout | id(String) |
public class MemberService() { //작성위치 }
public class MemberServiceExample { 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가 올바르지 않습니다."); } } }
<console>
로그인 되었습니다.
로그아웃 되었습니다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Member { boolean login(String id, String password) { if("hong".equals(id) && "12345".equals(password) { return true; } else { return false; } } void logout(String id) { System.out.println("로그아웃 되었습니다."); } }
16번
PrinterExample 클래스에서 Printer 객체를 생성하고 println() 메서드를 호출해서 매개 값을 콘솔에 출력하려고 합니다.
println() 메서드의 매개 값으로는 int, boolean, double, String 값을 줄 수 있습니다.
Printer 클래스에서 println() 메서드를 선언해보세요.
public class Printer { //작성위치 }
public class PrinterExample { public static void main(String[] args) { Printer printer = new Printer(); printer.println(10); printer.println(true); printer.println(5.7); printer.println("홍길동"); } }
<console>
10
true
5.7
홍길동
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Printer { void println(int a) { System.out.println(a); } void println(boolean a) { System.out.println(a); } void println(double a) { System.out.println(a); } void println(String a) { System.out.println(a); } }
17번
16번 문제에서는 Printer 객체를 생성하고 println() 메서드를 생성했습니다.
Printer 객체를 생성하지 않고 PrinterExample 클래스에서 다음과 같이 호출하려면 Printer 클래스를 어떻게 수정하면 될까요?
public class Printer { //작성위치 }
public class PrinterExample { public static void main(String[] args) { Printer printer = new Printer(); printer.println(10); printer.println(true); printer.println(5.7); printer.println("홍길동"); } }
<console>
10
true
5.7
홍길동
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Printer { static println(int a) { System.out.println(a); } static println(boolean a) { System.out.println(a); } static println(double a) { System.out.println(a); } static println(String a) { System.out.println(a); } }
18번
ShopService 객체를 싱글톤으로 만들고 싶습니다.
ShopServiceExample 클래스에서 ShopService의 getInstance() 메서드로 싱글톤을 얻을 수 있도록
ShopService 클래스를 작성해보세요.
public class 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 객체 입니다."); } } }
<console>
같은 ShopService 객체 입니다.
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class ShopService { private static ShopService shopService = new ShopService(); private ShopService(){} static ShopService getInstance() { return shopService; } }
싱글톤 패턴이란, 인스턴스가 오직 1개만 생성되어야 하는 경우에 사용하는 방식이다.
싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
그러므로 private 접근 제한자를 붙여주면 된다.
그리고 자신의 타입인 정적 필드(private static 인스턴스 변수)를 하나 선언하고 자신의 객체를 생성해 초기화한다.
대신 외부에서 호출할 수 있는 정적 메서드인 public static getInstance()를 선언하고
정적 필드에서 참조하고 있는 자신의 객체를 리턴한다.
19번
은행 계좌 객체인 Account 객체는 잔고(balance) 필드를 가지고 있습니다.
balance 필드는 음수 값이 될 수 없고, 최대 백만 원까지만 저장할 수 있습니다.
외부에서 balance 필드를 마음대로 변경하지 못하도록 하고,
0 <= balance <= 1,000,000 범위의 값만 가질 수 있도록 Account 클래스를 작성해보세요.
1. Setter와 Getter를 이용하세요.
2. 0과 1,000,000은 MIN_BALANCE와 MAX_BALANCE 상수를 선언해서 이용하세요.
3. Setter의 매개 값이 음수이거나 백만 원을 초과하면 현재 balance 값을 유지하세요.
public class Account { //작성 위치 }
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()); } }
<console>
현재 잔고 : 10000
현재 잔고 : 10000
현재 잔고 : 10000
현재 잔고 : 300000
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class Account { static final int MIN_BALANCE = 0; static final int MAX_BALANCE = 1000000; private int balance = 0; public void setBalance(int balance) { if(balance >= MIN_BALANCE && balance <= MAX_BALANCE) { this.balance = balance; } } public getBalance() { return this.balance; } }
20번
다음은 키보드로부터 계좌 정보를 입력받아서, 계좌를 관리하는 프로그램입니다.
실행 결과를 보고, 알맞게 BankApplication 클래스의 메서드를 작성해보세요.
public class Account { private String ano; //계좌번호 private String owner; //계좌주 private int balance; //잔액 //생성자 public Account(String ano, String owner, int balance) { this.ano = ano; this.owner = owner; this.balance = balance; } public String getAno() { return ano; } public void setAno(String ano) { this.ano = ano; } public String getOwner() { return owner; } public void setOwner(String owner) { this.owner = owner; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
public class BankApplication { private static Account[] accountArray = new Account[100]; private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { boolean run = true; //while문에서 사용. while(run) { System.out.println("-----------------------------------------------"); System.out.println("1. 계좌생성 | 2. 계좌목록 | 3. 예금 | 4. 출금 | 5. 종료"); System.out.println("-----------------------------------------------"); System.out.println("선택 > "); int selectNo = scanner.nextInt(); if(selectNo == 1) { createAccount(); } else if(selectNo == 2) { accountList(); } else if(selectNo == 3) { deposit(); } else if(selectNo == 4) { withdraw(); } else if(selectNo == 5) { run = false; } } System.out.println("프로그램 종료"); } //계좌생성하기 private static void createAccount() { //작성 위치 } //계좌목록보기 private static void accountList() { //작성 위치 } //예금하기 private static void deposit() { //작성 위치 } //출금하기 private static void withdraw() { //작성 위치 } //Account 배열에서 ano와 동일한 Account 객체 찾기 private static Account findAccount(String ano) { //작성 위치 } }
<console>console
⬇️⬇️⬇️ 정답은 더보기를 눌러주세요 ⬇️⬇️⬇️
public class BankApplication { // Account객체를 아이템으로 가질 수 있음. // 참조타입이 아이템일 경우 null로 초기화 됨. private static Account[] accountArray = new Account[100]; // private static int size = 0; //size로 accountArray[size]로 해도 됨. private static Scanner scanner = new Scanner(System.in); //왜 static이냐? 우리가 사용하는 메서드가 전부 static이기에 public static void main(String[] args) { boolean run = true; //while문에서 사용. while(run) { System.out.println("-----------------------------------------------"); System.out.println("1. 계좌생성 | 2. 계좌목록 | 3. 예금 | 4. 출금 | 5. 종료"); System.out.println("-----------------------------------------------"); System.out.print("선택 > "); int selectNo = scanner.nextInt(); if(selectNo == 1) { createAccount(); } else if(selectNo == 2) { accountList(); } else if(selectNo == 3) { deposit(); } else if(selectNo == 4) { withdraw(); } else if(selectNo == 5) { run = false; } } System.out.println("프로그램 종료"); } private static void createAccount() { System.out.println("----------------"); System.out.println("계좌생성"); System.out.println("----------------"); System.out.print("계좌번호 : "); String ano = scanner.next(); System.out.print("계좌주 : "); String owner = scanner.next(); System.out.print("초기입금액 : "); int balance = scanner.nextInt(); Account account = new Account(ano, owner, balance); for(int i = 0; i < accountArray.length; i++) { if(accountArray[i] == null) { accountArray[i] = account; System.out.println("결과 : 계좌가 생성되었습니다."); break; } } } private static void accountList() { System.out.println("----------------"); System.out.println("계좌목록"); System.out.println("----------------"); for(int i = 0; i < accountArray.length; i++) { Account account = accountArray[i]; if(account != null) { System.out.print(account.getAno()); System.out.print(" "); System.out.print(account.getOwner()); System.out.print(" "); System.out.print(account.getBalance()); System.out.println(); } } } private static void deposit() { System.out.println("----------------"); System.out.println("예금"); System.out.println("----------------"); System.out.print("계좌번호"); String ano = scanner.next(); System.out.print("예금액 : "); int money = scanner.nextInt(); Account account = findAccount(ano); if(account == null) { System.out.println("결과 : 계좌가 없습니다."); return; } account.setBalance(account.getBalance() + money); System.out.println("결과 : 예금이 성공되었습니다."); } private static void withdraw() { System.out.println("----------------"); System.out.println("출금"); System.out.println("----------------"); System.out.print("계좌번호 : "); String ano = scanner.next(); System.out.print("출금액 : "); int money = scanner.nextInt(); Account account = findAccount(ano); if(account == null) { System.out.println("결과 : 계좌가 없습니다."); return; } account.setBalance(account.getBalance() - money); System.out.println("결과 : 출금이 성공되었습니다."); } //Account 배열에서 ano와 동일한 Account 객체 찾기 private static Account findAccount(String ano) { Account account = null; for(int i = 0; i < accountArray.length; i++) { if(accountArray[i] != null) { String dbAno = accountArray[i].getAno(); if(dbAno.equals(ano)) { account = accountArray[i]; break; } } } return account; } }
감사합니다.
*m1 맥북을 사용 중입니다.*