H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • 객체 지향 프로그래밍(OOP)
  • 객체의 이해
  • 클래스의 이해
  • 객체 지향의 특징
  • 캡슐화
  • 상속
  • 다형성
  1. Base Language
  2. Java
  3. Java 중급

객체 지향 프로그래밍

PreviousJava 중급Next클래스

Last updated 3 years ago

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

OOP(Object Oriented Programming), 객체 지향 프로그래밍은 단어 뜻 그대로 객체를 적극적으로 활용하여 프로그래밍하는 방식을 말한다. 독립된 객체(Object)들을 만들어 서로 상호작용하며 현실 세계와 유사한 형태로 프로그래밍 하는 것을 목표로 하는 설계 방법을 의미한다.

객체들은 여러 가지의 정보의 혼합으로 만들어지며, 자바에서는 이를 만들기 위해서 class라는 형태를 제공한다.

객체의 이해

우리 현실에 존재하는 물건들 역시 객체로 분류되기 때문에 우리는 객체에 대해서 잘 알고 있다. 다음 사진을 보면 본인의 객체에 대한 이해도를 파악할 수 있다.

위의 내용은 카카오톡(Kakaotalk) 메신저의 채팅 내용의 일부이다. 화면에서 메세지(Message)라고 할 수 있는 요소는 몇 개인가?

. . . . . . .

4개라고 대답했다면 객체가 무엇인지 정확하게 파악하고 있는 것이다. 화면에 존재하는 많은 데이터들을 연관있는 것끼리 분류하여 하나의 단위로 인식하고 있다는 의미이기 때문이다.

클래스의 이해

이러한 객체(메세지)를 만들기 위해서는 메세지가 어떠한 데이터들로 이루어져 있는지 정의해야 한다. 명확하게 정의하지 않는다면 기준이 없어서 사람들마다 기준이 달라질 수 있기 때문이다.

  • 메세지(Message)

    • 프로필사진(profile)

    • 보낸사람(sender)

    • 내용(content)

    • 보낸시각(time)

    • 안읽은사람수(people)

우리가 알고 있는 지식과 화면의 내용을 조합해보면 메세지는 여러 데이터들로 구성되어 있음을 알 수 있다. 자바에서 데이터들은 각각의 자료형(Data type)을 가지고 있으며, 우리는 프로필사진을 제외한 모든 구성요소들의 데이터를 정의할 수 있다.

  • Message

    • profile(???)

    • sender(String)

    • content(String)

    • time(String)

    • people(int)

String과 , int같은 데이터들은 더 이상 분해될 수 없는 데이터이므로, 프로필 사진만 제외한다면 우리는 메세지가 어떠한 형태의 데이터로 이루어졌는지 알고 있다는 내용이 된다.

따라서 JVM이 이해할 수 있도록 내가 알고 있는 형태를 정의해줄 필요가 있으며, 이를 class라고 한다. class를 만들고 구성요소를 적절히 배치하면 JVM이 이를 해석하여 프로그램 상에서 객체를 생성하고 사용한다.

class를 잘 구성하는 것이 객체 지향적인 프로그래밍을 잘 하는 비결이며, 이를 위한 각종 문법들이 준비되어 있다.

객체 지향의 특징

객체 지향은 다음의 특징을 가진다.

  • 은닉화

  • 캡슐화

  • 상속

  • 추상화

  • 다형성

캡슐화

캡슐화란 객체의 기능을 만들 때 이용자에게 최소한의 필요한 기능만 노출시켜 내부 상태를 알지 못해도 이용할 수 있도록 만드는 디자인 기법이다.

일반적으로 자판기를 예로 많이 드는데, 사용자가 자판기의 내부 구조는 모르지만 외부에 드러나있는 투입구, 버튼, 투출구만 이용하여 온전히 사용할 수 있도록 구성되어 있기 때문이다.

우리가 객체를 디자인할 때 캡슐화를 잘 수행한다면 객체는 자판기처럼 이용자가 내부 구조보다 기능에 초점을 맞추어 사용할 수 있게 된다.

이를 위해서는 접근 제한을 통해 데이터를 보호하는 은닉화 구조가 먼저 구현되어야 한다.

상속

상속은 클래스 그룹을 효율적으로 만들기 위한 기법이다. 예를 들어 다음 두 개의 형태를 만든다고 가정해본다.

중복되는 부분이 많기 때문에 공통점만 추려 다음과 같은 구조를 만들 수 있다.

위와 같은 구조를 상속 구조라고 하며, 다른 휴대전화들이 추가되더라도 공통된 부분을 이용할 수 있기 때문에 좀 더 빠르고 효율적으로 개발할 수 있는 특징이 생긴다.

다형성

다형성이란 상속 관계에서 대표 형태로 하위 형태를 표현하는 방법을 말한다. 세부적인 이론 다형성 관련 문서에서 다루기 때문에 개념적으로만 살펴본다.

어떤 치킨집에서 메뉴판이 다음과 같다고 가정해본다.

가게 이름만 보면 치킨을 파는 가게인데 실제로 판매하는 것은 후라이드 치킨, 양념 치킨, 간장 치킨인 것을 알 수 있다. 이것이 가능한 이유는 프로그래밍적으로 봤을 때 다음 구조를 가지고 있기 때문이다.

만약 간판을 후라이드치킨집이라고 했다면 양념치킨이나 간장치킨은 판매하지 못했을 것이다. 이처럼 다양한 형태를 하나로 묶어서 표현하도록 하는 기술을 다형성(多形性)이라고 한다.

흔히 볼 수 있는 메신저 화면