자바 기초 개념 완벽 정리: 클래스, 객체, 메서드부터 추상클래스, 인터페이스까지!
**자바(Java)**는 객체 지향 프로그래밍 언어로, 안정성과 확장성, 다양한 플랫폼에서의 호환성 덕분에 꾸준히 사랑받고 있습니다. 특히 초보자가 프로그래밍을 시작할 때 가장 먼저 접하는 언어 중 하나죠.
이번 포스팅에서는 자바의 기초 개념인 클래스와 객체, 인스턴스 개념부터 시작해서 추상클래스와 인터페이스, 패키지, 상속, 오버로딩과 오버라이딩까지 객체 지향 프로그래밍의 핵심 개념을 체계적으로 정리해드립니다. 자바 입문자뿐 아니라 개념을 다시 한번 정리하고 싶은 개발자에게도 유용한 글이 될 것입니다.
📌 목차
- 클래스와 객체란?
- 인스턴스, 필드, 생성자, 메서드 이해하기
- 추상클래스 vs 인터페이스
- 패키지와 상속 개념 정리
- 오버로딩과 오버라이딩 차이점 완전정복
1️⃣ 클래스(Class)와 객체(Object)란?
프로그래밍에서 가장 중요한 개념 중 하나가 바로 클래스와 객체입니다. 자바는 ‘객체 지향 프로그래밍 언어’이기 때문에, 모든 것이 클래스를 중심으로 돌아간다고 해도 과언이 아닙니다.
✔ 클래스(Class)
클래스는 ‘설계도’입니다. 자동차를 만들기 위해 자동차 설계도를 먼저 그리듯, 객체를 만들기 위해서는 먼저 클래스라는 틀을 만들어야 합니다.
public class MyClass {
private int name;
public MyClass(int name) {
this.name = name;
}
public void display() {
System.out.println("Name: " + name);
}
}
여기서 MyClass는 객체를 찍어내기 위한 틀입니다. 내부에는 속성(name)과 행동(display() 메서드)이 정의되어 있죠.
✔ 객체(Object)
클래스로부터 실제 메모리 상에 만들어진 실체가 객체입니다. 실제로 프로그램이 돌아갈 때 메모리를 차지하며 동작하는 존재죠.
MyClass obj = new MyClass(123);
obj.display(); // Name: 123
위 코드를 통해 클래스 MyClass로부터 객체 obj를 생성했습니다.
2️⃣ 인스턴스, 필드, 생성자, 메서드 완전정복
✔ 인스턴스(Instance)
클래스로부터 만들어진 객체를 ‘인스턴스’라고 부릅니다. ‘객체’와 ‘인스턴스’는 거의 같은 의미지만, 객체는 포괄적 개념, 인스턴스는 구체적 메모리에 존재하는 실체라는 점에서 차이가 있습니다.
✔ 필드(Field)
클래스 내부에서 선언되는 변수로, 객체의 상태나 속성을 저장합니다.
private int name; // 필드
객체마다 이 값을 다르게 가질 수 있습니다.
✔ 생성자(Constructor)
객체를 초기화할 때 사용하는 특별한 메서드입니다. 클래스와 이름이 같고 반환형이 없습니다.
public MyClass(int name) {
this.name = name;
}
생성자는 객체가 생성될 때 자동으로 호출되며, 객체의 초기값을 설정하는 데 사용됩니다.
✔ 메서드(Method)
객체가 수행할 수 있는 기능 또는 동작입니다.
public void display() {
System.out.println("Name: " + name);
}
메서드는 객체의 행동을 정의하고, 클래스의 외부에서 호출하여 사용합니다.
3️⃣ 추상클래스와 인터페이스의 차이점
자바에서는 코드의 재사용성과 유연성을 높이기 위해 추상클래스와 인터페이스를 사용합니다. 이 둘은 매우 유사하지만 분명한 차이점이 있습니다.
✔ 추상클래스(Abstract Class)
추상클래스는 공통적인 속성과 기능을 가진 클래스들의 공통 요소를 정의하는 클래스입니다. abstract 키워드로 선언하며, 객체를 직접 생성할 수는 없습니다.
public abstract class Animal {
String name;
public abstract void sound(); // 추상 메서드
public void eat() {
System.out.println("먹는다.");
}
}
추상클래스는 일반 메서드도 포함할 수 있으며, 상속을 통해 구체적인 기능을 구현하도록 유도합니다.
✔ 인터페이스(Interface)
인터페이스는 클래스가 구현해야 할 메서드의 청사진만을 제공합니다. 다중 상속이 불가능한 자바에서, 인터페이스를 통해 유연하게 기능을 확장할 수 있습니다.
public interface Animal {
void sound(); // 구현 없이 선언만
}
인터페이스는 기본적으로 모든 메서드가 추상 메서드이며 public입니다. 자바 8 이후부터는 default 메서드도 사용할 수 있게 되었죠.
구분 추상 클래스 인터페이스
다중 상속 | 불가능 | 가능 |
메서드 구현 여부 | 일부 구현 가능 | 기본적으로 전부 미구현 |
생성자 | 있음 | 없음 |
용도 | 상속을 통한 기능 확장 | 역할만 정의, 다형성 보장 |
4️⃣ 패키지와 상속
✔ 패키지(Package)
패키지는 관련된 클래스들을 묶어서 논리적인 단위로 관리할 수 있게 해줍니다. 대규모 프로젝트에서 특히 중요하며, 클래스를 정리하고 충돌을 방지할 수 있습니다.
package com.example.myapp;
실제 디렉토리 구조와 연결되며, import 키워드로 다른 패키지의 클래스를 사용할 수 있습니다.
✔ 상속(Inheritance)
상속은 기존 클래스를 재사용하여 새로운 클래스를 정의하는 방법입니다. extends 키워드를 사용하며, 코드의 재사용성과 유지보수성을 높이는 데 매우 유리합니다.
class Animal {
void sound() {
System.out.println("소리를 낸다.");
}
}
class Dog extends Animal {
void bark() {
System.out.println("멍멍!");
}
}
이렇게 하면 Dog 클래스는 Animal 클래스의 sound() 메서드도 사용할 수 있습니다.
5️⃣ 오버로딩과 오버라이딩
이 두 개념은 메서드를 어떻게 재정의하거나 다양하게 사용할 수 있는지를 보여줍니다.
✔ 오버로딩(Overloading)
같은 이름의 메서드를 매개변수의 타입이나 개수에 따라 여러 개 정의하는 것입니다. 컴파일 타임에 결정됩니다.
public void print(String s) {}
public void print(int i) {}
public void print(String s, int i) {}
모두 print라는 이름이지만, 호출 시 전달하는 인자의 종류나 개수에 따라 호출되는 메서드가 달라집니다.
✔ 오버라이딩(Overriding)
부모 클래스의 메서드를 자식 클래스에서 재정의하는 것입니다. 실행 시간에 결정되며, 다형성(Polymorphism) 을 가능하게 합니다.
class Animal {
void sound() {
System.out.println("소리를 낸다.");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹!");
}
}
자식 클래스 Cat은 sound() 메서드를 새롭게 정의하여, 부모 클래스와는 다른 동작을 하도록 했습니다.
✅ 마무리하며
이번 글에서는 자바의 기초 개념 중에서도 가장 중요한 클래스, 객체, 메서드, 그리고 추상 클래스와 인터페이스, 상속과 오버라이딩 개념까지 객체 지향 프로그래밍을 구성하는 핵심 요소들을 정리했습니다.
초보 개발자라면 이 개념들을 정확히 이해하고 있어야 향후 프레임워크(Spring), 디자인 패턴, API 활용 등을 할 때 훨씬 수월하게 나아갈 수 있습니다.
🔍 추천 학습 방향
- 자바 공식 문서: https://docs.oracle.com/javase/8/docs/
- 이클립스 또는 IntelliJ를 활용한 실습
- 온라인 자바 문제 풀이 플랫폼 이용 (백준, 프로그래머스 등)