객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체 단위로 나누어 설계하고 구현하는 방식입니다. Java를 비롯한 대부분의 현대 프로그래밍 언어는 객체지향 프로그래밍을 지원하며, 이를 통해 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다. 객체지향 프로그래밍의 핵심 개념에는 **캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)**이 포함됩니다.
1. 캡슐화(Encapsulation)
✅ 캡슐화란?
캡슐화는 객체의 데이터(속성)를 외부에서 직접 접근하지 못하도록 보호하는 개념입니다. 데이터를 보호하기 위해 **접근 제한자(access modifier)**를 사용하며, 일반적으로 private을 사용하여 직접 접근을 막고, getter와 setter 메서드를 통해 데이터를 관리합니다.
✅ 캡슐화 예제
class Person {
private String name; // 외부에서 직접 접근 불가
private int age;
// 생성자
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 메서드
public String getName() {
return name;
}
public int getAge() {
return age;
}
// Setter 메서드
public void setAge(int age) {
if (age > 0) {
this.age = age;
}
}
}
public class Main {
public static void main(String[] args) {
Person p = new Person("홍길동", 25);
System.out.println("이름: " + p.getName());
System.out.println("나이: " + p.getAge());
// 나이 변경
p.setAge(30);
System.out.println("변경된 나이: " + p.getAge());
}
}
출력 결과:
이름: 홍길동
나이: 25
변경된 나이: 30
🔹 private 접근 제한자를 사용하면 클래스 외부에서 직접 변수에 접근할 수 없습니다. 🔹 getter와 setter 메서드를 통해 데이터를 안전하게 수정 및 조회할 수 있습니다.
2. 상속(Inheritance)
✅ 상속이란?
상속은 기존 클래스(부모 클래스, Superclass)의 기능을 새로운 클래스(자식 클래스, Subclass)에 물려주는 기능입니다. 이를 통해 코드의 재사용성을 증가시키고, 새로운 기능을 추가할 수 있습니다.
✅ 상속 예제
// 부모 클래스
class Animal {
String name;
public void eat() {
System.out.println(name + "가 먹고 있습니다.");
}
}
// 자식 클래스
class Dog extends Animal {
public void bark() {
System.out.println(name + "가 짖습니다.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.name = "바둑이";
myDog.eat(); // 부모 클래스의 메서드 사용
myDog.bark(); // 자식 클래스의 메서드 사용
}
}
출력 결과:
바둑이가 먹고 있습니다.
바둑이가 짖습니다.
🔹 extends 키워드를 사용하여 클래스를 상속받을 수 있습니다. 🔹 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 사용할 수 있습니다. 🔹 필요하면 자식 클래스에서 부모 클래스의 기능을 확장할 수도 있습니다.
3. 다형성(Polymorphism)
✅ 다형성이란?
다형성은 같은 메서드를 다양한 방식으로 동작하게 만드는 기능입니다. 즉, 같은 이름의 메서드가 서로 다른 동작을 수행할 수 있습니다. 다형성은 크게 **메서드 오버라이딩(Overriding)**과 **메서드 오버로딩(Overloading)**으로 나뉩니다.
✅ 1) 메서드 오버라이딩 (Method Overriding)
- 부모 클래스의 메서드를 자식 클래스에서 다시 정의(재정의)하여 사용할 수 있습니다.
예제:
class Animal {
public void makeSound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 오버라이딩된 메서드 호출
}
}
출력 결과:
멍멍!
🔹 @Override 어노테이션을 사용하면 부모 클래스의 메서드를 재정의할 수 있습니다. 🔹 부모 타입(Animal)으로 선언해도, 실제 객체 타입(Dog)의 오버라이딩된 메서드가 실행됩니다.
✅ 2) 메서드 오버로딩 (Method Overloading)
- 같은 클래스 내에서 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 하여 정의하는 것
예제:
class MathOperations {
public int add(int a, int b) {
return a + b;
}
public double add(double a, double b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
MathOperations math = new MathOperations();
System.out.println("정수 덧셈: " + math.add(5, 10));
System.out.println("실수 덧셈: " + math.add(5.5, 10.5));
}
}
출력 결과:
정수 덧셈: 15
실수 덧셈: 16.0
🔹 같은 이름의 메서드이지만, 매개변수의 개수나 타입이 다르면 다른 메서드로 인식됩니다.
결론
Java의 객체지향 프로그래밍(OOP)에서는 캡슐화, 상속, 다형성을 활용하여 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다.
- 캡슐화: 데이터 보호 및 접근 제어
- 상속: 코드 재사용 및 확장
- 다형성: 같은 이름의 메서드를 다르게 구현 가능
이러한 개념을 잘 활용하면 유지보수성이 뛰어난 객체지향 프로그램을 만들 수 있습니다. 🚀
'IT > JAVA' 카테고리의 다른 글
| Java에서 인터페이스와 추상 클래스 비교(Interface, Abstract Class) (1) | 2025.02.24 |
|---|---|
| Java클래스와 객체의 차이 및 생성자 사용법(Class, Object, Constructor) (1) | 2025.02.23 |
| Java의 메서드와 매개변수 사용법 (2) | 2025.02.21 |
| Java 반복문 이해하기(for, while, do-while, break, continue ) (1) | 2025.02.20 |
| Java 조건문 이해하기(if, else, if-else, switch, break, continue) (0) | 2025.02.20 |