[자바 객체 지향] 객체 지향의 4대 특성 - 추상화

2022. 3. 24. 02:28CSE/JAVA

1. 추상? 추상화?

객체 지향의 추상화의 의미를 알아보기 위해 먼저 '추상'과 '추상화'의 사전적 정의를 살펴보자

네이버의 국어 사전에 '추상'과 '추상화'를 검색하면 다음과 같은 결과를 얻을 수 있다.

  • 추상 : 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 작용
  • 추상화 : 추상적인 것으로 . 또는 그렇게 만듦.

즉, 추상화는 '사물/개념에서 공통되는 속성을 추출하고, 그렇게 만들다' 라는 뜻이다.

이 개념을 객체지향에 적용해보자

 

2. 객체 지향에서의 추상화

객체 지향에서 '사물/개념'에 대응 되는 것은 객체이고, '공통되는 속성'에 대응되는 것은 클래스라고 할 수 있다.

즉, 객체에서 공통되는 속성을 추출해서 이를 클래스로 만드는 것이 객체 지향에서의 추상화이다.

그리고 이런 클래스로 만들어진 객체는 '클래스의 인스턴스'라고 한다.

 

그렇다면 공통적인 속성에는 어떤 것들이 있을까?

나이, 이름 등 명사로 표현되는 특성도 있을 것이고 먹다, 자다 등 동사로 표현되는 특성도 있을 것이다.

객체 지향에서는 명사로 표현되는 특성을 속성이라고 하고, 동사로 표현되는 특성을 메서드라고 한다.

 

공통적인 속성을 뽑을 때, 존재하는 모든 공통적인 속성을 나열할 수는 없다.

따라서, 특정한 기준인 애플리케이션 경계 내부에만 있는 속성을 나열해야 하는데, 이 때, 애플리케이션 경계를 컨텍스트(Context)라고 부르기도 한다.

 

위에 나온 개념들을 종합해서 추상화를 다시 정리해보자면 다음과 같다.

  • 객체들을 분해해서 컨택스트에 있는 속성들만 가지고 재조합하여 클래스를 만드는 것

즉, 추상화는 모델링이라고 할 수 있다.

 

추가적으로, 추상화의 넓은 개념에는 다음 내용도 포함된다.

  • 상속을 통한 추상화, 구체화
  • 인터페이스를 통한 추상화
  • 다형성을 통한 추상화

 

3. Java에서의 추상화

Java는 추상화를 class 키워드를 통해 지원하고 있다.

그리고 클래스와 객체 관계는 다음과 같이 표현한다.

  • 클래스 '객체 참조 변수' = new 클래스();

위와 같은 코드는 다음과 같은 일을 한다.

  1. 새로운 객체를 하나 생성함
  2. 그 객체의 주소값(포인터)를 객체 참조 변수에 할당함

 

T 메모리에서는 어떻게 되는지 알아보기 위해 먼저 예시 코드를 보자.

public class Mouse {
  public String name;
  public int age;
  public int countOfTail;

  public void sing() {
      System.out.println(name + " 찍찍!!!");
  }
}
public class MouseDriver {
  public static void main(String[] args) {
      Mouse mickey = new Mouse();

      mickey.name = "미키";
      mickey.age = 85;
      mickey.countOfTail = 1;

      mickey.sing(); 
  }
}

T 메모리에서 클래스는 static 영역에, 객체는 heap 영역에 존재하며, 해당 객체의 메모리 주소가 스택 영역에 위치한 객체 참조 변수에 할당된다. 그리고 객체 참조 변수가 더 이상 해당 객체를 참조하지 않으면, Garbage Collector가 힙 영역에 위치한 객체를 쓰레기로 인지하고 수거해간다.

 

 

 

4. 클래스 멤버 속성

이 세상의 모든 '정상적인' 쥐는 꼬리가 하나이다. 귀는 두 개이다.

이렇게 만약 클래스의 모든 인스턴스들이 어떤 속성에 대해서 공통된 값을 가지고 있을 수 있다.

이 때, 인스턴스를 만들 때, 해당 속성을 매번 입력해주기는 귀찮을 수 있다.

그렇다면, 해당 속성에 static 키워드를 붙여서 static 영역에 클래스와 함께 저장하자!

이런 속성은 클래스 멤버 속성이라고 한다.

  • 클래스 멤버 == static 멤버 == 정적멤버

클래스 멤버는 static 멤버라고도 하며 정적 멤버라고도 한다.

정적 멤버는 객체들의 존재 여부에 상관없이 쓸 수 있다.

 

+ main() 메서드가 당연히 정적 메서드여야 하는 이유

T 메모리가 초기화된 순간 객체는 하나도 존재하지 않기 때문에, 객체 멤버 메서드를 바로 실행할 수 없다.

따라서 main() 메서드는 정적 메서드여야 한다.

 

 

+ 지역변수 vs 클래스 속성, 객체 속성

이름 초기화 안하면 가지게 되는 값 T 메모리 중 위치
Static 변수 (클래스 속성) 정수형 : 0
부동 소수점형 : 0.0
논리형 : false
객체 : null
Static 영역
인스턴스 변수 (객체 속성) Heap 영역
지역 변수 쓰레기 값 Stack 영역