개요
컴퓨터 프로그래밍 패러다임 중 하나로, 명령과 데이터로 구성된 객체를 중심으로 하는 프로그래밍 기법이다.
구성요소
- 클래스 (Class)
어떤 집합의 공통적인 속성과 행위를 정의한 것.class Penguin { // 속성 int height; int weight; String species; // 행위 void waddling(){ /* 뒤뚱거리는 로직 */ } void swimming(){ /* 수영 로직 */ } }
객체지향 프로그래밍 내 대표적인 사용자 정의 데이터 타입. - 객체 (Object)
public class Example{ public static void main(String[] args){ Penguin p1 = new Penguin(); p1.species = "황제"; p1.height = 156; p1.weight = 68; Penguin p2 = new Penguin(); p2.species = "아델리"; p2.height = 143; p2.weight = 32; Penguin p3 = new Penguin(); p3.species = "턱끈"; p3.height = 137; p3.weight = 49; Penguin p4 = new Penguin(); p4.species = "젠투"; p4.height = 149; p4.weight = 55; Penguin p5 = new Penguin(); } }
클래스가 실제로 메모리에 할당된 것.
위 예제에서는 대부분의 객체가 구체적인 값를 갖고 있지만, 구체적인 값을 갖지 않은 p5도 데이터가 들어갈 공간(메모리)가 마련되어 있기 때문에 객체다.
클래스가 정의한 속성을 가지며, 클래스가 정의한 행위를 행할 수 있다.
메서드를 통해 속성(데이터)을 처리한다.
- 속성(Attribute): 객체가 가진 데이터 값. 성질, 분류, 식별, 수량, 상태 등을 나타낼 수 있음. - 메서드 (Method), 메시지 (Message)
class Example{ public static void main(String[] args){ Penguin p1 = new Penguin(); /* 생략 */ p4.weight = 55; p1.height += 3; p2.weight += 8; p4.widdling(); } }
객체에 내리는 명령.
- 메서드: 메시지에 의해 실제로 수행되는 코드.
- 메시지: 객체 간의 통신으로, 객체가 수행할 작업을 요청하여 보내는 것.
-> 객체지향 프로그래밍은 객체 간의 상호작용으로 이루어진다.
특징
- 캡슐화 (Encapsulation)
1)객체의 속성과 행위를 하나로 묶으면서 2)실제 구현 내용 일부를 외부에 감추어 은닉한다.
객체의 세부 내용이 외부로부터 감추어지므로 내용의 변경 시 외부 파급 효과가 적다.
위 예제의 경우, 나무 t의 나이는 aging()함수에 의해서만 수정될 수 있게 했다. 변수 age의 직접적인 수정을 막음으로써 값이 손상되는 것을 막을 수 있다.public class Example { public static void main(String[] args){ Tree t = new Tree(); t.aging(); age -= 2; // error } } public class Tree{ private int age = 1; public void aging(){ age++; } }
- 동적 바인딩 (Dynamic Binding)
프로그래밍이 실행되는 중에 바인딩되는 것.
반대되는 개념으로는 정적 바인딩(Static Binding)으로, 이는 프로그램의 실행 전에 바인딩이 진행된다.
바인딩: 메서드 호출과 실제로 메모리에 저장된 메서드 코드 본문의 연결 - 추상화 (Abstraction)
현상의 본질만을 남기고 축약시키는 것.
클래스를 정의하는 것 자체를 추상화라고 볼 수 있다. - 상속성 (Inheritance)
객체들 간의 관계를 구축하는 방법.
기존 클래스로부터 속성과 행위를 물려받을 수 있다. 상속해주는 클래스를 슈퍼 클래스 혹은 부모 클래스라고 하고, 상속받는 클래스를 서브클래스 혹은 자식 클래스라고 한다.
Dog 클래스는 bark()만 정의했지만, 슈퍼 클래스인 Animal에서 정의된 breathing(), walk(), age 를 모두 사용할 수 있었다. Cat 클래스를 만들어 Animal을 extends 하면 Dog 클래스에서 가능했던 것처럼 Animal 클래스의 변수/메서드를 사용할 수 있다.class Animal{ // super class int age; double weight; double height; void breathing(){ /* ... */ } void walk(){ /* ... */ } } class Dog extends Animal { // sub class void bark(){ /* ... */ } } public class Example{ public static void main(String[] args){ Dog d = new Dog(); d.breathing(); d.walk(); d.age++; d.bark(); } }
- 다형성 (Polymorphism)
하나의 객체가 여러 가지 타입을 가질 수 있는 것.
Animal 변수 a는 Dog 객체를 가졌다. Dog 객체는 Animal에서 사용할 수 있는 모든 변수와 메서드를 사용할 수 있기 때문에 a.walk(); 코드가 성립한다.public class Example { public static void main(String[] args){ Animal a = new Dog(); a.walk(); Dog d = (Dog)a; d.bark(); } }
변수 a는 Dog 객체를 가졌으므로 Dog 객체가 필요한 모든 저장공간을 가지고 있다. 따라서 Dog d = (Dog)a; 처럼 형변환하여 Dog 변수에 저장할 수 있다.
장점
- 코드의 재사용성이 높아진다.
- 프로그램의 변경이 용이하기 때문에 유지보수가 쉽다.
- 코드가 직관적이다.
+ 강한 응집력: 프로그램의 한 요소(함수, 객체 등)가 특정 목적을 위해 밀접하게 연관됨
+ 약한 결합력: 한 요소가 다른 요소와 최소한의 의존성을 지님
단점
- 처리시간 및 사용 용량이 비교적 크다.
- 객체 별 속성과 행위를 정의해야 하기 때문에 프로그램 설계에 많은 시간이 걸린다.
문제
객체지향 5대 원칙인 SOLID에 대해 조사해오세요.
참조
객체 지향
# 객체 지향([[Object oriented]]) 프로그래밍이란?
www.incodom.kr
캡슐화 - 위키백과, 우리 모두의 백과사전
캡슐화(영어: encapsulation)는 객체 지향 프로그래밍에서 다음 2가지 측면이 있다:[1][2] 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고,[3][4] 실제 구현 내용 일부를 외부에 감추어 은닉
ko.wikipedia.org
추상화
Abstraction 추상화(2021-04-07)
www.ktword.co.kr
상속 (객체 지향 프로그래밍) - 위키백과, 우리 모두의 백과사전
객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수퍼클래스, 또는 부모 클래스 등의
ko.wikipedia.org
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
객체 지향 프로그래밍 - 위키백과, 우리 모두의 백과사전
객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러
ko.wikipedia.org
2020 시나공 정보처리기사 실기 - YES24
2020년 정보처리기사 NCS기반 전면 개편!『시나공 정보처리기사 실기』는 NCS 학습 모듈을 가이드 삼아 실무에서 방대하게 다뤄지는 내용들을 압축하여 최대한 쉽게 수록했다. 예제나 문제는 간단
www.yes24.com
OOP (Object Oriented Programming)
OOP의 개념과 사용하는 이유, 특징에 대해 정리한 글입니다.
velog.io
'개발 > 코딩스터디' 카테고리의 다른 글
[지코바] 3회차 주제 선정 (0) | 2021.08.27 |
---|---|
[JAVA 기초] 조건문 문제풀이 (0) | 2021.08.19 |
[지코바] 2회차 주제 선정 (0) | 2021.07.23 |
[자료구조] 연결 리스트 문제 풀이 (2021.07.22 실패) (0) | 2021.07.23 |
[자료구조] 해시 테이블 Hash Table (0) | 2021.07.02 |