객체, 추상화 ?

Ik·2023년 1월 19일
0

CS

목록 보기
21/27
post-thumbnail

객체란?

  • 실행되는 프로그램에 존재하는 구조화된 데이터의 덩어리

  • 데이터를 식별 가능한 분리된 개체로 만든 것
    • 하나의 class를 만들어 class로 만들어낸 객체를 가지고 작업하는 것이 데이터를 다루는데 더 수월하기에

  • 상태, 행위 두 가지로 구성

  • 문제를 분석할 때 무엇을 객체로 설정할지가 가장 중요
    • 간단하게는 constructor(=생성자)이용해 일회성인지 객체화 해야되는지 구분
      • 일회성(=짧은 맥락)의 경우 class를 불러와 단순하게 사용 가능
    • file 수정(=긴 맥락)의 경우 class를 생성자를 이용해 객체화 시켜 사용

  • 객체는 heap에 저장
    • 객체를 생성하는 class 내부 변수를 포함한 멤버변수 heap에 저장





인스턴스?

  • 가볍게 생각한다면 인스턴스와 객체는 같은 것이라고 볼 수 있다
  • 어떤 클래스에 속하는 특정 사례를 나타낸다
    • 관계를 나타내는 용어이다(딸 = 누군가의 딸, 여자아이 = 독립적인 단어)

인스턴스 VS 객체

  • 딥하게 본다면 특정 Class로 부터 만들어진 객체를 인스턴스라 칭하며 객체는 프로그램에 사용되는 데이터들의 덩어리들을 포괄적으로 부르는데 사용한다






Class

  • 객체 지향 프로그램에서 데이터를 추상화하는 단위

  • 유사한 객체들을 정의한 프로그램 모듈(=구성요소)

  • 가볍게는 객체를 생성해내는 틀이라 생각하며 그 뿐만 아니라 데이터(객체)의 수정(메서드) 역할도 함께한다

구성

  • 속성 : 각 개체에 저장된 자료의 특성과 이름을 정의한 코드
  • 메서드 : 객체의 행위를 구현한 프로시저

Class - 객체

  • 객체 생성 : 김사원, 이사원 등의 객체(데이터 덩어리들) 생성






객체지향(OOP)

  • OOP - Object Oriented Programing

  • 추상화라는 개념 이용

  • Class들의 모임
    • 클래스를 이용해 객체를 생성, 객체 간의 상호 작용 이용해 문제 해결
      - 각 클래스에는 인스턴스(특정 클래스의 객체)의 값을 조작할 수 있는 프로시저 모여있음

  • JAVA의 경우 python처럼 함수만으로 구현 불가

  • 객체 지향이라는 것 자체가 효율적인 데이터 관리를 위해 나온 언어
    • 데이터를 가진 객체를 선언하고 객체에 속한 프로시저 호출해 사용
    • 객체 선언 후에 객체 내 함수 호출해 사용

  • 플랫폼에 독립적
    • 프로그램 실행을 위해 OS가 제어하는 메모리를 사용해야 되는데 OS마다 메모리 관리 방식 다르기 때문
      • JAVA의 경우 JVM(java virtul machine) 이용해 해결

구성

  • 프레시저, 데이터 추상화 2가지로 구성
    • 객체라는 것은 위에 두 가지 추상화 모두 실현한 개념

프레시저(함수) 추상화

  • 함수 내부적으로 어떤 계산이 이루어지는지 몰라도 입, 출력 형태를 안다면 함수 내부 연산 내용 몰라도 사용할 수 있다
  • 굳이 알 필요 X

데이터 추상화

  • 객체들의 집합, 데이터 자체만을 정의하는 것이 아닌 데이터의 조작도 함께 정의하는 개념

추상화

  • 현실 세계의 문제(=객체)에 여러 특징들 중 필요한 속성(=사용할 속성)들을 파악해 정의
  • 회화에 비유하자면 대상의 자세한 묘사를 생략하고 특징만 포착해서 그리는 것
    • 객체들의 공통 속성과 행위를 추출하는 것
    • 우리가 사용할 중요한 측면만을 주목
    • 필요한 속성들만 class화 시키고 행동을 구체화 
    • 필드 구현(클래스 정의)

캡슐화

  • 기능을 숨기는 것
    • 프로그래밍하는데 있어 내부적으로 시스템이 어떻게 동작하는지에 대한 원리 알 필요 X
    • 만들어진 시스템을 어떻게 사용하는지만 파악 필요
    • 어떻게 사용하는지는 결국 객체와 객체 간의 의사소통이 되기만 하면 된다는 것

상속

  • 기존의 클래스를 재사용해 새로운 클래스 만들어 내는 것 
  • 적은 양의 코드로 새로운 클래스 작성 및 공통적으로 관리 가능 
  • 쉽게 확장이 가능하다
    • java에서는 다중 상속은 없고 단일 상속만 존재
    • 같은 package 내에 있거나 package 표시해줘야 된다
    • 조건
      • 하위 클래스에서 생성자를 직접 구현할 때 상위 생성자의 호출이 아닌 경우 오류 발생
        • 첫 줄은 무조건 상위 생성자 호출이여야 된다
        • 상위 클래스에 기본 생성자 정의 없이 임의로 생성자 구현한 경우 하위클래스에서 기본 생성자 super( ) 사용하면 에러 발생

방법

  1. Extends(추상클래스의 경우)        
  2. Interface(인터페이스의 경우) 함께 사용 가능

다형성

  • 외부에 보이는 모습은 한 가지 형태이지만 실질적으로 기능은 여러 가지 역할을 수행
  • 같은 클래스를 이용하는 객체에 따라 기능 변화? 
  • 조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조하도록 하는 것이 가능 
    • 조상 클래스 타입, 인스턴스와 동일 타입 두 가지로 인스턴스를 참조 했을 경우 조상 클래스 타입으로 선언한 인스턴스의 경우 자식클래스의 변수들을 모두 사용할 수 없다

방법

  1. Overloading - 오버로딩
    • 하나의 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
    • 조건 : 메서드 이름이 같아야 하고 매개변수의 개수 또는 타입이 달라야한다 (반환 타입은 관계 X)
  2. Override - 오버라이딩 - 재정의, 위에 덮어쓰다
    • 표기 - @Override 
      • 단순히 표시해주는 정도
      • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
    • 조건 
      • 메서드의 선언부(이름, 매개변수, 반환 타입)은 완전히 일치
      • 접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경 할 수 없다, 대부분 같은 범위의 접근 제어자 사용
      • 접근 제어자 - public > protected > default > private
      • 메소드 지정자(=수정자)가 final, private인 경우 오버라이딩 불가
      • 조상 클래스의 메소드보다 많은 수의 예외 선언 불가






절차지향

  • 객체 지향 이전의 소프트웨어 개발 패러다임

  • 메인 프로시저가 다른 프로시저(하위 프로시저)를 호출하고 해당 과정 연쇄적으로 이루어진다
    • 최고층 프로시저가 존재하며 각 프로시저가 하위 계층의 프로시저를 호출하고 실행을 제어

  • 단순하게 데이터를 계산하는 목적에는 적합하지만 복잡한 형태의 데이터를 가진 문제에는 적합하지 않다
    • 각기 다른 데이터에 대해 다른 프로시저가 작동하고 각 프로시저마다 많은 데이터 타입 고려해야 하므로, 굉장히 복잡해진다

  • 데이터와 프로시저가 분리, 프로시저가 서로 데이터를 주고 받으며 작업 진행

  • 문제를 해결하는데 있어 데이터보다 알고리즘에 집중한다


구성

  • 프로시저 추상화로만으로 구성
  • 절차지향에서의 프로시저는 계층구조를 이룬다

객체지향 VS 절차지향

절차지향내용객체지향
데이터 < 알고리즘, 알고리즘을 중심으로1. 문제 해결객체를 중심으로
계층 구조2. 프로시저객체들의 유기적인 구조
프로시저 추상화3. 프로시저 구성프로시저, 데이터 추상화
primitive type을 기반으로 프로시저마다 데이터가 이동하며 운용4. 데이터데이터 이동 X, 객체 선언 후 Class 내 함수 호출해 사용

부연설명

  1. 때문에 절차지향의 경우 Data Type은 기본 타입(primitive type)만 존재, 객체 지향의 경우 객체를 만들어내는 Class type의 Data Type도 존재해 다양
    • 객체 지향의 경우 다양하고 복잡한 Data Type을 다룰 수 있다
  2. 절차지향은 계층 구조로 프로시저를 운영하는데 반면 절차 지향은 Class라는 객체를 만들어내는 최소한의 데이터 단위를 유기적으로 운영한다
  • 개인적으로 가장 큰 차이는 문제 해결하는 전반적인 프로세스 부분에서 데이터를 어떻게 관리하는지에 가장 큰 차이점이 존재한다고 생각한다






ref

  • 객체지향 소프트웨어 공학
    • Chapter 2(~68p)

0개의 댓글