반응형
객체지향 프로그래밍이란?
- 부품에 해당하는 객체들을 먼저 만들고, 프로그램을 객체로 구성하는 것
- 프로그램 규모가 커지면서 생각한 해결책이 '프로그램을 작게 나눠서 만들고, 합치자!'이다.
- 각각의 객체는 맡은 작은 기능을 수행하고, 서로 협력해 큰 규모의 프로그램이 되는 것이다.
- 이 과정에서 굉장히 많은 객체가 존재할 수 있기 때문에 객체를 서로 구분해야 한다.
- 결국, 각 객체들에게 기능을 제공하는데 어떤 책임을 부여하고 어떻게 협력을 할지 정하는 것이 객체지향 프로그래밍이다!
객체란?
- 자신의 속성을 가지고 있고 다른 친구들과 식별 가능한 것으로 작은 기능을 수행한다.
- 프로그램을 만들 때 객체를 서로 구분해야 하는데, type(형)으로 구분한다.
- 타입을 만든다는 것은 클래스를 만드는 것과 같다.
- ex) String s = "STR"; : String type이다.
객체지향 프로그래밍의 특징
1. 캡슐화(Encapsulation)
- 맡은 역할을 수행하기 위한 데이터와 기능을 묶는 것
- 객체들이 동작하는데 안정성이 필요해 등장함
- 객체는 스스로 캡슐링 되어서 기능을 수행하는 단위로 완전함을 가짐
- 정보가 은닉되어 있어서 외부에서는 접근할 수 없음
- 노출 시 잘못 사용해 객체에 영향 끼치는 것을 방지하기 위해 사용
- 접근 권한을 통해 제공되는데 public, private, protected와 같은 내용에 의해서 구현된다.
- ex) 컴퓨터의 부품이 노출되어 있으면 고장 날 수 있음
2. 상속(Inheritance)
- 부모 객체의 필드나 메서드를 자식에게 물려주는 것으로 상위 객체를 재사용함
- 부모(추상) -> 자식(구체) 사이에서 상속 관계가 맺어짐
- 객체를 빠르게 설계할 수 있고, 코드 중복을 줄려 준다.
- 자바에서 상속은 클래스의 단일 상속만 지원하지만, 횟수에는 제한이 없다.
- 모든 클래스는 Object클래스를 상속받아 기능을 물려받아 사용 중이다.
- ex) 음식 -> 한식 -> 김치찌개
3. 추상화(Abstraction)
- 객체들의 공통적인 특징을 뽑아내는 것
- 이 뽑아낸 특징을 상속받아 하위 클래스들이 정의해 사용할 텐데 이 과정에서 추상체와 구상체가 구분됨
- 객체 간의 관계에서 상위에 있는 것이 항상 하위보다 추상적이어야 함
- 사용자에게 세부 사항은 감추고 작동되는 기능만 제공하려는 목적
- 즉, 사용자는 객체가 무엇을 하는지 알 수 있지만, 어떻게 하는지는 알 수 없다.
4. 다형성(Polymorphism)
- 같은 타입이지만 실행 결과가 다른 객체를 이용하는 것
- type을 여러 가지로 표현할 수 있음
- 상속받는 상위 클래스는 동일하지만, 그것을 상속한 하위 클래스나 객체에 따라 다르게 작동할 수 있음
- 아래처럼 하나의 타입에 여러 객체를 대입해서 다양한 기능으로 이용이 가능하다.
interface Move {
void move() {}
}
class Go implements Move {
void go() {}
@Override
void move() {}
}
class Stop implements Move {
void stop() {}
@Override
void stop() {}
}
Move move = new Move();
Move move = new Go();
Move move = new Stop();
* 오버로딩 : 같은 이름이지만, 서로 다른 매개변수를 가지고 있는 메서드를 여러 개 정의하는 것.
* 오버라이딩 : 상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의 하는 것.
출처
https://coding-factory.tistory.com/328
https://catsriding.dev/dev/oop/
https://richong.tistory.com/122
반응형
'Java' 카테고리의 다른 글
[Java] 다형성, 캐스팅, 추상 클래스, 추상 메서드 (0) | 2021.06.22 |
---|---|
[Java] 상속, final, 자동 형변환 (0) | 2021.06.22 |
[Java] Java의 메모리 구조, NullPointerException, String (0) | 2021.06.21 |
[Java] 기본 타입과 참조 타입 (0) | 2021.06.21 |
[Java] JVM이란? (0) | 2021.06.21 |