일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CSSOM
- Java
- 확인문제
- 우선순위역전
- 놀러와요_해커톤
- 타입
- DB #데이터베이스
- OS
- js
- 부스트캠프
- 렌더 트리
- 우선순위상속프로토콜
- 브라우저 렌더링
- 인프콘
- 모던 자바스크립트
- 부스트컨퍼런스
- 상태관리
- 부스트캠프웹모바일
- 운영체제
- GDSC_PKNU
- javascript
- 회고
- 멤버십
- 모던자바스크립트
- CRDT
- 부스트캠프7기
- GDSC
- 데이터독립성
- 그룹프로젝트
- 변수
- Today
- Total
dohun.log
[Java]06.클래스-확인문제 본문
1. 객체와 클래스에 대한 설명으로 틀린 것은 무엇입니까?
- 클래스는 객체를 생성하기 위한 설계도(청사진)와 같은 것이다.
- new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
- 하나의 클래스로 하나의 객체만 생성할 수 있다. -> 하나의 클래스로 여러개의 객체 생성 가능
- 객체는 클래스의 인스턴스이다.
2. 클래스의 구성 멤버가 아닌 것은 무엇입니까?
- 필드(field)
- 생성자(constructor)
- 메소드(method)
- 로컬 변수(local variable) -> 클래스의 구성 멤버에는 필드, 생성자, 메소드가 있다.
3. 필드, 생성자, 메소드에 대한 설명으로 틀린 것은 무엇입니까?
- 필드는 객체의 데이터를 저장한다.
- 생성자는 객체의 초기화를 담당한다.
- 메소드는 객체의 동작 부분으로, 실행 코드를 가지고 있는 블록이다.
- 클래스는 반드시 필드와 메소드를 가져야 한다. -> 있을 수도 있고 없을 수도 있다.
4. 필드에 대한 설명으로 틀린 것은 무엇입니까?
- 필드는 메소드에서 사용할 수 있다.
- 인스턴스 필드 초기화는 생성자에서 할 수 있다.
- 필드는 반드시 생성자 선언 전에 선언되어야 한다. -> 생성자에서 할 수 있다.
- 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화된다.
5. 생성자에 대한 설명으로 틀린 것은 무엇입니까?
- 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다. -> 생성자 호출 필요
- 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다.
- 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다.
- 외부에서 객체를 생성할 수 없도록 생성자에 private 접근 제한자를 붙일 수 있다.
6. 메소드에 대한 설명으로 틀린 것은 무엇입니까?
- 리턴값이 없는 메소드는 리턴 타입을 void로 해야 한다.
- 리턴 타입이 있는 메소드는 리턴값을 지정하기 위해 반드시 return문이 있어야 한다.
- 매개값의 수를 모를 경우 "..."을 이용해서 매개 변수를 선언할 수 있다.
- 메소드의 이름은 중복해서 선언할 수 있다.
7. 메소드 오버로딩에 대한 설명으로 틀린 것은 무엇입니까?
- 동일한 이름의 메소드를 여러 개 선언하는 것을 말한다.
- 반드시 리턴 타입이 달라야 한다. -> 같아도 상관 없음
- 매개 변수의 타입, 수, 순서를 다르게 선언해야 한다.
- 매개값의 타입 및 수에 따라 호출될 메소드가 선택된다.
8. 인스턴스 멤버와 정적 멤버에 대한 설명으로 틀린 것은 무엇입니까?
- 정적 멤버는 static으로 선언된 필드와 메소드를 말한다.
- 인스턴스 필드는 생성자 및 정적 블록에서 초기화될 수 있다. -> 인스턴스 필드는 생성자에서 초기화, 정적 필드는 정적 블록에서 초기화
- 정적 필드와 정적 메소드는 객체 생성 없이 클래스를 통해 접근할 수 있다.
- 인스턴스 필드와 메소드는 객체를 생성하고 사용해야 한다.
9. final 필드와 상수 (static final)에 대한 설명으로 틀린 것은 무엇입니까?
- final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다.
- final 필드와 상수는 생성자에서 초기화될 수 있다. -> final 필드는 생성자에서 초기화, 상수는 정적 블록에서 초기화 가능
- 상수의 이름은 대문자로 작성하는 것이 관례이다.
- 상수는 객체 생성 없이 클래스를 통해 사용할 수 있다.
10. 패키지에 대한 설명으로 틀린 것은 무엇입니까?
- 패키지는 클래스들을 그룹화시키는 기능을 한다.
- 클래스가 패키지에 소속되려면 패키지 선언을 반드시 해야 한다.
- import문은 다른 패키지의 클래스를 사용할 때 필요하다.
- mycompany 패키지에 소속된 클래스는 yourcompany에 옮겨 놓아도 동작한다.
11. 접근 제한에 대한 설명으로 틀린 것은 무엇입니까?
- 접근 제한자는 클래스, 필드, 생성자, 메소드의 사용을 제한한다.
- public 접근 제한은 아무런 제한 없이 해당 요소를 사용할 수 있게 한다.
- default 접근 제한은 해당 클래스 내부에서만 사용을 허가한다. -> 해당 클래스 내부에서만 사용을 허가 : private, 같은 패키지내에서 사용 가능 : default
- 외부에서 접근하지 못하도록 하려면 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.
- login() 메서드는 매개 값 id가 "hong", 매개 값 password가 "12345"일 경우에만 true로 리턴하고 그 이외의 값일 경우에는 false를 리턴하도록 하세요.
- 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타입의 필드 shopService를 static으로 선언한다.
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 |