콘텐츠로 이동

1단원 쪽지시험 정답: Java OOP — 클래스와 객체


문제 1. 객체는 같은가?

① 5
② Java
③ true
④ false

해설

항목 결과 이유
obj1.x 5 클래스에서 int x = 5로 초기화됨
obj2.name Java 클래스에서 String name = "Java"로 초기화됨
obj1.x == obj2.x true 두 객체 모두 x = 5, 비교
obj1 == obj2 false ==는 객체 참조(주소) 비교 — new로 각각 생성한 별개의 객체

③과 ④가 핵심 함정입니다. 값이 같아도 new로 만든 객체는 서로 다른 인스턴스이므로 ==false입니다.


문제 2. 속성은 독립적이다

① 100
② 85
③ false
④ 85

해설

s1 = new Main()  →  s1.score = 100
s2 = new Main()  →  s2.score = 100
s2.score = 85    →  s2.score = 85   (s1.score는 여전히 100)
항목 결과 이유
100 s2를 바꿔도 s1은 영향 없음 — 각 객체의 속성은 독립적
85 s2.score를 직접 수정함
false 100 ≠ 85
85 s1.score = s2.scores2의 값을 s1에 복사

s2.score = 85s2 객체의 속성만 바꿉니다. s1은 전혀 영향을 받지 않습니다.


문제 3. static vs 인스턴스 메서드

① Car class ready!
② Brand: Hyundai
③ Max speed: 180 km/h

해설

항목 호출 방식 결과 이유
announce() Car class ready! static 메서드 — 객체 없이 바로 호출 가능
myCar.showBrand() Brand: Hyundai 인스턴스 메서드 — new로 객체 생성 후 .으로 호출
myCar.speed(180) Max speed: 180 km/h 매개변수 180maxSpeed에 전달됨

static 메서드는 클래스 이름으로 호출하거나 직접 호출할 수 있고, 인스턴스 메서드는 반드시 객체가 있어야 합니다.


문제 4. 생성자(Constructor)

① Alice is 20 years old.
② Bob is 17 years old.
③ true

해설

Main p1 = new Main("Alice", 20);  // 생성자 호출: name="Alice", age=20
Main p2 = new Main("Bob",   17);  // 생성자 호출: name="Bob",   age=17
항목 결과 이유
Alice is 20 years old. 생성자에서 초기화된 값 그대로 출력
Bob is 17 years old. 생성자에서 초기화된 값 그대로 출력
true 20 > 17

생성자는 이름이 클래스 이름과 동일해야 하고, 반환 타입을 쓰지 않습니다.


문제 5. 다중 속성과 final

① Name: John Doe
② Age: 24
③ Age: 30
④ true

해설

항목 결과 이유
p.fname + " " + p.lname Name: John Doe 두 속성을 문자열 연결
p.age Age: 24 초기값 24
p.age = 30 후 출력 Age: 30 일반 속성은 수정 가능
p.age < p.MAX_AGE true 30 < 100

final 속성(MAX_AGE)은 선언 후 값을 변경하면 컴파일 에러가 발생합니다. 반면 일반 속성(age)은 자유롭게 수정할 수 있습니다.


문제 6. 캡슐화 — getter / setter

① Alice
② 25
③ 30
④ true

해설

private String name = "Alice";  // 외부에서 직접 접근 불가
private int age = 25;           // 외부에서 직접 접근 불가
항목 결과 이유
p.getName() Alice getter가 name을 반환
p.getAge() 25 getter가 age를 반환
p.setAge(30)p.getAge() 30 setter로 수정 후 getter로 확인
p.getAge() > 25 true 30 > 25

private 속성은 클래스 외부에서 p.name 처럼 직접 접근하면 컴파일 에러입니다. 반드시 getter/setter를 통해 접근해야 합니다.


문제 7. 상속(Inheritance)

① Tuut, tuut!
② Ford Mustang
③ Ford

해설

class Car extends Vehicle { ... }
// Car는 Vehicle의 모든 속성과 메서드를 물려받음
항목 결과 이유
myCar.honk() Tuut, tuut! Car에 없는 메서드 → 부모 Vehiclehonk() 호출
myCar.brand + " " + myCar.model Ford Mustang brand는 부모에서, model은 자식에서
myCar.brand Ford 부모의 protected 속성에 자식이 직접 접근 가능

extends 키워드로 부모 클래스의 속성과 메서드를 그대로 사용할 수 있습니다.


문제 8. 다형성(Polymorphism) — 메서드 오버라이딩

① ...
② Meow
③ Woof

해설

Animal a = new Animal();  // Animal 객체
Animal c = new Cat();     // 변수 타입은 Animal, 실제 객체는 Cat
Animal d = new Dog();     // 변수 타입은 Animal, 실제 객체는 Dog
항목 호출 결과 이유
a.sound() ... Animalsound() 실행
c.sound() Meow 실제 객체가 CatCat의 오버라이딩 메서드 실행
d.sound() Woof 실제 객체가 DogDog의 오버라이딩 메서드 실행

핵심 함정: Animal c = new Cat()에서 변수 타입이 Animal이어도, 실제로 담긴 객체가 Cat이므로 Catsound()가 호출됩니다. 이것이 다형성(Polymorphism) 입니다.


문제 9. 은행 계좌

class BankAccount {
    private int balance = 0;

    public int getBalance() {
        return balance;
    }

    public void deposit(int amount) {
        if (amount > 0) {
            balance += amount;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        BankAccount acc = new BankAccount();
        acc.deposit( 500 );
        System.out.println( acc.getBalance() );
        acc.deposit( 300 );
        System.out.println( acc.getBalance() );
    }
}

빈칸 정답

빈칸 위치 정답 이유
______ int balance private 외부 직접 접근 차단 — 캡슐화의 핵심
return ______ balance getter가 반환할 값
balance ______ amount += 잔액에 입금액을 더함
acc.______( 500 ) deposit 입금 메서드 호출
acc.______() getBalance 잔액 조회 getter 호출

문제 10. 도형 클래스

class Shape {
    String color;

    public Shape(String c) {
        color = c;
    }

    public void draw() {
        System.out.println(color + " shape");
    }
}

class Circle extends Shape {
    int radius;

    public Circle(String c, int r) {
        super(c);
        radius = r;
    }

    public void draw() {
        System.out.println(color + " circle, r=" + radius);
    }
}

public class Main {
    public static void main(String[] args) {
        Shape s = new Shape("Red");
        Shape c = new Circle("Blue", 5);
        s.draw();
        c.draw();
    }
}

빈칸 정답

빈칸 위치 정답 이유
System.out.println(______ + " shape") color 부모 속성 color 출력
class Circle ______ Shape extends CircleShape를 상속
______ = r radius 매개변수 r을 속성 radius에 대입
" circle, r=" + ______ radius 반지름 속성 출력
new ______("Blue", 5) Circle Circle 생성자 호출
c.______() draw 오버라이딩된 draw() 호출

핵심 포인트

  • super(c) : 부모 생성자 Shape(String c)를 호출하여 color를 초기화
  • Shape c = new Circle(...) : 변수 타입은 Shape지만 실제 객체는 Circle다형성
  • c.draw() : Circledraw()를 오버라이딩했으므로 Circledraw() 실행