🐯
경민민 IT 핸드북
  • Orientation
    • 전달사항
    • 복습방법
    • 수료한 선배의 한마디
    • 간단 자기소개
    • 스터디
  • 백엔드
    • Java
      • 1장 프로그래밍 기초
      • 2장 자바 메모리구조
        • 1. Stack
        • 2. Heap
      • 6장 객체
      • 8장 상속
      • 9장 다형성
      • 10장 추상클래스와 인터페이스
      • 13장 Generic
      • 14장 Thread
      • 15장 Network
      • 16장 Lamda
        • 1. 내부 클래스 (Inner Class)
          • DTO , VO, Builder Pattern
        • 2. 람다 표현식 (Lambda Expression)
        • 3. 스트림 API (Stream API)
          • Optional
      • 17장 Enum
  • 프론트
    • Node.js
    • Java Script
      • ES6+
        • Node.js로 자바스크립트 실행
        • let , const , var
        • Destructuring문법
          • Rest(...) 문법
        • Arrow Function
        • 모듈
        • ETC
    • Type Script
      • 개요
      • TS설치 및 환경설정
      • 타입스크립트 기본
        • 기본 자료형들과 타입추론
        • Object, Array , Tuple
        • Any, Unknown, Union Type
        • Function Type
          • Type Assertion && Narrowing
          • Never type
        • Type Aliases와 Interface
        • 리터럴 타입
        • 함수 추가 문법
        • Class문법
        • 객체 타입 추가 문법
        • 실습문제 1차
        • 실습문제 2차
        • 실습문제 3차
    • React
      • 개요
      • SPA 와 MPA
        • SEO(작성예정)
      • 리액트 프로젝트 생성(18.3.1.ver)
        • HTML + react 샘플
        • CRA 와 Vite 비교
      • 리액트 개념들
        • Component
          • 클래스 컴포넌트(작성예정)
          • 함수형 컴포넌트(작성예정)
        • JSX
        • React Virtual Dom
          • Reconciliation
        • hook
          • useState
        • 리액트 데이터 전달
          • FLUX
      • 백엔드 서버 연동
        • 비동기요청
        • 웹소켓
        • Promise(작성예정)
      • 실습문제 1
      • 실습문제 2
      • 실습문제3
      • 실습문제4
  • 프레임워크
    • Spring
      • Spring 개발환경 구축
        • 프로젝트 환경설정
        • 프로젝트 생성
          • MVC Project 생성이슈
        • Maven 설정
        • web.xml 설정
        • Spring Bean Configuration.xml 설정
      • Spring Legacy Project
        • Spring 요청 및 응답 흐름
        • Spring 주요 Annotation
          • 의존성 주입방식의 차이점
          • @ModelAttribute와 유효성검사
          • 비동기처리
          • 스프링 예외처리
        • Logging
        • Pagination
        • Spring File 업로드 및 다운로드
        • Spring WebSocket
        • Spring AOP
      • Spring 라이브러리들(작성예정)
        • Lombok
        • Maven
        • MyBatis
      • Spring 구성 모듈(작성예정)
      • 스프링 과제
    • Spring Boot
      • Spring Boot 개발환경 구축
      • 스프링 부트 프로젝트 생성방법들
        • 프로젝트에서 사용하는 의존성들
      • 스프링 프로젝트 구조
        • SpringBootApplication
      • application.properties
      • Cross Origin
        • CORS
      • WebSocket
        • Stomp(작성중)
      • 로그인(작성중)
      • Spring Security(작성중)
      • 실습문제 Select
      • 실습문제 Update
      • 실습문제 Delete
  • 형상관리(Git)
    • GitHub설정
    • SourceTree를 활용한 깃허브 연동
      • 소스트리 설치
      • Clone
      • Branch
        • Branch Protection rules
          • Branch Protection Rules 상세규칙
        • Rebase 와 Squash (작성예정)
      • Team Project 설정
        • 팀장 프로젝트 셋팅
          • Collaborator
          • .gitignore 설정
        • 팀원 프로젝트 셋팅
        • 공통 프로젝트 진행
  • 프로젝트
    • 진행순서
      • 요구사항 분석 단계
        • 유용한 사이트
      • 프로그램 설계 단계
        • 유용한 사이트
      • 프로그램 구현단계
        • SourceTree를 활용한 Team Project설정
      • 테스트 단계
  • 배포
    • AWS-EC2 배포 연습
    • DevOps
      • IT시스템의 변화와 DevOps
      • DevOps 라이프사이클
    • 젠킨스
      • 도커
        • 도커 설치 방법
        • 도커 기본 명령어들
      • 젠킨스 설치
      • 젠킨스 프로젝트 생성
      • 젠킨스 소스코드 통합 - Github
      • 젠킨스 빌드 설정 - Maven
      • 배포 서버 구축하기
      • 파이프라인 구축
      • AWS 서버 생성
        • AWS 인스턴스 생성
        • AWS - Zenkins 연동
        • AWS - 배포서버 연동
        • AWS - Jenkins CI/CD파이프라인 구축
  • 유용한 사이트 모음
  • SQL
    • SQLD
      • 데이터 모델링의 이해 - 스키마
      • 데이터 모델링의 이해 - ERD
      • 데이터 모델링의 이해 - 정규화
      • 데이터 모델링의 이해 - NULL
      • SQL 기본 및 활용 - WINDOW FUNCTION
    • Oracle
      • 1장 개요
      • 2장 SQL
  • LLM 서비스
    • 1장 LLM에 대한 이해
    • 2장 프롬프트 엔지니어링
      • 프롬프트와 프롬프트 엔지니어링
      • GPT PlayGround
      • 프롬프트 작문 유형
      • 기본 프롬프트 엔지니어링 태크닉
      • 고급 프롬프트 엔지니어링 태크닉
        • ReAct Prompting
        • Active-Prompt
        • Reflexion
        • Graph Prompt
      • OpenAI API설정
      • OpenAI를 활용한 프롬프트 엔지니어링 실습
        • 실습 프롬프트
    • 3장 Lang Chain 프레임워크
      • LangSmith 프레임워크
        • LangSmith를 활용한 LangChain 모니터링 설정
      • LangChain 실습 1 - Prompt
        • 실습 코드
      • LangChain 실습 2 - LLM 캐시와 메모리
    • 4장 RAG
      • Document Loader - 문서 로더
      • Text Splitter - 텍스트 분할
      • Embedding - 임베딩
      • Vector Store - 벡터 저장소
      • Retriever - 검색기
      • ReRanker - 재평가자
      • RAG
Powered by GitBook
On this page
  • 객체지향프로그래밍(OOP)
  • 객체의 사전적 정의
  • 컴퓨터 과학에서의 객체
  • 등장배경
  • 클래스(Class)
  • 등장배경
  • 추상화
  • 현실세계의 추상화 예시
  • 캡슐화
  1. 백엔드
  2. Java

6장 객체

Previous2. HeapNext8장 상속

Last updated 22 days ago

객체지향프로그래밍(OOP)

자바는 객체지향언어(Object-Oriented Programming)입니다. 정확히는 객체지향프로그래밍을 지원하는 언어라고 생각해주시면 됩니다. 객체지향프로그래밍(OOP)는 "객체로 프로그래밍하는것을 지향하는 언어"라고 생각할 수 있는데 여기서 객체란 무엇일까요?

객체의 사전적 정의

컴퓨터 과학에서의 객체

프로그래밍에서 객체(Object)란 클래스(Class)를 통해 메모리 영역(Heap)에 저장공간이 할당된 데이터를 의미합니다. 자바에서는 new 연산자와 클래스의 생성자를 통해 객체를 생성하죠.

정리하자면 객체지향 프로그래밍(OOP)이란, 현실 세계에 존재하는 사물이나 개념을 객체라는 단위로 표현하고, 이들 객체 간의 상호작용을 통해 프로그램을 구성하는 방식입니다.

예를 들어 '자동차'는 속성(브랜드, 차종, 연비 등)과 행동(가속, 브레이크)이 있는 하나의 객체로 볼 수 있고, '운전자'라는 객체가 이를 조작하며, 이와 같은 객체들 간의 관계로 프로그램이 구성됩니다.

등장배경

객체지향 프로그래밍 이전에는 절차지향 프로그래밍이 대세 프로그래밍 방법이었습니다. 절차지향 프로그래밍은 처리해야할 코드들을 목록형태로 만들어 순서대로 처리하고 결과를 도출합니다. 이러한 프로그램은 어플리케이션의 크기가 커질수록 프로그램이 복잡해져서 코드의 재사용이 어렵고 유지보수를 힘들게 한다는 단점이 있었습니다.

객체지향 프로그래밍은 절차지향 프로그래밍의 복잡성을 해결하기 위해 등장했습니다. 객체지향 프로그래밍은 여러 기능들을 객체 단위로 포장하여 관리하고, 이 객체들간의 상호작용으로 프로그래밍이 작동하도록 설계되었습니다. 객체지향의 등장으로 프로그램에 문제가 발생하면, 해당 문제가 있는 객체만 손보면 프로그램이 원활하게 돌아가므로 코드의 유지보수성이 크게 향상되었습니다.

클래스(Class)

컴퓨터 과학에서 객체는 클래스를 통해 메모리영역에 저장공간이 할당된 데이터를 의미했습니다. 즉 클래스란 객체를 생성하기 위한 도구로 비유하자면 설계도와 비슷합니다. 학생과 같은 객체를 뽑아내기 위해서는 먼저 학생을 생성할 수 있는 설계도인 클래스가 반드시 필요한 것입니다.

등장배경

OOP에서 설명하는 객체를 생성하기 위한 역할을 하는게 바로 클래스입니다. 클래스를 통하여 객체에 대하여 명확히 정의하고, 이 객체들의 상호작용으로 프로그램이 작동하게 하는 것이죠. 클래스 이전에도 클래스와 비슷한 개념이 존재했습니다. C언어에서 제공하는 구조체는 객체 처럼, 다양한 속성(데이터)를 하나로 묶어 주는 역할을 했습니다.

struct Student {
    char name[20];
    int age;
};

다만 C언어의 구조체는 데이터를 묶을 수는 있지만 그 안에 행위에 해당하는 기능(메서드)들을 추가 할 수 없고, 내부의 데이터를 외부에서 쉽게 접근하여 확인할 수 있기 때문에 정보를 보호할 수 없었습니다. 이 구조체의 단점을 보완하기 위하여 고안된 개념이 클래스(Class)로, 클래스 내부에는 속성(데이터)과 기능(메서드)이 함께 포함되어 있으며, 객체 내부의 데이터는 함부로 조작할 수 없도록 접근제한처리 기능 또한 추가하였습니다. 거기에 더해 상속, 다형성 등 고급 기능들과 함께 생성자기능 또한 지원합니다.

public class Student {
    private string name;
    private int age;

    public void study() {
        System.out.println("열공합시다");
    }
};
  • 정리하면 클래스는 구조체로부터 발전된 개념으로 단순한 데이터 묶음에서 벗어나 현실 세계의 객체를 정의할 수 있도록 발전되었습니다.

추상화

클래스를 정의할 때는 추상화 기법과 캡슐화를 통해 클래스를 모델링합니다. 추상화란 복잡한 사물이나 개념에서 핵심적인 속성만 골라내는 기법입니다. 현실세계의 수많은 클래스를 프로그래밍으로 구현해야 할 때 해당 객체의 모든 속성과 행동을 코드로 표현하려고 하면 너무 복잡해집니다. 따라서 프로그래밍에 필요한 중요한 특징들만 골라서 뽑아야 하는데 , 이 과정을 추상화라고 부릅니다.

현실세계의 추상화 예시

회원정보 관리 프로그램을 설계할 때 회원의 정보를 프로그래밍으로 옮긴다면?

회원은 사람이고 사람은 수많은 특징을 가지고 있습니다. 키, 나이 , 성격, 외모, 지위 등등.. 하지만 이 모든 특징을 구현할 필요는 없고, 프로그램의 목적에 맞는 정보들만 추출하여 회원을 추상화 합니다.

public class Person {
    private String name;
    private int health;
    private String gender;
}

캡슐화

캡슐화란 객체 내부의 데이터를 함부로 외부에서 조작하지 못 하도록 막기 위한 기능으로, 잘못된 데이터 조작으로 발생하는 프로그램 오작동을 방지할 수 있습니다. 캡슐화가 적용된 클래스의 객체에서는 객체 내부에서 사용해야 할 데이터가 있는 경우, 이 값을 안전하게 사용할 수 있는 메서드를 구현하여 데이터를 조작합니다. 자바에서는 접근제한자를 통해 캡슐화를 구현할 수 있습니다.

학생 클래스
학생객체
출처 :
출처 : wiki
https://korean.dict.naver.com/koendict
https://ko.wikipedia.org/