JAVA

자바 객체지향 12문제로 복습 — JAVA2 총정리

PANCO_IT
#자바#JAVA#객체지향#복습#문제

객체지향 3기둥(캡슐화·상속·다형성)을 정리한 이미지

JAVA2는 클래스·객체에서 시작해 캡슐화·상속·다형성으로 이어지는 여정이었습니다.

여기까지 오셨다면 자바 객체지향의 한 바퀴를 다 도신 것입니다. 이번 편은 새 개념 없이 JAVA2 시즌 전체를 점검합니다. 먼저 개념을 퀴즈로 확인하고, 그다음 직접 코드를 고쳐 실행하는 실습 문제를 풉니다.

한눈에 보는 JAVA2 시즌

핵심대표 함정
1. 클래스·객체설계도와 실물new 빼먹기
2. 메서드이름 붙여 재사용호출 시 괄호 ()
3. 생성자new 때 초기화반환타입 쓰면 메서드가 됨
4. 캡슐화private + getter/setterprivate 직접 접근
5. 배열값 여러 개, 인덱스범위 밖(0 ~ length−1)
6. static공용 멤버인스턴스 필드 직접 사용
7. 상속extends로 물려받기is-a 아닌데 상속
8. 다형성같은 호출, 다른 동작부모 타입으로 자식 메서드

JAVA2에서 자주 틀리는 5대 함정

그림 1. new·생성자·인덱스·static·자식 메서드 — 이 다섯만 조심하면 됩니다.

1단계 — 개념 빠른 점검

먼저 개념을 퀴즈로 확인합니다. 해설에 몇 편 내용인지 표시해 두었으니, 헷갈리는 부분은 그 편으로 돌아가 보세요. 정답은 눌러야 나옵니다.

미니 퀴즈

OX 4문제 + 4지선다 8문제

2단계 — 직접 풀어 보기

이제 눈으로 읽는 대신 직접 고쳐 실행해 봅니다. 각 문제의 편집기에서 코드를 바꿔 돌려 보고, 아래 '정답 보기'로 확인하세요. 편집기 헤더의 크게 보기를 누르면 넓게 볼 수 있습니다.

문제 1. 출력 예측하기 (배열·length)

돌리기 전에 결과를 예측해 보세요. 그다음 실행해 맞는지 확인합니다.

문제 1
public class Main {
  public static void main(String[] args) {
      int[] nums = {10, 20, 30};
      System.out.println(nums.length);
      System.out.println(nums[0]);
      System.out.println(nums[nums.length - 1]);
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

정답 보기

3 / 10 / 30 입니다. length는 칸의 개수(3), nums[0]은 첫 칸(인덱스 0), 마지막 칸은 length − 1인 인덱스 2입니다. 인덱스는 0부터 시작한다는 걸 기억하세요.

문제 2. 생성자 완성하기

지금은 컴파일 오류가 납니다. 생성자 안을 채워 이름과 나이가 담기게 하세요.

문제 2
class Dog {
  String name;
  int age;
  Dog(String name, int age) {
      // 여기 두 줄을 채우세요
  }
  void info() { System.out.println(name + " (" + age + "살)"); }
}

public class Main {
  public static void main(String[] args) {
      Dog d = new Dog("바둑이", 3);
      d.info();
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

정답 보기

this.name = name;this.age = age; 를 넣으면 됩니다. 매개변수와 필드 이름이 같을 때, this.name은 이 객체의 필드를 가리킵니다. 실행하면 바둑이 (3살)이 출력됩니다.

문제 3. 다형성 결과 예측하기

부모 타입 변수에 자식을 담았습니다. 출력을 예측해 보세요.

문제 3
class Animal {
  void sound() { System.out.println("동물이 소리를 냅니다."); }
}
class Cat extends Animal {
  @Override
  void sound() { System.out.println("야옹~"); }
}

public class Main {
  public static void main(String[] args) {
      Animal a = new Cat();
      a.sound();
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

정답 보기

야옹~ 입니다. a의 선언 타입은 Animal이지만, 실제로 담긴 객체가 Cat이라 Cat의 오버라이딩된 sound가 실행됩니다. 이것이 다형성입니다.

문제 4. static 카운터

static으로 공유되는 값이 어떻게 바뀌는지 예측해 보세요.

문제 4
class Car {
  static int count = 0;
  Car() { count++; }
}

public class Main {
  public static void main(String[] args) {
      new Car();
      new Car();
      System.out.println(Car.count);
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

정답 보기

2 입니다. countstatic이라 모든 Car하나를 공유합니다. 객체를 만들 때마다 생성자에서 1씩 늘어, 두 번 만들면 2가 됩니다. 객체 없이 Car.count로 접근하는 것도 확인하세요.

문제 5. 캡슐화로 잘못된 값 막기

setAge에 음수를 막는 한 줄을 넣어, −5를 넣어도 나이가 바뀌지 않게 하세요.

문제 5
class Person {
  private int age = 0;
  public int getAge() { return age; }
  public void setAge(int age) {
      // 음수면 무시하도록 한 줄 추가
      this.age = age;
  }
}

public class Main {
  public static void main(String[] args) {
      Person p = new Person();
      p.setAge(-5);
      System.out.println(p.getAge());
  }
}

📱 코드 실행(실습)은 태블릿·PC에서 이용할 수 있어요. 모바일에서는 위 코드를 눈으로 따라가며 확인하세요.

정답 보기

this.age = age; 앞에 if (age < 0) return; 를 넣으면 됩니다. 그러면 −5는 걸러져 나이가 그대로 0으로 유지됩니다. 이렇게 필드를 private으로 숨기고 setter에서 검증하는 것이 캡슐화의 핵심입니다.

이것만 기억하면 됩니다

JAVA2에서 자주 막히는 5대 함정을 다시 짚습니다.

  • new 누락: 객체는 new로 만들어야 씁니다(1편).
  • 생성자 반환타입: 생성자엔 반환타입을 쓰지 않습니다(3편).
  • 인덱스 범위: 인덱스는 0부터, 마지막은 length − 1(5편).
  • static ↔ 인스턴스: static 메서드에선 인스턴스 필드를 바로 못 씁니다(6편).
  • 자식 고유 메서드: 부모 타입 변수로는 자식만의 메서드를 못 부릅니다(8편).

12문제 중 9개 이상 맞고 실습 문제를 스스로 고쳤다면, 객체지향 기초는 충분히 다진 것입니다. 헷갈린 부분만 해당 편으로 돌아가 다시 보면 됩니다. 수고하셨습니다.


포켓코딩(JAVA2) 9편 · 예제 출처: 강사 개인 GitHub 저장소. 다음 시즌: JAVA3 — 예외 처리(try·catch)로 오류에 대비하기.

PANCO_IT

IT 지식을 정리하는 개발자

관련 글