이숭간 공부기록
[Java] OOP 객체지향 프로그래밍 본문
728x90
Object Oriented Programming
객체지향 프로그래밍이란,, 너무나도 크고 추상적인 개념이고 또한 매우 중요하다
사실 자바에대한 공부를 하는것도 객체지향적 프로그래밍을 하기 위한것이라고 생각한다.
객체지향 프로그래밍이란 간단하게 말해 현실세계를 컴퓨터로 옮겨서 프로그래밍하는것이라고 생각한다.
현실의 사물을 하나의 객체로보고 공통된 성질을 가지는 객체들을 나타낼수있는 특징을 추상화시켜 하나의 클래스로 만든다.
OOP의 4가지 특징
- 추상화(Abstraction)
- 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것
- 추상화를 이용하면 공통된 특성을 뽑아 하나의 클래스를 정의할 수 있다. 즉 객체지향적 관점에서 클래스를 정의하는것을 추상화라고 할 수 있다.
- 캡슐화(Encapsulation)
- 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한(private키워드)하는 것
- 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
- 낮은결합도란 : 한 클래스의 변경이 발생했을때 영향을 미치는 클래스가 적은것
- 데이터를 보이지 않고, 외부와 상호작용을 할때는 메소드를 이용해 통신한다. getter, setter와 같이
- 객체라 독립적인 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리한다! ( 스택이라는 자료구조 역할을 하는 클래스를 선언했을때 데이터를 외부에서 접근하도록 하면 데이터와 기능이 분리되고 관리가 어렵다)
- 일반화 관계(Inheritance, 상속)
- 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정
- 일반화 관계는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종
- 기존코드를 재활용할수 있다.
- 다형성(Polymorphism)
- 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력, 즉 동일한 명령의 해석을 연결된 객체에 의존한다.
- 오버라이딩(Overriding)(부모클래스의 메소드와 같은 메소드를 재정의), 오버로딩(Overloading) ( 동일이름의 메소드)
- 다형성이 상속과 연계되어 동작하면 매우 강력한 힘을 발휘한다.
- <다형성을 사용하지 않는경우>
-
public class Cat { public void meow(){ System.out.println("야옹"); } } public class Dog { public void bark(){ System.out.println("멍멍"); } } public class Parrot { public void sing(){ System.out.println("안녕"); } } ======================================================== public class Main { public static void main(String[] args) { Cat cat = new Cat(); Dog dog = new Dog(); Parrot parrot = new Parrot(); // 애완동물 세 마리의 울음소리 호출 cat.meow(); dog.bark(); parrot.sing(); } }
-
- <다형성을 사용하는 경우 feat 추상클래스>
-
// 부모 클래스 public abstract class Pet { public abstract void talk(); } // 자식 클래스 public class Cat extends Pet { public void talk(){ System.out.println("야옹"); } } public class Dog extends Pet { public void talk(){ System.out.println("멍멍"); } } public class Parrot extends Pet { public void talk(){ System.out.println("안녕"); } } ======================================================== public class Main { public static void main(String[] args) { Pet[] pets = { new Cat(), new Dog(), new Parrot() }; // 애완동물 세 마리의 울음소리 호출 for (int i = 0; i < 3; i++){ // 실제 참조하는 객체에 따라 talk 메서드가 실행된다. pets.talk(); } } }
OOP의 5대 원칙 (SOLID)
- S: 단일 책임 원칙(SRP, Single Responsibility Principle)
- 객체는 단 하나의 책임만 가져야 한다.
- O: 개방-폐쇄 원칙(OCP, Open Closed Principle)
- 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
- L: 리스코프 치환 원칙(LSP, Liskov Substitution Principle)
- 일반화 관계에 대한 이야기며, 자식 클래스는 최소한 자신의 부모 클래스에서 가능한 행위는 수행할 수 있어야 한다.
- I: 인터페이스 분리 원칙(ISP, Interface Segregation Principle)
- 인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙이다.
- D: 의존 역전 원칙(DIP, Dependency Inversion Principle)
- 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다.
OOP의 장점?
코드를 재사용하기가 쉽다 (상속, 캡슐화, 다형성으로 인함)
현실세계의 데이터와 기능을 객체와 객체들간의 상호작용으로 묘사함으로써 더 쉽게 표현이 가능하다.
캡슐화와 데이터은닉등의 기능을 통해 보안성이 높다.
OOP의 단점?
절차지향 프로그래밍에 비해 속도가 다소 느리다.
모든것을 객체로 생각하기 때문에 추가적인 포인터크기와 메모리연산 비용이 든다.
'공부공부 > Java' 카테고리의 다른 글
[Java] 자바는 Call by Value일까 Call by Reference일까? (0) | 2021.08.02 |
---|---|
[Java] 추상클래스와 인터페이스의 차이 (0) | 2021.07.15 |
[Java] Wrapper class란? (0) | 2021.07.13 |
[Java] Optional이란? (1) | 2021.05.24 |
[Lombok] @RequiredArgsConstructor / @NoArgsConstructor / @AllArgsConstructor (0) | 2021.05.22 |