[이것이 자바다] 06 클래스 확인문제
클래스의 구성 멤버
public class ClassName{
//Field
int fieldName;
//Constructor
ClassName(){...}
//Method
void methodName(){...}
}
필드(Field)
객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳
변수와 비슷하지만 객체가 소멸되지 않는 한 계속 사용이 가능하다.
생성자(Constructor)
객체 생성 시 초기화를 담당
필드를 초기화하거나, 메소드를 호출해 객체를 사용할 준비를 한다.
메소드와 비슷하지만 리턴타입이 없다는 특징이 있다.
클래스 이름과 생성자의 이름은 같아야 한다.
기본 생성자
생성자를 선언하지 않았을 때는 컴파일러가 기본 생성자를 바이트 코드에 추가한다.
생성자 선언
일반적으로 필드에 초기 값을 저장하거나 객체를 사용하기 전 준비하는데 사용한다.
생성자는 오버로딩하여 사용할 수 있다.
오버로딩을 할 때는 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.//Declare public class Car{ //Field String model; String color; int maxSpeed; //Constructor Car(String model, String color, int maxSpeed){ this.model = model; this.color = color; this.maxSpeed = maxSpeed; } } //Use Car myCar = new Car("그랜저", "검정", 300);
메소드(Method)
매개값을 받아 다른 값을 리턴하는 동작 등 다양한 역할을 한다.
Singleton
단 하나만 생성되는 객체. 클래스 외부에서 생성자를 호출할 수 없도록 해야한다.
public class SingletonExample{
//static Field
private static SingletonExample singleton = new SingletonExample();
//Constructor
private SingletonExample(){}
//static Method
static SingletonExample getInstance(){
return singleton;
}
}
//Can't Use (Compile Error)
SingletonExample object1 = new SingletonExample();
//Use
SingletonExample object1 = SingletonExample.getInstance();
Annotation
어노테이션은 메타데이터(metadata)라고 볼 수 있다.
메타데이터란 앱이 처리해야할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보이다.
아래와 같이 작성한다.
@AnnotationName
- 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행 시(런타임 시)특정 기능을 실행하도록 정보 제공
대표적인 예로는 @Override가 있다.
메소드가 오버라이드된 것을 컴파일러에게 알려주고 컴파일러가 오버라이드 검사를 하도록 한다.
확인문제
객체와 클래스에 대한 설명으로 틀린 것은?
- 클래스는 객체를 생성하기 위한 설계도(청사진)와 같은 것이다.
- new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
- 하나의 클래스로 하나의 객체만 생성할 수 있다.
- 객체는 클래스의 인스턴스이다.
하나의 클래스로 여러개의 객체를 생성 가능하다.
클래스의 구성 멤버가 아닌 것은?
- 필드(Field)
- 생성자(Constructor)
- 메소드(Method)
- 로컬 변수(local variable)
로컬 변수는 메소드의 구성 멤버라고 볼 수 있을 것 같다.
필드, 생성자, 메소드에 대한 설명으로 틀린 것은?
- 필드는 객체의 데이터를 저장한다.
- 생성자는 객체의 초기화를 담당한다.
- 메소드는 객체의 동작 부분으로, 실행 코드를 가지고 있는 블록이다.
- 클래스는 반드시 필드와 메소드를 가져야 한다.
클래스는 반드시 필드와 메소드를 가질 필요는 없다.
필드에 대한 설명으로 틀린 것은?
- 필드는 메소드에서 사용할 수 있다.
- 인스턴스 필드 초기화는 생성자에서 할 수 있다.
- 필드는 반드시 생성자 선언 전에 선언되어야 한다.
- 필드는 초기값을 주지 않더라도 기본값으로 자동 초기화된다.
필드는 클래스 내부 어디에서나 선언 가능하지만, 메소드와 생성자 안에서는 불가능하다.
생성자에 대한 설명으로 틀린 것은?
- 객체를 생성하려면 생성자 호출이 반드시 필요한 것은 아니다.
- 생성자는 다른 생성자를 호출하기 위해 this()를 사용할 수 있다.
- 생성자가 선언되지 않으면 컴파일러가 기본 생성자를 추가한다.
- 외부에서 객체를 생성할 수 없도록 생성자에 private 접근 제한자를 붙일 수 있다.
객체를 생성하려면 반드시 생성자를 호출해야 한다.
메소드에 대한 설명으로 틀린 것은?
- 리턴값이 없는 메소드는 리턴 타입을 void로 해야 한다.
- 리턴 타입이 있는 메소드는 리턴값을 지정하기 위해 반드시 return문이 있어야 한다.
- 매개값의 수를 모를 경우 “…“를 이용해서 매개 변수를 선언할 수 있다.
- 메소드의 이름은 중복해서 선언할 수 없다.
메소드의 이름은 중복해서 선언 가능하다. 이를 오버로딩이라고 한다.
대신 메소드의 매개변수의 개수, 타입, 순서 중 하나가 달라야 오버로딩이 가능하다.
메소드 오버로딩에 대한 설명으로 틀린 것은?
- 동일한 이름의 메소드를 여러 개 선언하는 것을 말한다.
- 반드시 리턴 타입이 달라야 한다.
- 매개 변수의 타입, 수, 순서를 다르게 선언해야 한다.
- 매개값의 타입 및 수에 따라 호출될 메소드가 선택된다.
반드시 리턴 타입이 다를 필요는 없다.
인스턴스 멤버와 정적 멤버에 대한 설명으로 틀린 것은?
- 정적 멤버는 static으로 선언된 필드와 메소드를 말한다.
- 인스턴스 필드는 생성자 및 정적 블록에서 초기화될 수 있다.
- 정적 필드와 정적 메소드는 객체 생성 없이 클래스를 통해 접근할 수 있다.
- 인스턴스 필드와 메소드는 객체를 생성하고 사용해야 한다.
인스턴스 필드는 생성자에서는 초기화될 수 있지만 정적 블록에서 초기화 될 수는 없다.
인스턴스 필드를 정적 블록에서 초기화하고 싶다면 객체를 생성하고 참조변수로 접근해야 한다.
final 필드와 상수(static final)에 대한 설명으로 틀린 것은?
- final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다.
- final 필드와 상수는 생성자에서 초기화될 수 있다.
- 상수의 이름은 대문자로 작성하는 것이 관례이다.
- 상수는 객체 생성 없이 클래스를 통해 사용할 수 있다.
final 필드는 생성자에서 초기화할 수 있지만 상수는 초기화할 수 없다.
상수를 초기화하려면 정적 블록을 활용해야 한다.
패키지에 대한 설명으로 틀린 것은?
- 패키지는 클래스들을 그룹화시키는 기능을 한다.
- 클래스가 패키지에 소속되려면 패키지 선언을 반드시 해야 한다.
- import문은 다른 패키지의 클래스를 사용할 때 필요하다.
- mycompany 패키지에 소속된 클래스는 yourcompany에 옮겨 놓아도 동작한다.
mycompany 패키지에 소속된 클래스를 yourcompany에 파일만 옮긴다고 동작하지는 않는다. 패키지 라인명을 수정해야 한다.
접근 제한에 대한 설명으로 틀린 것은?
- 접근 제한자는 클래스, 필드, 생성자, 메소드의 사용을 제한한다.
- public 접근 제한은 아무런 제한 없이 해당 요소를 사용할 수 있게 한다.
- default 접근 제한은 해당 클래스 내부에서만 사용을 허가한다.
- 외부에서 접근하지 못하도록 하려면 private 접근을 해야 한다.
default 접근 제한은 해당 패키지 내부에서의 사용을 허가한다.
다음 클래스에서 해당 멤버가 필드, 생성자, 메소드 중 어떤 것인지 적으시오
public class Member{
private String name; //Field
public Member(String name){ ... } //Constructor
public void setName(String name){ ... } //Method
}
아래 데이터를 가지는 Member 클래스를 선언해보시오
데이터 이름 | 필드 이름 | 타입 |
이름 | name | 문자열 |
아이디 | id | 문자열 |
패스워드 | password | 문자열 |
나이 | age | 정수 |
public class Member{
String name;
String id;
String password;
int age;
}
위 클래스에 name필드와 id 필드를 외부에서 받은 값으로 초기화 하는 생성자를 작성하시오
public class Member{
String name;
String id;
String password;
int age;
Member(String name, String id){
this.name = name;
this.id = id;
}
}
MemberService 클래스에 아래 조건을 만족하도록 메소드를 작성하시오
- login() 메소드는 매개값으로 id, password를 제공
- logout() 메소드는 id만 매개값으로 제공
- login() 메소드는 id “hong”, password “12345”일 경우만 true, 그 외 false
- logout() 메소드는 “로그아웃 되었습니다.”가 출력
public class MemberService{
String id;
String password;
public boolean login(String id, String password){
if(id.equals("hong") && password.equals("12345"))
return true;
return false;
}
public void logout(String id){
System.out.println("로그아웃 되었습니다.");
}
}
Printer 클래스에서 아래 조건을 만족하는 메소드를 작성하시오
- println() 메소드는 매개값으로 int, boolean, double, String을 줄 수 있다.
public class Printer{
public void println(int input){
System.out.println(input);
}
public void println(boolean input){
System.out.println(input);
}
public void println(double input){
System.out.println(input);
}
public void println(String input){
System.out.println(input);
}
}
위 Printer 객체를 생성하지 않고 다른 클래스에서 호출할 수 있도록 작성하시오
public class Printer{
public static void println(int input){
System.out.println(input);
}
public static void println(boolean input){
System.out.println(input);
}
public static void println(double input){
System.out.println(input);
}
public static void println(String input){
System.out.println(input);
}
}
ShopService 객체를 싱글톤으로 작성하시오
public class ShopService{
private static ShopService shop = new ShopService();
private ShopService(){}
static ShopService getInstance(){
return shop;
}
}
아래 조건을 만족하는 Account 클래스를 작성하시오
- balance는 0 <= balance <= 1000000 범위만 가능하다.
- 외부에서 balance 필드를 마음대로 변경할 수 없다.
- Setter, Getter를 이용한다.
- 0과 1000000은 MIN_BALANCE와 MAX_BALANCE 상수로 선언한다.
- Setter의 매개값이 음수이거나 백만원을 초과하면 현재 balance를 유지한다.
public class Account{
private int balance;
final static MIN_BALANCE = 0;
final static MAX_BALANCE = 1000000;
public void setBalance(int balance){
if(balance > MAX_BALANCE || balance < MIN_BALANCE) return;
else this.balance = balance;
}
public int getBalance(){
return this.balance;
}
}
책의 실행 결과를 보고 알맞게 BankApplication 클래스 메소드를 작성하시오
보류..
public class BankApplication{
//... 생략
//계좌 생성
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){
}
}