본문 바로가기

백엔드 개발자 기록 일람/java 학습 기록

09. java 객체 지향

  자바는 객체 지향 언어이다. 객체 지향 언어의 핵심은 객체(object)이다. 객체를 사용하는 프로그래밍 방식을 객체 지향 프로그래밍(OOP: Object- Oriented Programming)이라고 한다. OOP는 우리가 사는 실세계와 비슷하게 소프트웨어도 작성해보자는 방법론이다. 실세계에는 사람, 자동차, 신호등, 텔레비전, 리모컨, 세탁기, 냉장고 등의 많은 객체가 존재한다. 예를 들어서 사물 인터넷이 완벽하게 구현된  미래의 도로를 생각해보자. 자동차, 보행자, 신호등 모두가 객체라고 색각할 수 있다. 자동차와  신호등은 서로 정보를 교환하여 어떤 작업을 할 수 있다. 초록불의 정보로 자동차가  나아가도 되는 타이밍을 알릴 수도 있고, 하나의 자동차가 다른 자동차에게 자신의 위치를 알릴 수 도 있다. 

객체들은 객체 나름대로의 기능을 수행하면서 다른 객체들과 상호 작용한다. 예를  들면, 사람이 초인종을 누른다고 생각해보자. 초인종을 누르면 그에 따른 벨이 울리며, 인터폰이 작동한다. 초인종과 인터폰은 모두 특정한 기능을 수행하는 객체라고 생각할 수 있고, 서로 신호를 통하여 상호 작용하고 있다. 소프트웨어 개발에서도 이와 같은 OOP라고 한다. OOP는 다양한 기능을 하는 소프트웨어 객체들을 조합하여 자기가 원하는 기능을 구현하는 기법이다.소프트웨어 객체들도 메세지를  주고받으며 작업을 수행한다.

 

객체

객체는 그 이름에서 볼수 있듯 객체 지향 기술의 핵심 개념이다. 객체는 상태와 동작을 가지고 있다. 객체의 상태(state)는 객체의 속성이다. 예를 들어 에어컨을 예시로 들면, 전원상태, 풍속, 바람 방향, 예약시간 등이 상태에 해당된다. 객체의 동장(Behavior)은 객체가 취할 수 있는 동작(기능,행동)이다. 객체의 상태와   동작은 소프트웨어에서는 각각 필드(field)와 메소드(method)로 표현할 수 있다. 객체 안의 변수를 필드, 객체안의 함수를 메소드라 부른다. 즉 객체는 필드와 메소드로 이루어진 소프트웨어의 묶음이라 할 수 있다.

 

 

객체 지향 프로그래밍

 

객체지향 프로그래밍은 데이터와 함수를 하나의 덩어리로 묶어서 생각하는 방법이다. 데이터와 함수를 하나의 덩어리(객체)로 묶는 것을 캡슐화(encapsulation)라고 부른다. 객체 지향 프로그래밍 방법은 오래 전에 등장하였지만 지금도 가장 각광 받고 있는 프로그래밍 기술이다. 객체 지향은 현실 세계를 시뮬레이션하는 언어였던 시뮬라(SIMULA)라는 언어에 기반을 두고 있다. 객체 지향 프로그래밍으로 동일한 프로그램을 작성한다면 여러가지 타입의 객체들을 만든 후에 객체끼리 메시지를 주고 받으면서 문제를 해결하게 된다.

 

 

객체 지향 프로그래밍의 요소

 

캡슐화

캡슐화란 데이터와 함수를 하나의 덩어리로 묶는 것을 의미한다. 객체가 바로 하나의 캡슐이다. 객체는 필드와 메소드를 가지는데, 필드는 데이터에 해당되고 메소드는 알고리즘에 해당된다. 캡슐화를 사용하는 데에는 2가지 목적이 있다. 하나는 서로 관련된 데이터와 알고리즘을 하나로 묶는 것 이다. 관련 있는 데이터와 알고리즘이 하나로 묶여있으면 사용하기가 매우 편리하다. 심플하게 가루약을 하나의 캡슐에 집어 넣은 이유 라고도 할 수 있다. 캡슐로 싸지 않으면 안의 내용물들이 흩어지게 되고, 여러가지 가루약을 한번에 먹어야 한다면 복용하는 것조차 힘들것이다. 자바는그레픽,  네트워크, 데이터베이스 등의 많은 기능들을 객체의 형태로 제공한다. 따라서 개발자들은 이들 객체를 이용하여 자신이 원하는 애플리케이션을 쉽게 제작할 수있다.

캡슐화의 두번째 목적은 객체를 캡슐로 싸서 객체의 내부를 보호하는 것이다. 외부의 환경에 따라 변이하는 것을 막는 캡슐 알약의 껍질의 일이기도 하다. 객체에서도 내부의 구현 내용을 보호하는 것이 필요하다.

 

상속

상속이란 이미 작성된   클래스(부모 클래스)를이어받아서 새로운 클래스(자식 클래스)를생성하는 것이다. 부모 클래스를 이용하여 공통적인 속성과  동작을 정의한다. 자식 클래스는 부모 클래스의 모든 속성과  동작을 물려받는다. 이때 부모 클래스의 코드 중에서 자신의 문제에 맞지 않는 코드가 있을 수 있다. 이런 경우에 다른 사람의 클래스를 상속받아서  자신이 필요한  부분을 변경하여 사용할 수 있다. 상속도 기존의 코드를  재이용하는 기법이다.

 

다형성

다형성이란, 동일한 이름의 동작이라고 하여도 객체의 실제 타입에 따라서 동작의 내용이 달라 질 수 있다는 것을 의미한다. 예를 들어 speak()라는메소드를 호출하면 객체가 소리를 낸다고 가정하자. sprak() 메소드 호출을 받은 객체는 자신의 실제 타입에 따라서 서로 다른 소리를낼 수 있다. 즉 사람이라면 "으악" 로봇이라면 "끄앙" 고양이라면 "냐옹" 개라면 "멍멍"  이라 소리낸다. 다형성을 사용하게 되면 개념적으로  동일한 작업을 하는 메소드에 같은   이름을 부여할 수 있으므로 코드가 더 간단해  진다.

 

추상화

추상화(abstraction)는 불필요한 정보를 숨기고 중요한 정보만을 표현함으로써 프로그래을 간략하게 만드는 기법이다.추상화는 복잡성을 관리하는데 사용된다. 추상화를 사용하지 않으면 객체들이 너무 복잡해 진다. 추상화는 개발자마다 달라진다. 객체에 대하여 보는방향이 모두가 다르기 때문이다...