
JAVA2는 클래스·객체에서 시작해 캡슐화·상속·다형성으로 이어지는 여정이었습니다.
여기까지 오셨다면 자바 객체지향의 한 바퀴를 다 도신 것입니다. 이번 편은 새 개념 없이 JAVA2 시즌 전체를 점검합니다. 먼저 개념을 퀴즈로 확인하고, 그다음 직접 코드를 고쳐 실행하는 실습 문제를 풉니다.
한눈에 보는 JAVA2 시즌
| 편 | 핵심 | 대표 함정 |
|---|---|---|
| 1. 클래스·객체 | 설계도와 실물 | new 빼먹기 |
| 2. 메서드 | 이름 붙여 재사용 | 호출 시 괄호 () |
| 3. 생성자 | new 때 초기화 | 반환타입 쓰면 메서드가 됨 |
| 4. 캡슐화 | private + getter/setter | private 직접 접근 |
| 5. 배열 | 값 여러 개, 인덱스 | 범위 밖(0 ~ length−1) |
| 6. static | 공용 멤버 | 인스턴스 필드 직접 사용 |
| 7. 상속 | extends로 물려받기 | is-a 아닌데 상속 |
| 8. 다형성 | 같은 호출, 다른 동작 | 부모 타입으로 자식 메서드 |

그림 1. new·생성자·인덱스·static·자식 메서드 — 이 다섯만 조심하면 됩니다.
1단계 — 개념 빠른 점검
먼저 개념을 퀴즈로 확인합니다. 해설에 몇 편 내용인지 표시해 두었으니, 헷갈리는 부분은 그 편으로 돌아가 보세요. 정답은 눌러야 나옵니다.
미니 퀴즈
2단계 — 직접 풀어 보기
이제 눈으로 읽는 대신 직접 고쳐 실행해 봅니다. 각 문제의 편집기에서 코드를 바꿔 돌려 보고, 아래 '정답 보기'로 확인하세요. 편집기 헤더의 크게 보기를 누르면 넓게 볼 수 있습니다.
문제 1. 출력 예측하기 (배열·length)
돌리기 전에 결과를 예측해 보세요. 그다음 실행해 맞는지 확인합니다.
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. 생성자 완성하기
지금은 컴파일 오류가 납니다. 생성자 안을 채워 이름과 나이가 담기게 하세요.
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. 다형성 결과 예측하기
부모 타입 변수에 자식을 담았습니다. 출력을 예측해 보세요.
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으로 공유되는 값이 어떻게 바뀌는지 예측해 보세요.
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 입니다. count는 static이라 모든 Car가 하나를 공유합니다. 객체를 만들 때마다 생성자에서 1씩 늘어, 두 번 만들면 2가 됩니다. 객체 없이 Car.count로 접근하는 것도 확인하세요.
문제 5. 캡슐화로 잘못된 값 막기
setAge에 음수를 막는 한 줄을 넣어, −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)로 오류에 대비하기.