본문 바로가기
학습

객체지향과 4대 특성

코동이 2022. 11. 2.

객체란?


 현실세계의 구체적인 사물(Object)과 더불어 정신적인 영역까지 포함한 하나의 "개념"으로 정의할 수 있는 모든 것입니다.

 

객체지향이란?


 객체지향이란 시스템을 하나의 공동체로 바라보고 자율적인 객체들이 서로 상호작용하도록 객체를 이용해 시스템을 분할하는 것입니다. 객체지향의 시작은 객체에 적절한 책임을 부여는 것. 객체 간의 요청과 응답하는 협력으로 시스템이 구성됩니다.

 

 자율적인 객체란, 상태(varaible), 행위(method)를 가지며 스스로 자신을 책임지는 객체를 의미합니다.

 

  • 상태, 속성(Variable)

객체는 상태 정보를 저장하고 유지해야 하는데 이러한 속성은 변수로 정의됩니다. 속성 값이 바뀜으로써 객체의 상태가 변경될 수 있습니다.

 

  • 기능(method)

외부로부터 직접 속성에 접근하여 값을 변경하는 것이 아니라 객체의 method를 통해 요청하고 method를 통해서 변경합니다.

 

객체지향에서 클래스의 의미는?


 일반적으로 객체지향이 자바에서 많이 논의되다 보니 클래스는 객체지향을 위한 것이라거나 객체지향에 클래스가 필수요소인 것처럼 느껴지기도 합니다. 하지만 클래스는 객체지향 설계를 위한 하나의 도구에 불과합니다. 객체지향에서 핵심은 클래스가 그 자체가 아니라 적절한 책임을 수행하는 역할 간의 유연하고 견고한 "협력 관계를 구축"하는 것입니다.

 

 

 

객체 지향 4대 특성


객체 지향의 4대 특성으로 캡슐화, 상속, 다형성, 추상화가 있습니다.

 

1. 캡슐화(encapsulation)


  • 캡슐화는 외부로부터 객체의 속성(variable)을 보호하기 위해 사용합니다. (private로 선언해 직접 접근을 막습니다.)
  • method도 특정 클래스에서만 사용한다면 private으로 외부의 접근을 제한합니다.

ex) 컴퓨터 전원을 켜기 위해서 메인보드의 스위치를 올리는 것이 아니라, 전원버턴을 누른다.

 

  • 속성을 변경하기 위해서 public method(간접접근)을 사용합니다.

Getter/Setter 메서드를 통해서 처리하도록 한다.

 

  • 실물 객체가 가진 기능을 모두 제공해야 합니다.

ex) 자동차의 렌탈, 반납, 주행거리 계산 등등

 

  • 각각의 method는 서로 관련성이 있어야 합니다.

ex) 차량의 렌탈/반납, 자동차 등록증 등록/해지

 

class Time {
  private int hour;
  private int minute;
  private int second;
  
  public void setHour(int hour) {
  	if(hour < || hour > 23) return;
    this.hour = hour;
  }
  
  public int getHour() {
    return hour;
  }
}

 

장점

 추상화를 제공합니다. 실제로 method를 어떻게 동작하는지 외부에서는 이해할 필요가 없으며, 단순 호출만으로 해당 기능을 실행할 수 있고, 이를 통해서 객체 단위로 프로그램 설계가 가능합니다.

 

 

2. 상속(Inheritance)


  • 기존의 클래스로 새로운 클래스를 작성합니다.(코드의 재상용)
  • 두 클래스를 부무와 자식으로 관계를 맺어줍니다. (extends를 사용)
  • 자손은 조상의 모든 멤버를 상속받습니다.(생성자, 초기화 블록 제외)
  • 자손의 멤버 개수는 조상보다 같거나 많습니다.
  • 지손의 변경은 조상에 영향을 미치지 않습니다.

아래에서 Parent 클래스는 부모이고, Child 클래스는 자손입니다.

class Parent {
...
}

class Child extends Parent {
...
}

 

자손 클래스 Child는 상속하여 더 많은 기능을 구현 할 수 있어서 범위가 크다

 

장점

 해당 클래스에서 필요한 속성 및 메서드를 모두 정의하지 않고 상속받아서 사용하는 재사용성이 좋다. 최상위 클래스의 구조를 보고 하위 클래스 동작 이해할 수 있으므로 프로그램 구조의 이해도가 향상됩니다. 일관된 형태의 클래스 객체를 추가할 수 있어 확장성에 좋다.

 

feat. 포함(composite)


클래스의 멤버로 참조 변수를 선언하는 것입니다. 작은 단위의 클래스를 만들고, 이 둘을 조합해서 클래스를 만듭니다.

 

아래 예시는 Circle 클래스가 Point 클래스를 포함합니다. 또한 의존한다고도 합니다.

class Circle {
  Point c = new Point();
  int r;
}

 

상속관계 '~은 ~이다'(is-a)

포함관계 '~은 ~을 가지고 있다'(has-a)

 

원(Circle)은 점(Point)이다.(Circle is Point)

원(Circle)은 점(Point)을 가지고 있다 (Circle has Point)

 

대부분 상속을 사용하지 않고 포함을 사용합니다.

 

3. 다형성(polymorphism)


 다형성은 조상 타입 참조 변수로 자손 타입 객체를 다루는 것입니다. 하나의 개체가 여러 개의 형태로 변화합니다.

 

 원래 참조 변수와 인스턴스의 타입은 같아야 하는데, 아래와 같이 다형성은 타입이 불일치합니다.

Unit unit = new Unit(); //참조변수와 인스턴스 타입 일치!
Unit unitDog = new Dog(); //참조변수와 인스턴스 타입 불일치!

 

 타입이 불일치하는 경우, 부모 타입 참조 변수로 자손 타입 인스턴스를 참조할 수 있습니다

 

interface Unit {
...
 public void move(Unit unit, double x, double y);
...
}

class Dog implements Unit{
 public void move(double x, double y) {
  //벽을 만나면 멈춘다
  
  //이동
 }
 
 public void bark() {
  //짖는다
 }
}

class Bird implements Unit{
 public void move(double x, double y) {
  //무조건 이동
 }
 
 public void jackjack() {
  //짹짹 짖는다
 }
}

public static void main(String[] args) {
 Dog dog = new Dog(); //지상유닛
 Bird bird = new Bird(); //공중유닛
 
 Unit unit1 = new Dog();
 unit1.move(1.5, 2.6); //벽통과 못함
 
 Unit unit2 = new Bird();
 unit2.move(1.5, 3.0); //벽통과 가능
}

 

 다형성을 사용해 부모 타입의 참조 변수로 자손 타입의 인스턴스를 참조할 수 있으므로 Unit의 참조 변수가 Dog와 Bird 중 어떤 인스턴스를 참조하느냐에 따라서 다른 move()를 실행합니다. Dog의 move()는 벽을 만나면 멈출 것이고, Bird의 move()는 언제든지 벽을 통과할 수 있습니다.

 

 

 

 

 유의할 것은 Unit 클래스에는 없는 Dog 클래스의 bark()와, Bird 클래스의 jackjack()은 접근할 수 없습니다. 부모 클래스에서 해당 메서드들이 정의되지 않았기 때문입니다.

Unit unit = new Dog();
unit.bark();  //에러! Unit은 bark()가 없다

 

 

 또한 자손 타입의 참조 변수로 부모 객체를 다룰 수 없습니다. Dog와 Bird에는 각각 bark()와 jackjack(0 메서드를 고유하게 가지고 있습니다. 하지만 Unit은 단순히 move() 메서드만 가지고 있습니다.

// 에러!! Unit에는 bark()가 없다
// 자손이 기능이 더 적은 부모를 참조하면 bark()는 어떻게 호출 할 것인가!
Dog dog = new Unit(); 

// 에러!! Unit에는 jackjack()이 없다
// bird는 Unit에 존재하지 않는 jackjack()을 절대로 호출 할 수 없다!
Bird bird = new Unit();

 

 

4. 추상화(abstract)


 추상화란 구체적으로 공통적인 부분, 특정 특성을 분리해서 재조합하는 것입니다. 다형성, 상속 모두 추상화에 속합니다.

 

 아래에서 파란색의 탱크와 정찰기를 보자. 각 유닛이 가진 속성과 행위들을 나열하고 그중에 공통점, 차이점을 살펴보겠습니다.

 

 

 속성에서는 이름, 공격력, 방어력이 공통점이고, 행위는 공격과 이동이 공통이기 때문에 각 공통부분을 유닛이라는 새로운 슈퍼클래스로 분리합니다. 그렇다면 탱크와 정찰기는 유닛을 상속하는 구조로 바뀝니다. 그 결과, 다형성과 상속에서 가진 장점처럼 재사용의 장점을 누릴 수 있다.

 

다시 말해,  추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이다.

 

 

참고

https://www.youtube.com/watch?v=Pgutf0G3nE4

반응형

'학습' 카테고리의 다른 글

JVM의 구조  (0) 2022.10.21
가비지 컬렉터(Garbage Collector) - 2  (0) 2022.10.18
가비지 컬렉터(Garbage Collector) - 1  (0) 2022.10.18
Array vs ArrayList  (0) 2022.10.17
HashSet은 내부가 어떻게 구현이 되어 있는가?  (0) 2022.10.15