목차
자바에서 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 개념인 상속, 다형성, 인터페이스, 추상 클래스는 소프트웨어 개발에서 매우 중요한 역할을 합니다. 이 개념들은 코드의 재사용성, 유지보수성, 확장성을 높이는 데 도움을 주며, 복잡한 시스템을 효율적으로 설계하는 데 필수적인 도구들입니다. 이번 블로그에서는 이 네 가지 개념을 다루고, 각 개념이 어떻게 자바에서 활용되는지 예시와 함께 설명하겠습니다.
1. 상속 (Inheritance)
상속은 객체 지향 프로그래밍에서 기존 클래스의 속성(필드)과 동작(메서드)을 다른 클래스가 물려받는 기법입니다. 자바에서 상속은 extends 키워드를 사용하여 구현합니다. 상속을 통해 자식 클래스는 부모 클래스에서 정의한 속성과 메서드를 물려받고, 이를 재사용하거나 오버라이딩(Override)하여 기능을 확장할 수 있습니다.
1.1 상속의 기본 예시
// 부모 클래스 (Super class)
class Animal {
String name;
// 부모 클래스의 메서드
void speak() {
System.out.println("동물이 소리를 낸다.");
}
}
// 자식 클래스 (Sub class)
class Dog extends Animal {
// 자식 클래스만의 메서드
void bark() {
System.out.println("개가 짖는다.");
}
}
public class Main {
public static void main(String[] args) {
// 자식 클래스의 객체 생성
Dog dog = new Dog();
dog.name = "바둑이"; // 부모 클래스의 속성
dog.speak(); // 부모 클래스의 메서드
dog.bark(); // 자식 클래스의 메서드
}
}
위 코드에서 Dog 클래스는 Animal 클래스를 상속받고 있습니다. Dog 클래스는 부모 클래스의 name 속성과 speak() 메서드를 물려받고, 자기만의 bark() 메서드를 추가합니다.
2. 다형성 (Polymorphism)
다형성은 같은 이름의 메서드나 객체가 다양한 방식으로 동작하는 능력입니다. 자바에서 다형성은 크게 메서드 오버라이딩(Overriding)과 메서드 오버로딩(Overloading)으로 구현됩니다.
2.1 참조 변수의 다형성
자식 클래스의 객체를 부모 클래스 타입으로 참조할 수 있습니다. 이를 통해 부모 클래스의 메서드를 자식 클래스에서 오버라이딩하여 다르게 동작하도록 할 수 있습니다.
class Animal {
void speak() {
System.out.println("동물이 소리를 낸다.");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("개가 짖는다.");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 부모 클래스 타입으로 자식 클래스 객체 참조
animal.speak(); // 출력: 개가 짖는다.
}
}
위 예시에서 Animal 타입의 참조 변수 animal은 Dog 클래스의 객체를 참조하고 있습니다. 이 경우, 다형성 덕분에 자식 클래스의 오버라이딩된 메서드가 호출됩니다.
2.2 메서드 오버로딩
메서드 오버로딩은 같은 이름의 메서드를 매개변수를 다르게 하여 여러 번 정의하는 기술입니다. 메서드 이름은 같지만, 매개변수의 타입이나 개수에 따라 서로 다른 동작을 할 수 있습니다.
class Calculator {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(2, 3)); // 정수 덧셈
System.out.println(calc.add(2.5, 3.5)); // 실수 덧셈
}
}
3. 인터페이스 (Interface)
인터페이스는 추상 메서드만을 정의한 클래스와 유사한 구조로, 클래스가 구현해야 할 기능을 선언합니다. 자바에서 인터페이스는 interface 키워드를 사용하여 정의하며, 클래스는 이를 구현하여 기능을 구현해야 합니다. 인터페이스를 사용하면 다중 상속을 지원하고, 유연한 설계가 가능합니다.
3.1 인터페이스 정의
interface Animal {
void speak(); // 추상 메서드
}
class Dog implements Animal {
@Override
public void speak() {
System.out.println("개가 짖는다.");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.speak(); // 출력: 개가 짖는다.
}
}
위 예시에서 Animal 인터페이스는 speak()라는 추상 메서드를 정의하고, Dog 클래스는 이를 구현하여 speak() 메서드가 실행되도록 합니다.
3.2 인터페이스 사용
인터페이스를 사용하면 다양한 클래스를 동일한 방식으로 다룰 수 있습니다. 예를 들어, 여러 동물 클래스를 정의하고, 이들이 모두 Animal 인터페이스를 구현하면, 공통된 메서드 이름으로 다룰 수 있습니다.
4. 추상 클래스 (Abstract Class)
추상 클래스는 일부 메서드를 구현하고, 일부는 추상 메서드로 남겨둘 수 있는 클래스입니다. 추상 클래스는 abstract 키워드를 사용하여 정의하며, 인스턴스화 할 수 없습니다. 대신, 추상 클래스는 자식 클래스가 반드시 추상 메서드를 구현하도록 강제할 수 있습니다.
4.1 추상 클래스 정의
abstract class Animal {
abstract void speak(); // 추상 메서드
void sleep() { // 일반 메서드
System.out.println("동물이 잔다.");
}
}
class Dog extends Animal {
@Override
void speak() {
System.out.println("개가 짖는다.");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.speak(); // 출력: 개가 짖는다.
dog.sleep(); // 출력: 동물이 잔다.
}
}
4.2 추상 클래스 상속
추상 클래스는 일부 메서드를 구현하고, 자식 클래스가 나머지 메서드를 구현하도록 강제합니다. 추상 클래스는 완전히 구현되지 않지만, 일부 구현을 제공하여 자식 클래스에서 공통적인 동작을 공유할 수 있게 합니다.
5. 결론
자바에서 상속, 다형성, 인터페이스, 추상 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 코드의 유연성, 재사용성, 유지보수성을 높이는 데 중요한 역할을 합니다. 이들 개념을 잘 이해하고 활용하면, 더 효율적이고 확장 가능한 시스템을 구축할 수 있습니다.
- 상속은 부모 클래스의 기능을 자식 클래스가 물려받아 코드의 재사용을 극대화합니다.
- 다형성은 같은 이름의 메서드를 다양한 방식으로 동작하게 하여 유연성을 제공합니다.
- 인터페이스는 클래스 간의 공통된 기능을 정의하고, 다중 상속을 가능하게 합니다.
- 추상 클래스는 공통된 기능을 제공하면서, 자식 클래스가 구현해야 할 부분을 강제합니다.
실제 실습으로 예시!
Abstract 라는 프로젝트 안에
Main클래스,
entity 패키지
Child, Parent 클래스 가 있다.
Parent 클래스 안에는 name과 age 멤버변수가 있고,
print라는 함수를 만들건데,
내가 작성하지 않아도 이 클래스를 이용하는 사람들이 알아서 내용을 오버라이드 해서 사용할 수 있게
코드 구현은 하지않고 함수 이름만 정해줄거다.
// 협업해서 만들기 위해서 하는 일.
원래라면
print () {
System.out.println("안녕하세요")
}
위와같이 내용을 입력하고 다른 클래스에서 이 함수를 오버라이드해서 내용을 추가하거나 그대로 출력했을거다.
근데 내용은 다른 사람이 입력할거고 함수 이름만 정해줄거기 때문에 함수 이름만 입력해준다.

이렇게만 작성하면 끝나는 게 아니다.
추가로, print 함수에 abstract 키워드를 입력해준다.
그럼 아래와 같이 빨간줄이 뜬다.
클래스 이름에도 abstract 키워드를 입력해주면 오류가 사라진다.

▼

이제 Child 클래스를 만들건데 Parent 클래스를 상속받을거기 때문에
extends Parent를 입력해준다.
빨간줄이 뜨는 이유는 Parent에서 만든 print함수를 너가 까먹지 말고 꼭 만들어야된다고 알려주는것이다.

마우스 커서를 대면 위와 같이 내용이 나오는데, 메서드 구현 메세지를 누르면
구현할 메서드가 나온다

확인을 누르면 아래와 같이 알아서 입력이 된다.

이제 print 함수에 이름, 나이 직업을 출력할 코드를 입력해주고
메인 클래스에서 name, age, job 에 데이터를 넣어서 출력을 해보면 된다.

▼

▼

'JAVA > JAVA (IntelliJ)' 카테고리의 다른 글
| [JAVA] : try, catch - 에러가 발생했을 때 처리할 수 있는 방법 (0) | 2025.03.03 |
|---|---|
| [JAVA] : 생성자(Constructor) / Getter와 Setter (0) | 2025.02.27 |
| [JAVA] 객체 지향 프로그래밍 (OOP) - 클래스, 메서드, 메서드 오버로딩 📦💻 (0) | 2025.02.25 |