sung-ik-je.log
로그인
sung-ik-je.log
로그인
객체, 추상화 ?
Ik
·
2023년 1월 19일
팔로우
0
CS
Java Spring
0
CS
목록 보기
21/27
객체란?
실행되는 프로그램에 존재하는 구조화된 데이터의 덩어리
데이터를 식별 가능한 분리된 개체로 만든 것
하나의 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( ) 사용하면 에러 발생
방법
Extends(추상클래스의 경우)
Interface(인터페이스의 경우) 함께 사용 가능
다형성
외부에 보이는 모습은 한 가지 형태이지만 실질적으로 기능은 여러 가지 역할을 수행
같은 클래스를 이용하는 객체에 따라 기능 변화?
조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조하도록 하는 것이 가능
조상 클래스 타입, 인스턴스와 동일 타입 두 가지로 인스턴스를 참조 했을 경우 조상 클래스 타입으로 선언한 인스턴스의 경우 자식클래스의 변수들을 모두 사용할 수 없다
방법
Overloading - 오버로딩
하나의 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
조건 : 메서드 이름이 같아야 하고 매개변수의 개수 또는 타입이 달라야한다 (반환 타입은 관계 X)
Override - 오버라이딩 - 재정의, 위에 덮어쓰다
표기 - @Override
단순히 표시해주는 정도
조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
조건
메서드의 선언부(이름, 매개변수, 반환 타입)은 완전히 일치
접근 제어자는 조상클래스의 메서드보다 좁은 범위로 변경 할 수 없다, 대부분 같은 범위의 접근 제어자 사용
접근 제어자 - public > protected > default > private
메소드 지정자(=수정자)가 final, private인 경우 오버라이딩 불가
조상 클래스의 메소드보다 많은 수의 예외 선언 불가
절차지향
객체 지향 이전의 소프트웨어 개발 패러다임
메인 프로시저가 다른 프로시저(하위 프로시저)를 호출하고 해당 과정 연쇄적으로 이루어진다
최고층 프로시저가 존재하며 각 프로시저가 하위 계층의 프로시저를 호출하고 실행을 제어
단순하게 데이터를 계산하는 목적에는 적합하지만 복잡한 형태의 데이터를 가진 문제에는 적합하지 않다
각기 다른 데이터에 대해 다른 프로시저가 작동하고 각 프로시저마다 많은 데이터 타입 고려해야 하므로, 굉장히 복잡해진다
데이터와 프로시저가 분리, 프로시저가 서로 데이터를 주고 받으며 작업 진행
문제를 해결하는데 있어 데이터보다 알고리즘에 집중한다
구성
프로시저 추상화로만으로 구성
절차지향에서의 프로시저는 계층구조를 이룬다
객체지향 VS 절차지향
절차지향
내용
객체지향
데이터 < 알고리즘, 알고리즘을 중심으로
1. 문제 해결
객체를 중심으로
계층 구조
2. 프로시저
객체들의 유기적인 구조
프로시저 추상화
3. 프로시저 구성
프로시저, 데이터 추상화
primitive type을 기반으로 프로시저마다 데이터가 이동하며 운용
4. 데이터
데이터 이동 X, 객체 선언 후 Class 내 함수 호출해 사용
부연설명
때문에 절차지향의 경우 Data Type은 기본 타입(primitive type)만 존재, 객체 지향의 경우 객체를 만들어내는 Class type의 Data Type도 존재해 다양
객체 지향의 경우 다양하고 복잡한 Data Type을 다룰 수 있다
절차지향은 계층 구조로 프로시저를 운영하는데 반면 절차 지향은 Class라는 객체를 만들어내는 최소한의 데이터 단위를 유기적으로 운영한다
개인적으로 가장 큰 차이는 문제 해결하는 전반적인 프로세스 부분에서 데이터를 어떻게 관리하는지에 가장 큰 차이점이 존재한다고 생각한다
ref
객체지향 소프트웨어 공학
Chapter 2(~68p)
Ik
팔로우
이전 포스트
[Git] 데이터 처리 Front vs Back
다음 포스트
의존성?
0개의 댓글
댓글 작성