Java 클래스·상속·인터페이스·접근제어자를 이해하고 오버로딩 vs 오버라이딩 차이와 다형성 코드 출력 추적을 완벽히 정리합니다.
☕ 클래스·객체·생성자의 핵심 개념
이 섹션에서는 Java의 기본 빌딩 블록인 클래스, 객체, 생성자의 관계를 살펴보겠습니다.
클래스(Class)는 객체를 만들기 위한 설계도이며, 객체(Object)는 클래스로 생성된 실제 인스턴스입니다. 클래스에는 필드(변수)와 메서드(함수)가 포함됩니다.
생성자(Constructor)는 객체 생성 시 자동으로 호출되는 특수한 메서드입니다. 반환 타입이 없고 클래스 이름과 동일합니다. 생성자를 정의하지 않으면 컴파일러가 기본 생성자(매개변수 없음)를 자동 생성하지만, 매개변수 있는 생성자를 정의하면 기본 생성자는 자동 생성되지 않습니다.
this 키워드는 현재 객체 자신을 참조합니다. 필드와 매개변수 이름이 같을 때 구분하기 위해 사용하고(this.name = name), 다른 생성자를 호출할 때도 사용합니다(this(매개변수)).
static은 클래스 레벨에서 공유되는 멤버를 만들 때 사용합니다. static 변수는 모든 객체가 공유하며, static 메서드는 객체 생성 없이 클래스이름.메서드()로 호출합니다. static 메서드 내에서는 this를 사용할 수 없습니다.
기출 함정: "생성자는 반환 타입이 void이다" → 틀림. 생성자는 반환 타입이 없습니다(void도 아님). "static 메서드에서 인스턴스 변수를 직접 사용할 수 있다" → 틀림. static 메서드는 인스턴스 없이 호출되므로 인스턴스 변수에 직접 접근 불가합니다.
🔗 상속과 메서드 오버라이딩
이 섹션에서는 Java 상속의 핵심인 extends, super, 메서드 오버라이딩 규칙을 살펴보겠습니다.
상속(Inheritance)은 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 것입니다. Java는 단일 상속만 지원하므로 하나의 클래스만 상속받을 수 있습니다. extends 키워드로 상속을 표현합니다.
super 키워드는 부모 클래스를 참조합니다. super()는 부모 생성자 호출(반드시 자식 생성자 첫 줄), super.메서드()는 부모 메서드 호출입니다.
메서드 오버라이딩(Overriding)은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것입니다. 오버라이딩 조건: 메서드 이름·매개변수·반환 타입이 모두 동일해야 합니다. 접근 제어자는 부모보다 좁아질 수 없습니다(범위 확장만 가능). 기출에서 @Override 어노테이션과 함께 나오는 코드 추적 문제가 자주 출제됩니다.
다형성(Polymorphism): 부모 타입 참조변수로 자식 객체를 참조할 수 있습니다. Animal a = new Dog(); — 실행 시 Dog의 오버라이딩된 메서드가 호출됩니다(동적 바인딩). 이것이 기출 코드 추적에서 가장 중요한 개념입니다.
🔧 인터페이스 vs 추상클래스
이 섹션에서는 Java에서 가장 혼동하기 쉬운 인터페이스와 추상클래스의 차이를 살펴보겠습니다.
| 구분 | 인터페이스(interface) | 추상 클래스(abstract class) |
|---|---|---|
| 키워드 | interface / implements | abstract class / extends |
| 다중 구현 | O (여러 인터페이스 구현 가능) | X (단일 상속만) |
| 메서드 | 추상 메서드(Java 8+ 디폴트/정적 가능) | 추상 메서드 + 일반 메서드 혼용 |
| 변수 | public static final 상수만 | 일반 변수(인스턴스 변수) 가능 |
| 생성자 | 없음 | 있음 (단, 직접 인스턴스화 불가) |
| 용도 | 규격(계약) 정의, 다중 타입 표현 | 공통 기능 제공 + 일부 추상화 |
암기법: "인터페이스=다중+상수+추상메서드만, 추상클래스=단일+변수+혼합메서드". 기출에서 "다중 상속이 가능한 것은?" → 인터페이스.
기출 함정: "추상 클래스는 객체를 생성할 수 있다" → 틀림. new 키워드로 직접 생성 불가. "인터페이스의 메서드는 반드시 추상 메서드여야 한다" → Java 8 이후에는 틀림. default 메서드와 static 메서드도 가능.
⚖️ 오버로딩 vs 오버라이딩 — 완전 비교
이 섹션에서는 이름이 비슷하지만 완전히 다른 오버로딩과 오버라이딩의 차이를 살펴보겠습니다.
| 구분 | 오버로딩(Overloading) | 오버라이딩(Overriding) |
|---|---|---|
| 개념 | 같은 이름, 다른 매개변수 | 부모 메서드를 자식이 재정의 |
| 바인딩 | 컴파일 타임(정적 바인딩) | 런타임(동적 바인딩) |
| 상속 관계 | 불필요 | 필수 |
| 반환 타입 | 달라도 됨 | 동일해야 함 |
| 매개변수 | 반드시 달라야 함 | 동일해야 함 |
접근 제어자 범위: public > protected > default(package-private) > private 순으로 접근 범위가 좁아집니다.
| 접근 제어자 | 같은 클래스 | 같은 패키지 | 자식 클래스 | 다른 패키지 |
|---|---|---|---|---|
| public | O | O | O | O |
| protected | O | O | O | X |
| default | O | O | X | X |
| private | O | X | X | X |
기출 코드 추적 패턴: 다형성 코드에서 Animal a = new Dog();로 선언하면, a.sound()를 호출할 때 Dog의 sound()가 호출됩니다(동적 바인딩). 단, Dog에만 있는 메서드는 타입 캐스팅 없이 호출 불가합니다. ((Dog)a).fetch() 식으로 명시적 캐스팅이 필요합니다.
암기법: "오버로딩은 Loading(적재)처럼 여러 버전 준비, 오버라이딩은 Riding(올라타기)처럼 부모를 덮음". 오버로딩은 컴파일 시점, 오버라이딩은 실행 시점에 결정됩니다.
📌 17강 핵심 요약과 18강 예고
이 섹션에서는 17강 핵심 내용을 압축 정리합니다.
생성자: 반환타입 없음, 이름=클래스명. 매개변수 생성자 정의 시 기본 생성자 자동생성 X. static: 클래스 공유, static 메서드에서 this 불가. 상속: extends(단일), super(부모참조). 오버라이딩: 이름·매개변수·반환타입 동일.
인터페이스: implements·다중구현·상수+추상메서드. 추상클래스: extends·단일·혼합메서드. 오버로딩=컴파일(매개변수 다름), 오버라이딩=런타임(동일시그니처). 접근제어자: public>protected>default>private.
다형성: 부모타입=자식객체 → 자식의 오버라이딩 메서드 호출(동적바인딩). 자식 전용 메서드는 캐스팅 필요.
다음 18강에서는 Java 심화 — 예외·컬렉션·스레드·람다 — Checked/Unchecked 예외, try-catch-finally, 컬렉션 프레임워크, 스레드 생명주기, 람다식 문법을 완벽히 정리합니다.
관련 주제
- 클래스와 객체
- 생성자와 this
- 상속 extends super
- 인터페이스 implements
- 오버로딩 오버라이딩 비교
- 접근 제어자
- 자격증
- 자격증 강의
- 정보처리기사 필기 25강 — 핵심이론·기출 완전정복
- 무료강의
- 무료 온라인 강의
- NUGUNA
- 누구나
📚 시리즈 전체 공유
정보처리기사 필기 25강 — 핵심이론·기출 완전정복
이 강의가 속한 시리즈는 총 17강, 모두 무료입니다. 처음부터 배우려는 동료에게 시리즈 전체를 알려 주세요.
댓글
불러오는 중...
