본문 바로가기
OOP

[OOP] 객체지향 기본 개념 요약 정리

by ifhead 2022. 8. 19.
반응형

1. Class

2. Object

3. 추상화 Abstraction

4. 캡슐화 Encapsulation

5. 상속 Inheritance

6. 다형성 Polymorphism

 

 

추상화 Abstraction 

추상화란 구구절절한 내용들의 핵심만 추려내서 간단명료하게 만드는 것이다.

추상화를 통해 대상의 특성을 일반화하거나 세부사항을 제거하여 단순하게 만든다.

  • 디테일을 제거 : 지하철 노선도
  • 일반화 : 토끼, 개, 고양이는 동물

 

1. 데이터 추상화 & 제어 추상화

 

더보기

데이터 추상화 Data Abstraction

변수 : 메모리 위치를 우리가 지은 변수명으로 대신한다.

타입 : 자료 특성를 간단하게 표시한다. int, float, char 처럼.

배열 : 같은 타입의 연속된 변수들의 모음. int int int 따위가 아니라 int[].

 

제어 추상화 Control Abstrcation

기계어 명령들을 while, if, 대입연산자 등으로 단순화한다.

 

2. 일반화 : 디테일을 제거해가며 이름짓기

자료들 → 배열 → 구조체 → 클래스 → 추상클래스 / 인터페이스

 

 

캡슐화 Encapsulation : 데이터 보호 ( 보호 의도를 명시 )

  • 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶는다.
  • 실제 구현 내용 일부를 내부에 감추어 은닉한다.
  • 은닉 : 접근제한자로 은닉한다. private(자기 클래스 내부만 허용), protected(자기 클래스 내부와 자식클래스 허용)

 

상속 Inheritance : 코드 재사용

부모 클래스로부터 상속받은 코드는 자식에서 다시 구현하지 않아도 사용할 수 있다.

추상 클래스(Abstract Class) : 추상 메소드가 하나 이상 포함된 클래스.

자바는 다중 상속이 막혀있는데 이름이 같은 메소드가 어느 부모에서 상속될지 결정할 수 없기 때문이다.

 

 

다형성 Polymorphism : 여러 가지 형태를 허용

설명 1 : 다형성은 클래스 인스턴스가 상속 트리에 있는 다른 클래스의 인스턴스인 것처럼 행동하는 능력입니다. 

설명 2 : 서로 다른 유형에 속하는 객체가 적절한 유형에 따라 동일한 이름의 메서드, 필드 또는 속성 호출에 응답하는 능력입니다.

 

1. 오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용. 인터페이스의 특징.

2. 오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수를 다르게 설정 가능

3. 인터페이스는 모든 메소드가 추상이므로 반드시 오버라이딩해야한다. 즉, 상속 모호성이 안 생겨서 다중 상속이 가능하다.

4. 인터페이스의 구현은 달라질 수 있다.

5. 자식 객체는 부모 타입으로 정의될 수 있다.

class Parent { ... }
class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용. 당연.
Child ch = new Child();   // 허용. 당연.

Parent pc = new Child();  // 허용.

Child cp = new Parent();  // 오류 발생. 
// 예를 들어 cp.foo(); 를 사용하는데, 
// Parent에는 foo()가 없을 수 있기 때문에 오류.
class Parent { ... }
class ChildA extends Parent { ... }
class ChildB extends Parent { ... }


Parent parent = new Parent();
ChildA childA = new ChildA();
ChildB childB = null;
 
childB = (ChildB)parent; // 타입 변환을 생략할 수 없다.
                         // childB = new Parent()는 불가능하다.

parent = childA; // 타입 변환 생략 가능. parent = (Parent)childA 와 동일하다.                         

childB = (ChildB)childA;   // 직접적인 상속 관계가 아니므로, 오류 발생.
반응형

댓글