1. 객체 지향 프로그래밍이란?
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다.
객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위,
즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 위키 백과
요약하자면 현실 세계의 개념을 모델링하고, 이를 객체들의 상호작용으로 프로그램을 구성하는 것이다.
즉, 프로그래밍에서 필요한 데이터를 객체로 만들고 그 객체들의 상호 작용을 통해 프로그램을 구성한다.
2. OOP의 장점과 단점
장점 :
1. 재사용성: 객체 지향 프로그래밍은 클래스 단위로 코드를 구성하여 상속을 통해 코드의 재사용성이 증가한다.
2. 코드의 유연성과 확장성: 상속과 다형성을 통해 코드의 유연성과 확장성이 높아진다. 새로운 기능을 추가하거나 기존 기능을 수정하기 위해 기존 클래스를 변경할 필요 없이, 클래스를 확장하거나 메서드를 오버라이딩하여 대응할 수 있다.
3. 유지보수 : 캡슐화와 추상화를 통해 코드의 가독성이 향상되며, 코드의 일부를 수정해야 할 때 해당 부분만 수정하여
유지보수가 용이하다.
단점 :
1. 성능: 일부 경우에 절차 지향 프로그래밍보다 처리 속도가 느릴 수 있다.
2. 설계의 어려움: 잘못된 객체 모델링이나 클래스 설계로 인해 복잡성이 증가할 수 있습니다. 객체 간의 관계, 상속 구조, 적절한 캡슐화 등 많은 부분을 고려하여 설계해야 하며, 잘못된 설계 시 유지보수 및 관리가 어려울 수 있다.
3. OOP의 4가지 특성
1. 캡슐화(Encapsulation): 캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나의 단위로 묶는 것을 의미함. 클래스는 데이터와 그 데이터에 접근하는 메서드를 함께 캡슐화하여 외부로부터 데이터를 보호하고, 데이터에 접근하기 위한 일관된 인터페이스를 제공한다.
public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void sayHello() { System.out.println("Hello, my name is " + name); } } |
위 와 같이 Person 이라는 클래스를 생성 하고 변수들을 private 접근 제어자로를 직접 접근하지 못하게 함.
그래서 person.age 등으로 호출이 불가능하며 getAge() 메서드를 통해 변수에 접근이 가능함.
2. 상속(Inheritance): 상속은 클래스로부터 속성과 메소드를 물려주는 것을 의미한다. 상속을 통해 부모 클래스의 속성과 동작을 자식 클래스에서 재사용할 수 있으며, 새로운 기능을 추가하거나 기존 기능을 수정할 수 있다.
public class Animal { public void eat() { System.out.println("The animal is eating."); } } public class Dog extends Animal { public void bark() { System.out.println("The dog is barking."); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); // 상속된 eat() 메서드 호출 dog.bark(); // Dog 클래스의 bark() 메서드 호출 } } |
Dog 클래스는 Animal 클래스를 상속받았기 때문에 eat() 메서드를 사용할 수 있다.
3. 다형성(Polymorphism): 다형성은 같은 자료형에 여러가지 객체를 대입하여 여러 가지 형태로 동작할 수 있는 능력을 의미한다. 또한 자바에서 다형성은 상속과 관련되며, 부모 클래스로부터 파생된 여러 클래스들이 동일한 메서드를 가지면서도 각자 다른 동작을 할 수 있도록 합니다. 즉, 자바에서의 대표적인 다형성이 오버 라이딩과 오버 로딩이다.
class Animal { public void makeSound() { System.out.println("Animal is making a sound."); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog is barking."); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat is meowing."); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.makeSound(); // Dog is barking. animal2.makeSound(); // Cat is meowing. } } 출력 : Dog is barking. Cat is meowing. |
위 코드에서 Dog 클래스와 Cat 클래스는 Animal 클래스를 상속받으며, 각각 makeSound() 메서드를 오버라이딩하여 재정의한다.
Main 클래스에서 Animal 타입의 변수 animal1과 animal2를 선언하고, 각각 Dog 클래스와 Cat 클래스의 인스턴스를 생성할 때, 다형성의 특성으로 인해 Animal 타입의 변수에는 Dog 클래스와 Cat 클래스의 인스턴스가 대입될 수 있다.
animal1.makeSound()와 animal2.makeSound()를 호출하면, 각각 Dog 클래스와 Cat 클래스에서 오버라이딩한 makeSound() 메서드가 실행된다. 즉, 다형성으로 인해 Animal 타입의 변수에 대입된 실제 객체의 타입에 따라 동적으로 메서드가 호출되는 것을 보여주고 있다.
4. 추상화(Abstraction): 추상화는 복잡한 시스템을 단순화하여 필요한 요소들만을 추출하는 과정을 의미한다.
추상화를 통해 현실 세계의 개념을 클래스로 표현할 수 있다.
abstract class Animal { public abstract void makeSound(); } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog is barking."); } } class Cat extends Animal { @Override public void makeSound() { System.out.println("Cat is meowing."); } } public class Main { public static void main(String[] args) { Animal animal1 = new Dog(); Animal animal2 = new Cat(); animal1.makeSound(); // Dog is barking. animal2.makeSound(); // Cat is meowing. } } |
위의 예시 코드에서 Animal 클래스는 추상 클래스로 선언되어있다. 추상 클래스는 하나 이상의 추상 메서드를 포함하며, 추상 메서드는 구현부가 없이 선언만 되어 있다. 또한 추상 메서드는 자식 클래스에서 반드시 구현해야 한다.
'자바' 카테고리의 다른 글
자바 중첩 클래스 ( Nested Class ) (0) | 2023.07.18 |
---|---|
자바 final (0) | 2023.07.16 |
자바 접근 제어자 (0) | 2023.07.15 |
자바 오버로딩과 오버라이딩 (0) | 2023.07.14 |
자바 Object 클래스와 다형성 (0) | 2023.07.14 |