객체지향이란?
객체지향(Object-Oriented Programming, OOP)이란 프로그램을 객체의 집합으로 바라보고, 이 객체들이 서로 상호작용하며 동작하는 프로그래밍 패러다임입니다. 객체지향의 핵심 개념은 다음과 같습니다.
- 캡슐화(Encapsulation): 데이터와 메소드를 하나로 묶고, 데이터를 외부에서 직접 접근하지 못하도록 제한합니다.
- 상속(Inheritance): 기존 클래스의 속성과 동작을 새로운 클래스에서 재사용할 수 있도록 합니다.
- 다형성(Polymorphism): 같은 인터페이스를 공유하는 여러 개의 클래스가 서로 다른 동작을 수행할 수 있습니다.
- 추상화(Abstraction): 불필요한 세부 사항을 숨기고 중요한 부분만을 드러내어 객체를 설계하는 개념입니다.
객체지향 프로그래밍을 사용하면 코드의 재사용성과 유지보수성이 높아지고, 프로그램의 구조를 더 명확하게 만들 수 있습니다.
Chapter 1: 클래스(Class)와 객체(Object)
클래스(class)란?
클래스는 객체를 정의하는 청사진(템플릿)입니다. 객체의 상태(필드)와 동작(메소드)을 포함합니다.
class Car {
String model; // 자동차 모델명
int year; // 자동차 연식
}
객체(Object)란?
객체는 클래스를 기반으로 생성된 실체(instance)로, 클래스에서 정의한 속성과 동작을 가집니다.
Car myCar = new Car();
myCar.model = "Tesla";
myCar.year = 2023;
추상화
추상화란 객체의 본질적인 특징만을 추출하고 불필요한 세부사항은 제거하는 과정입니다.
abstract class Animal {
abstract void makeSound(); // 구체적인 동작은 하위 클래스에서 정의
}
Chapter 2: 캡슐화(encapsulation)
데이터와 메소드의 결합
캡슐화는 데이터(필드)와 메소드(행위)를 하나로 묶고, 데이터의 직접 접근을 제한하는 기법입니다.
class Person {
private String name; // 직접 접근 불가
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
접근 가시성 제어
- private: 클래스 내부에서만 접근 가능
- public: 어디서든 접근 가능
- protected: 같은 패키지 또는 하위 클래스에서 접근 가능
객체 데이터
객체의 데이터를 캡슐화하여 불필요한 변경을 방지하고 보안성을 향상시킵니다.
Person p = new Person();
p.setName("John");
System.out.println(p.getName()); // John
Chapter 3: Java와 객체지향
Hello, World Revisited
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
단순한 클래스 정의
class Dog {
String breed; // 견종
}
새 객체 인스턴스화
Dog myDog = new Dog();
this 키워드
this 키워드는 현재 객체를 참조하는 데 사용됩니다.
class Car {
String model;
Car(String model) {
this.model = model; // 인스턴스 변수와 지역 변수를 구분
}
}
포함된 클래스 생성 및 접근
class Outer {
class Inner {
void display() {
System.out.println("Inner class");
}
}
}
Outer.Inner obj = new Outer().new Inner();
obj.display();
Chapter 4: 객체지향 시스템 정의
상속(Inheritance)
상속은 기존 클래스의 속성과 메소드를 새 클래스가 재사용할 수 있도록 하는 기법입니다.
class Animal {
void eat() {
System.out.println("Eating...");
}
}
class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}
다형성(Polymorphism)
다형성은 같은 인터페이스를 공유하는 여러 개의 클래스가 서로 다른 동작을 할 수 있도록 하는 기법입니다.
class Animal {
void makeSound() {
System.out.println("Some sound...");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Bark");
}
}
Animal myDog = new Dog();
myDog.makeSound(); // Bark
추상 클래스(Abstract Class)
추상 클래스는 인스턴스를 생성할 수 없으며, 하위 클래스가 반드시 구현해야 할 추상 메소드를 가질 수 있습니다.
abstract class Shape {
abstract void draw();
}
인터페이스(Interface)
인터페이스는 클래스가 반드시 구현해야 할 메소드 목록을 정의하는 역할을 합니다.
interface Animal {
void makeSound();
}
class Dog implements Animal {
public void makeSound() {
System.out.println("Bark");
}
}
바인딩(Binding) 개념
바인딩(Binding)이란, 프로그램에서 호출된 메소드나 변수의 실제 메모리 위치를 연결하는 과정입니다.
- 이른 바인딩(Early Binding): 컴파일 타임에 메소드가 결정됨.
- 늦은 바인딩(Late Binding): 실행 시점에서 메소드가 결정됨 (동적 바인딩).
이른 바인딩(Early Binding)
이른 바인딩은 컴파일 시점에 메소드 호출이 결정되며, 일반적으로 정적 메소드나 private 메소드 호출 시 사용됩니다.
class Parent {
void show() {
System.out.println("Parent class");
}
}
Parent obj = new Parent();
obj.show(); // 컴파일 시점에 결정됨 (이른 바인딩)
늦은 바인딩(Late Binding)
늦은 바인딩은 실행 시점에서 메소드가 결정되며, 주로 다형성(Polymorphism)에서 사용됩니다.
class Parent {
void show() {
System.out.println("Parent class");
}
}
class Child extends Parent {
void show() {
System.out.println("Child class");
}
}
Parent obj = new Child();
obj.show(); // 실행 시점에 Child 클래스의 show() 호출 (늦은 바인딩)
늦은 바인딩을 활용하면 객체의 실제 타입에 따라 메소드가 동적으로 결정되므로 유연한 프로그램 설계가 가능합니다.
'개발 이론 > JAVA' 카테고리의 다른 글
| Collection (0) | 2025.02.02 |
|---|---|
| 상속 (0) | 2025.02.01 |
| 배열 (0) | 2025.02.01 |
| 메소드 (0) | 2025.01.31 |
| Statement와 Exception (0) | 2025.01.30 |