🧾 Java 객체지향 예제 총정리 (실전 기반 정리)
생성자 → 상속 → 오버라이딩 → 변수 숨김 → 실전 시스템 구현까지!
개념부터 예제, 자주 나오는 오류까지 한 번에 정리해 보았습니다.
🔹 1. 생성자 (Constructor) 이해하기
✅ 핵심 개념
- 생성자는 객체 생성 시 자동 호출되는 특수한 메서드
- 클래스명과 동일한 이름, 반환 타입 없음
- 기본 생성자는 사용자 정의 생성자가 없을 경우 자동 생성
- this()를 사용해 다른 생성자 호출 가능 (단, 반드시 첫 줄에 위치해야 함)
🔍 주요 코드 포인트
Car(String color) {
this(color, "auto", 4); // 다른 생성자 호출
door = 6; // this() 다음 줄부터 가능
}
⚠️ 자주 발생하는 오류
| 위치 |
내용 |
| Car(String color) |
this()가 첫 줄이 아니면 컴파일 오류 발생 |
🔹 2. 상속 기본 구조
✅ 핵심 개념
- extends 키워드로 부모 클래스 상속
- 자식 클래스는 부모의 필드/메서드 상속 및 확장 가능
- 단방향 상속만 가능 (부모 → 자식)
🔍 예시 흐름
class Animal {
String name;
}
class Dog extends Animal {
void bark() { ... }
}
⚠️ 주의할 점
Tv tv1 = new Tv();
tv1.ott = true; // ❌ 자식 필드는 부모 객체에서 접근 불가
🔹 3. 상속 시 생성자 호출 순서
✅ 핵심 개념
- 자식 객체 생성 시 부모 생성자 먼저 호출됨
- super()로 부모 생성자를 명시적으로 호출 가능
- this()는 같은 클래스 내 다른 생성자 호출용
🔍 실행 흐름 예시
Cat cat1 = new Cat();
// 출력:
// 빈 부모 생성자 - 인스턴스 생성
// 빈 자식 생성자 - 인스턴스 생성
🔹 4. 메서드 오버라이딩
✅ 핵심 개념
- 상속 구조에서 부모 메서드를 자식이 재정의(Override) 가능
- 메서드 시그니처가 동일해야 오버라이딩 성립
- @Override 어노테이션을 사용하면 컴파일러가 검증해줌
🆚 오버로딩 vs 오버라이딩 비교
| 항목 |
오버로딩(Overloading) |
오버라이딩(Overriding) |
| 적용 위치 |
같은 클래스 |
상속 관계 |
| 조건 |
이름 같고 매개변수 다름 |
이름, 매개변수, 리턴 타입 동일 |
| 키워드 |
없음 |
@Override 사용 권장 |
🔹 5. 변수 숨김 (Hiding)과 필드 독립성 – E_Practice.java
✅ 핵심 개념
- 자식 클래스에서 부모와 같은 이름의 필드를 선언하면 "숨김(hiding)" 발생
- 필드는 오버라이딩 불가, 단순히 숨겨짐
- 부모의 필드는 super.필드명으로 접근 가능
🔍 코드 흐름
System.out.println("이름: " + name); // 자식 필드
System.out.println("나이: " + super.age); // 부모 필드
🧠 자주 나오는 오류 총정리
| 유형 |
코드위치 |
설명 |
| this() 위치 오류 |
생성자 내 두 번째 줄 이후에 위치 |
생성자 첫 줄에서만 호출 가능 |
| 필드 접근 오류 |
tv1.ott = true; |
부모 객체에서 자식 필드 접근 불가 |
| 파일명 불일치 |
public class Abc {} |
파일명과 클래스명이 다르면 컴파일 오류 |
🎓 자바 OOP로 구현한 학생 관리 시스템 예제
📌 핵심 기능 요약
| 항목 |
설명 |
| 목적 |
학생 정보를 등록, 조회, 수정할 수 있는 간단한 콘솔 기반 프로그램 |
| 주요 클래스 |
Student, StudentManagementApp |
| 기능 |
학생 등록, 전체 조회, ID로 검색, GPA 업데이트 |
| 사용 개념 |
클래스, 생성자 오버로딩, ArrayList, static 메서드, 객체 배열 |
🧱 코드 구조 및 동작 설명
1. Student 클래스
- 학생의 정보를 담는 도메인 클래스
- 필드: studentId, name, age, major, gpa
- 메서드:
- printStudentInfo() : 정보 출력
- updateGpa(double) : GPA 변경
- 생성자 오버로딩을 통해 기본 생성자 + 매개변수 생성자 2종 제공
2. StudentManagementApp 클래스
- 실행용 메인 클래스 (public class)
- students: ArrayList<Student> 타입의 정적 리스트
- 주요 메서드 (전부 static → 인스턴스화 없이 바로 사용 가능):
- addStudent(...)
- printAllStudents()
- findStudentById(...)
- updateStudentGpa(...)
- main 메서드 내에서 학생 등록 → 전체 조회 → 단건 조회 → GPA 업데이트 흐름 실행
🔍 주요 코드 분석
✅ 학생 등록 메서드
static void addStudent(int id, String name, int age, String major, double gpa) {
Student student = new Student(id, name, age, major, gpa);
students.add(student);
System.out.println(name + " 학생이 등록되었습니다.");
}
- new Student(...)로 객체 생성 후 리스트에 추가
- 객체 배열 대신 ArrayList 사용 → 크기 동적 확장 가능
✅ 단일 조회 (ID 기반)
static void findStudentById(int studentId) {
for (Student student : students) {
if (student.studentId == studentId) {
student.printStudentInfo();
return;
}
}
System.out.println(studentId + " 해당 ID의 학생을 찾을 수 없습니다.");
}
- 조건 충족 시 즉시 return → 효율적인 검색
- 못 찾으면 안내 메시지 출력
⚠️ 오류 발생 가능 포인트 및 주의사항
| 위치 |
설명 |
원인 |
해결 방법 |
| public class StudentManagementApp 외 다른 클래스에 public 키워드 |
❌ 오류 발생: 클래스명.java와 public 클래스명이 다를 경우 |
Java는 파일명과 public 클래스명이 반드시 동일해야 함 |
Student는 public 클래스일 수 없음 |
| updateStudentGpa(2, 4.1) |
✅ 현재는 문제 없음 |
하지만 GPA가 4.5 초과일 경우 유효성 체크 없음 |
if(newGpa <= 4.5) 등의 검증 추가 가능 |
| students가 static이 아니었다면? |
❌ main에서 접근 불가 |
static context에서 non-static 필드 접근 불가 오류 발생 |
students 필드는 static이어야 함 |