Java는 대표적인 객체지향 프로그래밍(Object-Oriented Programming, OOP) 언어입니다. OOP는 코드를 객체(object)로 구조화하여 현실 세계의 문제를 더 직관적이고 효율적으로 해결할 수 있도록 도와줍니다. 이번 글에서는 OOP의 기본 개념, Java에서의 구현, 그리고 실생활의 활용 예제를 살펴보겠습니다.
1. 객체지향 프로그래밍(OOP)란?
OOP는 데이터를 객체라는 단위로 나누고, 이 객체들이 서로 상호작용하며 프로그램을 구성하는 프로그래밍 패러다임입니다. 객체는 속성(Attributes)과 동작(Methods)으로 구성되며, 이러한 객체를 조합하여 복잡한 시스템을 구축할 수 있습니다.
OOP의 주요 특징
- 캡슐화(Encapsulation): 데이터와 메서드를 하나의 객체로 묶고, 외부에서의 직접 접근을 제한하여 데이터를 보호합니다.
- 상속(Inheritance): 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받아 재사용성을 높입니다.
- 다형성(Polymorphism): 같은 이름의 메서드가 다른 동작을 하도록 정의할 수 있습니다.
- 추상화(Abstraction): 복잡한 시스템을 단순화하여 필요한 부분만 보여줍니다.
2. Java에서의 OOP 구현
2.1 클래스와 객체
클래스(Class)는 객체를 생성하기 위한 청사진이며, 객체(Object)는 클래스에서 생성된 인스턴스입니다.
예제: 클래스와 객체
public class Car {
// 속성(Attributes)
String brand;
int speed;
// 동작(Methods)
public void drive() {
System.out.println(brand + "가 " + speed + "km/h로 달립니다.");
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성
Car myCar = new Car();
myCar.brand = "BMW";
myCar.speed = 120;
myCar.drive();
}
}
출력 결과:
BMW가 120km/h로 달립니다.
3. OOP의 주요 개념과 예제
3.1 캡슐화(Encapsulation)
캡슐화는 데이터 접근을 제한하여 외부로부터 객체의 속성을 보호합니다. private
키워드를 사용하여 속성을 은닉하고, getter
와 setter
메서드를 통해 접근합니다.
public class Person {
private String name; // 은닉된 속성
// Getter
public String getName() {
return name;
}
// Setter
public void setName(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("홍길동");
System.out.println("이름: " + person.getName());
}
}
출력 결과:
이름: 홍길동
3.2 상속(Inheritance)
상속은 기존 클래스의 속성과 메서드를 새로운 클래스가 물려받는 기능입니다.
class Animal {
public void eat() {
System.out.println("동물이 먹습니다.");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("개가 짖습니다.");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // 상속된 메서드
myDog.bark(); // Dog 클래스의 메서드
}
}
출력 결과:
동물이 먹습니다.
개가 짖습니다.
3.3 다형성(Polymorphism)
다형성은 하나의 메서드가 여러 클래스에서 서로 다르게 동작하도록 구현할 수 있습니다.
class Animal {
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("고양이가 야옹 합니다.");
}
}
class Dog extends Animal {
@Override
public void sound() {
System.out.println("개가 멍멍 합니다.");
}
}
public class Main {
public static void main(String[] args) {
Animal myCat = new Cat();
Animal myDog = new Dog();
myCat.sound(); // Cat의 sound() 호출
myDog.sound(); // Dog의 sound() 호출
}
}
출력 결과:
고양이가 야옹 합니다.
개가 멍멍 합니다.
3.4 추상화(Abstraction)
추상화는 복잡한 시스템의 일부만 노출하여 중요한 정보를 간결하게 표현합니다. 이를 위해 abstract
키워드를 사용해 추상 클래스를 정의합니다.
abstract class Shape {
abstract void draw(); // 추상 메서드
}
class Circle extends Shape {
@Override
void draw() {
System.out.println("원을 그립니다.");
}
}
class Rectangle extends Shape {
@Override
void draw() {
System.out.println("사각형을 그립니다.");
}
}
public class Main {
public static void main(String[] args) {
Shape circle = new Circle();
Shape rectangle = new Rectangle();
circle.draw();
rectangle.draw();
}
}
출력 결과:
원을 그립니다.
사각형을 그립니다.
4. OOP의 장점
- 코드 재사용: 상속을 통해 기존 코드를 재사용하여 개발 시간을 단축합니다.
- 유지보수 용이: 코드 구조가 명확하여 유지보수와 확장이 용이합니다.
- 캡슐화를 통한 보안: 데이터 은닉으로 외부 접근을 제한하여 데이터 보호가 가능합니다.
- 다형성: 다양한 객체를 동일한 인터페이스로 처리할 수 있습니다.
결론
Java의 객체지향 프로그래밍은 현실 세계의 문제를 코드로 효율적으로 모델링할 수 있는 강력한 도구입니다. OOP의 주요 개념인 클래스와 객체, 캡슐화, 상속, 다형성, 추상화를 이해하고 활용하면 더욱 구조적이고 유지보수 가능한 프로그램을 작성할 수 있습니다. 이번 글을 바탕으로 OOP 개념을 적용해 다양한 프로젝트를 만들어 보세요!
댓글 쓰기