on
객체 지향 언어
객체 지향 언어
728x90
객체 지향 언어 프로그래밍에서는 생소한 단어들이 많이 나올 예정이다.
객체 지향 프로그래밍이라는 것은 객체를 만들고 조립하여 시스템을 만드는 것이다.
프로그램, 즉 카메라라는 물건을 만들게 되면 한덩어이르이 장치가 아닌 카메라, 디스플레이, 연산처리등 여러가지 부품들이 필요하다는 사실을 할 수있다. 하나의 어플리케이션을 만드는 것도 마찬가지로 여러개의 부품을 만들어서 조립한다고 할 수 있다.
개별 부품들은 객체라고 부른다. 객체를 가르키는 말로 컴포넌트 , 모듈이라는 단어가 있다.
용어를 떠나서 객체를 여러가지로 모아서 소프트 웨어를 만드는데 이렇게 만든 객체를 합치기 위해서는 설계도가 필요하다. 그 설계도의 이름은 클래스라고 한다.
설계도를 만들고, 메모리안에 만들어 놓은 것을 객체라고 하며, 메모리내에 생성하게 만드는 것 -->인스턴스 화라고 한다.
객체지향프로그래밍 언어의 주요 장점
객체간의 서로의 관계는 의존, 집합, 상속등이 있다.
개체지향프로그래밍의 경우 코드의 재사용성이 높다. -->새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성할 수 있다. (상속)
마우스가 고장이 난 경우 --> 새로운 마우스를 꽂으면 됨. 그것처럼 상속이 되는 부분을 다시 연결하면 된다. 코드의 관리가 용이하다는 뜻으로 유지보수가 쉽다는 의미이다. 그와 같이 코드간의 관계를 이용해서 적은 노력으로 쉽게코드를 변경 할 수 있다.
마우스가 고장이 난 경우 --> 새로운 마우스를 꽂으면 됨. 그것처럼 상속이 되는 부분을 다시 연결하면 된다. 코드의 관리가 용이하다는 뜻으로 유지보수가 쉽다는 의미이다. 그와 같이 코드간의 관계를 이용해서 적은 노력으로 쉽게코드를 변경 할 수 있다. 마우스가 용접이 되어있으면 서로 간의 관계가 타이트 하기 때문에 마우스가 고장나면 수리가 어렵다는 단점이 있다 ( 유지보수의 어려움) , 객체간의 결합도가 높다는 말이다.
에어팟을 에어팟프로로 교체가 가능한 것처럼 교체가 쉬운데 ---->이처럼 객체 관계는 결합도가 낮게, 응집력이 높도록 만들어야한다.
신뢰성이 높은 프로그래밍을 가능하게 한다. 접근제어자와 메소드를 이용하기 때문에 객체 상태를 사용자나 누구든지 임의로 변경하는 것을 막아준다. 이를 캡슐화와 은닉화라고 하는데, 데이터의 변경이 자주있게 되면 프로그래밍이 신뢰성이 높지않다고 말할 수 있다.
객체의 내부상태는 임의로 변경이 불가능하며, 유효한 값인지 체크를 하는 기능을 이용해야한다.
코드의 중복을 제거하고(중복제거 ) 코드의 불일치로 인한 오작동을 방지할 수 있다. (리펙토링)
근래의 프로그래밍언어의 방식은 이를 따라서 만들어진다고 볼 수 있다. java, c++, python --> 구현방식은 다르지만 기본적인 개념은 유사하다.
객체지향 프로그래밍의 주요 특징으로는 총 세 가지가 있다.
캡슐화 (Encapsulation) 객체의 실제 구현내용을 감추는 것이다.
다른 객체는 객체의 내부구조를 알 수 없고, 공개된 속성과 기능만을 이용할 수 있다.
잘못된 사용으로 인한 객체의 손상을 방지한다.
자바는 접근제한자를 사용해서 공개 할 것인지, 숨길 것인지 결정할 수 있다.
EX) 자동차 객체에 대해서 생각을 하자면, 자동차의 경우 다양한 기능이 있다. 엔진 경우 높은 속도 까지 올라갈 수 있으며, 여러기능이 있지만 운전자에게는 노출시키지 않는다. 이유는 엔진을 연속해서 최대로 높일경우 엔진이 폭팔되거나,잘못된 사용으로 객체의 손상이 가는 것을 방지하기 위해 공개된 속성만 사용하도록 임의로 정해놓은 것이다. 상속(Inheritance) 새로운 객체를 만들 때 상위 클래스에서 구현한 것을 하위 클래스에서 사용하고, 하위클래스의 경우 스스로에 대한 것만 구현하는 것을 말한다.
상위클래스를 재사용하기 때문에 하위 클래스를 빠르게 개발할 수 있다.
상위클래스를 상속받아서 다양한 프로그램의 요구에 대응할 수 있는 하위 클래스를 개발할 수 있다.
상위클래스와 하위 클래스는 종속 관계를 형성함으로써 클래스들을 조직화 할 수 있다. 다형성(Polymorphism) = 추상화라고 불린다.
같은 종류의 객체를 사용하는데 , 실행결과가 다르게 발휘되는 것을 의미한다.
같은 종류의 사용방법을 사용하지만, 실제로 사용하는 객체가 바뀌면 실행결과가 다르게 나타날 수 있는 것을 의미한다.
Ex) 컴퓨터에서 인쇄라는 출력기능을 사용을 하는데 --> 프린터기가 흑백인지 컬러인지에 따라서 출력물이 다르게 나타날 수 있다는 것이다.
Ex) 스마트폰의 노래듣기 : 스마트폰의 음악듣기 버튼을 누르지만, 이어폰 객체를 사용하면 나만들을 수 있고, 스피커 객체를 사용하면 같은 공간의 모든사람들이 노래를 듣는 것이다.
객체
물리적으로 존재하거나 추상적으로 생각할 수 있는 것이며, 다른 것과 식별이 가능한 것이다.
물리적으로 존재하거나 추상적으로 생각하는 것이 프로그래밍의 대상이다.
물리적으로 존재하는 것은 -- 자동차, TV, 책, 상품등을 말할 수 있다.
추상적으로 존재하는 것은 -- 개설과정, 계좌 , 주문 등을 말할 수 있다.
객체는 자신의 고유한 속성(값)과 기능을 가지고 있다. 자신의 고유한 속성의 경우 다른 객체와 구별할 수 있는 객체가 가지고 있는 정보를 의미한다. 기능이란 실제로 행동할 수 있는 것을 의미한다 예를 들면 자동차의 경우 고유한 속성의 경우 제조사, 모델명, 가격, 최고속도 등 다른 자동차와 구분이 가능한 것을 의미한다. 기능의 경우 고유기능인 부분으로 출발기능, 정지기능, 운정기능을 의미한다. 주문의 경우 속성의 경우는 주문번호, 고객명, 날짜를 의미하고 기능의 경우 조회, 취소, 반품하기를 말할 수 있다.
즉 속성의 경우는 다른 객체와 확연히 구분될 수 있는 부분을 의미하고 , 기능의 경우는 실제로 할 수 있는 부분을 의미한다. 공통적으로 갖고 있는 속성을 이야기 할 수 있다.
현실세계에서 사람의 속성은 이름, 나이이며, 동작의 경우는 웃다. 먹다. -->이를 객체로 분석해서 도출(소프트웨어 객체 모델링) 한다면, 사람의 속성의 경우 필드라고 하며, 동작하는 부분은 메소드라고 한다.
즉, 속성 (값) = 필드, 기능 (행위) = 메소드
현실의 정의하려는 것이 프로그램의 대상이기 때문에 현실의 객체를 소프트웨어의 객체로 모델링하는 것이다.
객체는 클래스(설계도)로 메모리내에 실제로 만들어지는 것을 인스턴스 화라고 한다. 객체는 인스턴스라고 하며, 메모리에 실제로 생성하는 것은 인스턴스 화라고 한다.
객체 간의 관계
사용관계의 경우 의존관계이다. 객체간의 사용작용을 의미하며, 객체가 다른 객체의 메소드를 호출해서 원하는 작업을 수행하는 것을 의미한다. 운전기사가 자동차가 없으면 일을 못하는 것처럼 상속관계를 의미한다.
상속관계란 상위객체를 기반으로 하위객체를 생성하는 관계이다. 조상관계라고도 한다. 상위객체는 기계라는 폭 넓은 의미로 조상의 형태이거 , 자동차객체는 구체적인 사물에 해당된다. 핸드폰으로 비교할 경우 스마트폰이 조상객체이고 iphone7이 하위객체를 의미한다.
집합관계, 포함관계란 객체가 다른 객체의 부품으로 사용되는 관계를 의미한다.
클래스
객체는 설계도를 바탕으로 만들어진다.
자바의 객체에 대한 설계도는 클래스라고 한다.
클래스는 객체생성을 위한 필드와 메소드로 구성이 된다. 필드의 경우 객체의 속성을 의미하고 메소드의 경우 객체의 기능을 의미한다.
객체는 인스턴스라고 불리며 객체를 생성하는 과정을 인스턴스화라고 한다.
객체지향프로그래밍 개발단계
1. 클래스를 설계한다.
2. 클래스로 객체를 생성한다.(필드, 메소드를 만든다. )
3. 생성된 객체의 속성과 기능을 이용한다.
하나의 클래스로 여러개의 객체를 만들 수 있다.
똑같은 핸드폰 객체지만, 본인의 폰인 것을 구별하는 방법이 --> 색상, 케이스, 바탕화면이 다른 부분이 있을 텐데, 그와 동일하게 동일한 성격을 가진 객체가 여러가지지만 객체의 필드(속성)과 상태를 통해서 다르다는 사실을 알 수 있다는 것이다. 동일한 폰이지만 속성이 '다름' -->어플 , 상태, 바탕화면, -->그래서 구별이 가능하다는 것이다.
하나의 설계에 따라서 여러개의 객체를 만들 수 있다. ->속성에 따라 구별
public class 클래스 이름{
} 으로 클래스를 작성할 수 있다. class Car , class Book , class Order ---> 이와 같이 물리적이고 추상적으로 표현이 가능하다.
Car라는 class를 사용하면 클래스로 표현할 수 있는 항목은 제조회사, 가격, 옵션을 표현할 수 있다.
Book이라는 class를 사용하면 프로그램의 대상은 책표면 객체, 책, 저자, 절판여부 , 줄거리를 표현할 수 있다 .
Order이라는 class를 사용하면 표현할 수 있는 항목은 주문일자, 주문상태, 주문현황을 표현할 수 있다.
설계도는 제품을 만들어야 사용이 가능하다.
객체를 만들기 위한 명세서를 가지고 객체를 생성해야하는데 new연산자를 이용하여 객체 생성이 가능하다. new 클래스명();
new연산자를 사용하면 클래스를 메모리에 로딩을 하고, 객체가 생성되며 만들어진다. 객체는 메모리의 Heap 영역에 만들어진다. new연산자는 메모리의 힙영역에 객체를 생성한 후, 메모리내에서 객체의 위치를 알 수 있도록 객체의 주소값(메모리에서 객체가 위치하고 있는 주소를 반환한다.
new 연산자의 역활은 클래스로부터 객체를 생성할 수 있다. 객체의 주소값을 반환한다.
new연산자가 반환하는 주소값을 저장하기 위한 참조변수가 필요하다.
변수 생성하기
저장할 값을 우선적으로 생각해야한다.
//정수 10을 저장하는 변수 생성하기 int a; a = 10;
//실수 3.14를 저장하는 변수 생성하기 double a; a = 3.14;
//고객이름 "홍길동"을 저장하는 변수 생성하기
String a; a = "홍길동";
//Book 객체의 주소값을 저장하는 변수생성하기 Book a = new Book(); Book이라는 클래스로 생성된 객체의 주소값을 담을 참조 변수 a로 반환한다.
//Car 객체의 주소값을 저장하는 변수 생성하기 Car a = new Car(); Car이라는 클래스로 생성된 객체의 주소값을 담을 참조변수 a로 반환한다.
// Order객체의 주소값을 저장하는 변수를 생성하기 Order a = new Order(); Order이라는 클래스로 생성된 객체의 주소값을 담을 참조변수 a로 반환한다..
new연산자를 이용하여, 클래스로부터 객체를 생성하고, 객체의 주소값을 참조변수로 반환한다.
이런식으로 메모리 heap내에 생성이 된다.
이런식으로 메모리 heap내에 생성이 된다. 참조변수의 경우 주소값을 갖는다. 그리고 각각 주소값이 변수내에 저장이된다.
객체 영역에 참조 주소값이 부여가 되는 것은 new라는 연산자가 쓰였을때 그리고 참조변수를 쓰는 순간 변수영역에 작성된다. Car a; 이렇게 쓴다고 생기는 것이아니다.
객체의 주소값을 저장하는 변수 타입에 맞는 변수를 적어주어야 하는데, Product a = new Car(); 이런 식의 호출은 안되는 것이다. 변수타입에 맞는 변수를 작성해주어야한다.
무조건 생성하는 변수와 주소값이 같은 객체 타입이여야 저장된다. (담긴다.)
타 프로그래밍 언어는 변수가 생성될 때 그때 var a = new number();이런식으로 담을 수 있지만, 자바의 경우 타입이 미리 결정되어야한다.
생성된 객체의 속성과 기능 이용하기
참조변수가 참조하는 객체는 그 객체와 속성과 기능을 사용할 수 있다.
참조변수가 참조하지 않는 객체는 사용할 수 없다.
생성된 객체의 속성과 기능을 사용하기 위해서는 반드시 참조변수에 객체의 주소값을 저장해두어야 한다.
class order의 경우 명칭이 호출되는 순간 JVM내에 설계도를 메모리에 로딩한다.
Car myCar = new Car(); Car yourCar = new Car();처럼 동일한 설계도로 각각 객체생성이 가능하다. 서로 다른 객체의 형태를 가지고 있다. 사용하게 될 때에는 main메소드에서는 myCar(); yourCar();처럼 호출을 해주어야한다.
참조변수를 통해서 간접적으로 속성값과 기능실행이 가능하다.
728x90
from http://lionpower.tistory.com/145 by ccl(A) rewrite - 2021-09-06 19:00:57